Overview
Bridge virtual accounts are permanent, reusable fiat deposit addresses that convert incoming fiat into crypto and deliver it to your specified destination (e.g. a wallet address).
They support multiple currencies and provide customers with local deposit details like account numbers and routing codes. For example, a USD virtual account gives your customer a U.S. account and routing number for ACH or wire transfers.
Supported Payment Rails
- USD Virtual Accounts - U.S. bank account and routing numbers issued in your customer’s name.
- SEPA Virtual IBAN - Euro-denominated IBANs for accepting SEPA payments.
- MXN Virtual Accounts - CLABE account numbers for receiving SPEI (Mexico) payments.
- BRL Virtual Accounts - BR codes for receiving PIX payments.
Developers use virtual accounts to simplify global payments, custody stablecoins (e.g. USDB), and enable programmable flows. A common pattern: create a virtual account for a customer, route funds into a Bridge wallet, and earn yield.
Customers must be onboarded and KYC/KYB-approved before creating virtual accounts.
Creating virtual accounts
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 specify where Bridge should deliver the converted funds.
Bridge handles the fiat-to-crypto conversion and sends the funds on-chain automatically.
USD Virtual Account
SEPA Virtual IBAN
MXN Virtual Account
BRL Virtual Account
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": "ethereum",
"currency": "usdc",
"address": "0x3f5CE5FBFe3E9af3971dD833D26BA9b5C936f0bE"
},
# You can specifcy an optional developer fee to monetize on transactions.
"developer_fee_percent": "1.0" // 1%.
}'
{
"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": {
"currency": "usdc",
"payment_rail": "ethereum",
"address": "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be"
}
}
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 SEPA virtual IBAN.
"source": {
"currency": "eur",
},
# The destination object instructs Bridge where to send the EURO deposits to.
# Bridge will automatically handle converting and sending EURO to the crypto destination.
"destination": {
"payment_rail": "ethereum",
"currency": "usdc",
"address": "0x3f5CE5FBFe3E9af3971dD833D26BA9b5C936f0bE"
},
# You can specifcy an optional developer fee to monetize on transactions.
"developer_fee_percent": "1.0" // 1%.
}'
{
"id": "393c6358-4c19-4cb7-bbfa-d4a56be58309",
"status": "activated",
"developer_fee_percent": "1.0",
"customer_id": "23c2d200-4c00-4c5a-b31a-00d035d7e0ae",
"created_at": "2025-07-04T22:07:18.701Z",
"source_deposit_instructions": {
"currency": "eur",
"iban": "IE90MODR14035307970528",
"bic": "MODRIE00XXX",
"account_holder_name": "Bridge Building Sp.z.o.o.",
"bank_name": "Modulr Finance, Ireland Branch",
"bank_address": "Floor 6, 2 Grand Canal Square, Dublin, Ireland",
"payment_rail": "sepa",
"payment_rails": [
"sepa"
]
},
"destination": {
"currency": "usdc",
"payment_rail": "ethereum",
"address": "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be"
}
}
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 MXN virtual account.
"source": {
"currency": "mxn",
},
# The destination object instructs Bridge where to send the MXN deposits to.
# Bridge will automatically handle converting and sending MXN to the crypto destination.
"destination": {
"payment_rail": "ethereum",
"currency": "usdc",
"address": "0x3f5CE5FBFe3E9af3971dD833D26BA9b5C936f0bE"
},
# You can specifcy an optional developer fee to monetize on transactions.
"developer_fee_percent": "1.0" // 1%.
}'
{
"id": "35334433-dcee-48e8-bdc8-90171234ad00",
"status": "activated",
"developer_fee_percent": "1.0",
"customer_id": "23c2d200-4c00-4c5a-b31a-00d035d7e0ae",
"created_at": "2025-07-04T22:13:29.481Z",
"source_deposit_instructions": {
"currency": "mxn",
"clabe": "568980546701071234",
"account_holder_name": "Ada Lovelace",
"payment_rails": [
"spei"
]
},
"destination": {
"currency": "usdc",
"payment_rail": "ethereum",
"address": "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be"
}
}
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 '{
"source": {
"currency": "brl",
},
# The destination object instructs Bridge where to send the BRL deposits to.
# Bridge will automatically handle converting and sending USDC to the crypto destination.
"destination": {
"payment_rail": "ethereum",
"currency": "usdc",
"address": "0x3f5CE5FBFe3E9af3971dD833D26BA9b5C936f0bE"
},
# You can specify an optional developer fee to monetize transactions.
"developer_fee_percent": "1.0" // 1%.
}'
{
"id": "6e6ab621-6749-401f-b598-0c709c241696",
"status": "activated",
"developer_fee_percent": "0.0",
"customer_id": "eeafff4b-2dbe-41f2-9444-a6e228aee975",
"created_at": "2025-09-03T16:10:31.446Z",
"source_deposit_instructions": {
"currency": "brl",
"br_code": "00020126770014br.gov.bcb.pix01366e6ab621-6749-401f-b598-0c709c2416960215Edson_Arantes5204000053039865802BR5914Bridge_Example6009Sao_Paulo622905256beca3e77fdd489289aa1daeb630416E9",
"account_holder_name": "Edson Arantes do Nascimento",
"payment_rails": [
"pix"
]
},
"destination": {
"currency": "usdc",
"payment_rail": "ethereum",
"address": "0x3f5CE5FBFe3E9af3971dD833D26BA9b5C936f0bE"
}
}
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.
Optional Blockchain memo
For memo-based blockchains such as Stellar, you may include an optional blockchain_memo in the destination. Bridge will attach the memo to payments sent to the destination address.
curl --location --request POST 'https://api.bridge.xyz/v0/customers/cust_alice/virtual_accounts' \
--header 'Content-Type: application/json' \
--header 'Api-Key: <Api-Key>' \
--header 'Idempotency-Key: <Unique Idempotency Key>' \
--data-raw '{
"source": {
"currency": "usd",
},
"destination": {
"payment_rail": "stellar",
"currency": "usdc",
"address": "STELLARADDRESS",
"blockchain_memo": "STELLARBLOCKCHAINMEMO"
}
}'
Amounts
amount- For transaction-related events in the destination currency (payment_processed, payment_submitted), this amount is the final total amount of funds sent to the destination. For all other events, which use the source currency, this is the initial amount received from the source.
subtotal_amount- The amount of funds received from the source minus any fiat fees: developer fee and exchange fee. This is always in the source currency.
Refer here on minimum amounts for transactions.
Developer Fees
Refer Developer Fees.
Other Fees
exchange_fee_amount- The fee for exchanging one currency to another, in the source currency. This may be 0.
gas_fee- The fee for sending funds on chain, in the destination currency. This is usually 0 for most currencies and chains.