Manage your customer’s treasury funds with USDB – a Bridge-issued stablecoin backed 1:1 by US dollars. USDB earns treasury yield, and that yield is shared with you. Create a virtual account and wallet to custody treasury funds. Fiat deposits into the virtual account are converted to stablecoins and held in the customer’s wallet. Use the Transfers API to enable customers to pay vendors. Treasury Mgmt.png

Step 1: Generate your API Keys

Head over to dashboard.bridge.xyz. Once logged in, click on the “API Keys” tab on the top menu bar and generate a new API key. Bridge will make your API key available only once, so make sure to immediately copy and save the key safely and securely.

Your key is used to authenticate into our APIs and is highly sensitive. If it ever gets compromised, you can immediately revoke key access from our dashboard and generate a new key.

Step 2: Onboard a customer

Create a customer ID for each business. Customers will need to accept our terms of service and complete KYC. Check out this guide for a full in depth explanation on onboarding customers. The below example walks you through using a KYC link to onboard your customer.
Request
curl --location --request POST 'https://api.bridge.xyz/v0/kyc_links' \
--header 'Content-Type: application/json' \
--header 'Api-Key: <API Key>' \
--header 'Idempotency-Key: <generate a uuid>' \
--data-raw '{
  "full_name": "John Doe",
  "email": "johndoe@example.com",
  "type": "individual"
}'
Response
{
  "id": "uuid",
  "full_name": "John Doe",
  "email": "johndoe@example.com",
  "type": "individual", // or "business"
  "kyc_link": "https://bridge.withpersona.com/verify?",
  "tos_link": "https://dashboard.bridge.xyz/accept-terms-of-service?",
  "kyc_status": "not_started", // or "under_review", "incomplete", "approved" or "rejected"
  "rejection_reasons": [],
  "tos_status": "pending", // or "approved"
  "created_at": "2025-07-16T18:28:25.970Z",
  "customer_id": "customer_id",
  "persona_inquiry_type": "gov_id_db"
}
Guide the user through:
  1. Visiting the tos_link and accepting terms of service
  2. Completing identity verification via the kyc_link
This process typically takes less than a minute and updates automatically once complete.

Step 3: Create a wallet

Create a wallet for your customer to hold treasury funds in USDB. The below example explains how to create a Bridge wallet associated with a customer object.
Request
curl --request POST \
     --url https://api.bridge.xyz/v0/customers/<customer_id>/wallets \
     --header 'Api-Key: <API Key>' \
     --header 'Idempotency-Key: <Unique-Key>' \
     --header 'Content-Type: application/json' \
     --data-raw '{
       "chain": "solana"
     }'
Response
{
  "id": "wallet_123",
  "chain": "solana",
  "address": "4oG1sWkP8vcrnhbkzZc1m9RTT2VUjZHKx92qiVFK7FuZ",
  "created_at": "2025-07-15T18:00:00Z"
}
Use the bridge_wallet_id when referencing the wallet in other Bridge APIs.
Check out this guide for more information on using Bridge wallets.

Step 4: Create a virtual account

Create a USD or EUR account for the customer. Provide them with the bank instructions so they can receive payments. Deposits are converted to stablecoins and held in their wallet. Use the Virtual Accounts API to provision permanent fiat deposit addresses for your customers. You define the source currency for the account and configure the destination to be a Bridge wallet. Bridge handles the fiat-to-crypto conversion and sends the funds on-chain automatically.
Request
curl --location --request POST 'https://api.bridge.xyz/v0/customers/<customer_id>/virtual_accounts' \
--header 'Content-Type: application/json' \
--header 'Api-Key: <Api-Key>' \
--header 'Idempotency-Key: <Unique Idempotency Key>' \
--data-raw '{
  # The source object specifies a USD virtual account.
  "source": {
    "currency": "usd",
  },
  # The destination object instructs Bridge where to send the USD deposits to.
  # Bridge will automatically handle converting and sending USD to the crypto destination. 
  "destination": {
    "payment_rail": "solana",
    "currency": "usdb",
    "bridge_wallet_id": "wallet_123"
  },
  # You can specifcy an optional developer fee to monetize on transactions.
  "developer_fee_percent": "1.0" // 1%.
}'
Response
{
    "id": "1a400dae-f7fc-4f75-8105-212a14d4132d",
    "status": "activated",
    "developer_fee_percent": "1.0",
    "customer_id": "23c2d200-4c00-4c5a-b31a-00d035d7e0ae",
    "created_at": "2025-07-04T22:10:34.564Z",
    "source_deposit_instructions": {
        "currency": "usd",
        "bank_name": "Lead Bank",
        "bank_address": "1801 Main St., Kansas City, MO 64108",
        "bank_routing_number": "101019644",
        "bank_account_number": "215268120000",
        "bank_beneficiary_name": "Ada Lovelace",
        "bank_beneficiary_address": "923 Folsom Street, 302, San Francisco, California 941070000, US",
        "payment_rail": "ach_push",
        "payment_rails": [
            "ach_push",
            "wire"
        ]
    },
    "destination": {
        "payment_rail": "solana",
        "currency": "usdb",
        "bridge_wallet_id": "wallet_123"
    }
}

Sharing Deposit Instructions

Once a Virtual Account is created, use the source_deposit_instructions object in the response to share the fiat deposit details with your customer. Funds sent to those details will be automatically converted and delivered to the crypto destination you specified.

Step 5: Create an external account

Add and store a vendor’s bank account details to send payments from the customer. You can add external fiat accounts through our External account API using the following request.
Request
curl --location 'https://api.bridge.xyz/v0/customers/<customer-id>/external_accounts' \
--header 'Idempotency-Key: ea-7' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Api-Key: <api-key>' \
--data '{
  "currency": "usd",
  "account_type": "us",
  "bank_name": "Lead Bank",
  "account_name": "Ada Checking Account",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "account_owner_type": "individual", // specifies an individual account
  "account_owner_name": "Ada Lovelace",
  "account": {
    "routing_number": "101019644",
    "account_number": "215268129123",
    "checking_or_savings": "checking"
  },
  "address": {
    "street_line_1": "923 Folsom Street",
    "country": "USA",
    "state": "CA",
    "city": "San Francisco",
    "postal_code": "941070000"
  }
}'
Response
{
    "id": "external-account-123", // external account id
    "customer_id": "23c2d462-4c69-4c5a-b31a-88d035d7e8ae",
    "created_at": "2025-07-05T19:03:50.819Z",
    "updated_at": "2025-07-05T19:03:51.251Z",
    "bank_name": "Lead Bank",
    "account_name": "Ada Checking Account",
    "account_owner_name": "Ada Lovelace",
    "active": true,
    "currency": "usd",
    "account_owner_type": "individual",
    "account_type": "us",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "business_name": null,
    "account": {
        "last_4": "9123",
        "routing_number": "101019644",
        "checking_or_savings": "checking"
    },
    "beneficiary_address_valid": true,
    "last_4": "9123"
}

Step 6: Use the Transfers API

Use the Transfers API to move funds from the customer’s wallet to a vendor’s bank account. You will need to call the API for each payment.
Request
curl --location --request POST 'https://api.bridge.xyz/v0/transfers' \
--header 'Api-Key: <API Key>' \
--header 'Idempotency-Key: <Unique Idempotency Key>' \
--data-raw '{
  "amount": "10.0",
  "on_behalf_of": "<customer-id>",
  "developer_fee": "0.5",
  "source": {
     "payment_rail": "bridge_wallet",
     "currency": "usdb",
     "bridge_wallet_id": "wallet_123"
   },
  "destination": {
    "payment_rail": "ach",
    "currency": "usd",
    "external_account_id": "external-account-123"
  },
}'