Guide: BRL to USD Transfers
Move funds from Brazil to the US by chaining a BRL/PIX on-ramp through USDC to a USD wire off-ramp.
Who this guide is for
This guide is for integrators building cross-border payment flows from Brazil to the United States. If your product needs to accept BRL from a Brazilian sender and deliver USD to a US bank account, this is the playbook.
Typical use cases:
- Remittance platforms — Brazilian users sending money to US-based recipients.
- B2B payouts — Companies paying US suppliers or contractors from BRL revenue.
- Treasury operations — Moving funds from a Brazilian entity to a US account.
You should already be familiar with the Transfers API and have completed at least one on-ramp or off-ramp transfer. If not, start with the Transfers Overview.
How it works
SpherePay does not yet offer a single-call BRL → USD transfer. Today, you chain two transfers with USDC as the bridge currency:
- On-ramp — BRL enters via PIX and converts to USDC.
- Off-ramp — USDC converts to USD and exits via wire.
The two transfers are independent API calls. You are responsible for orchestrating the sequence — creating the off-ramp once the on-ramp succeeds and USDC is in the wallet.
What you handle vs. what SpherePay handles
| Responsibility | Owner |
|---|---|
| Creating the customer, bank accounts, and wallet | You (integrator) |
| Initiating the BRL → USDC on-ramp transfer | You |
| PIX payment collection and BRL → USDC conversion | SpherePay |
| Monitoring on-ramp status and triggering the off-ramp | You |
| Initiating the USDC → USD off-ramp transfer | You |
| USDC → USD conversion and wire delivery | SpherePay |
| Handling failures or partial completions on either leg | You |
You orchestrate, SpherePay converts
SpherePay handles the currency conversion and settlement on each leg. Your integration is responsible for sequencing the two transfers and reacting to status changes.
Prerequisites
Before starting, ensure you have:
- A verified customer with an approved BRL verification profile. BRL transfers require a separate verification — contact your SpherePay representative if you don't have access yet. See Customers.
- A PIX bank account registered for the Brazilian sender (
currency: brl,network: pix). See Bank Accounts — BRL. - A USD bank account registered for the US recipient (
currency: usd,network: wire). See Bank Accounts — USD. - A wallet on a BRL-compatible network (Polygon, Ethereum, or Base for USDC). See Wallets.
Step-by-step walkthrough
Step 1 — Create the BRL → USDC on-ramp
Send BRL via PIX into USDC on the customer's wallet.
POSThttps://api.spherepay.co/v2/transfer
{
"amount": "5000.00",
"customer": "{{customer_id}}",
"source": {
"type": "bank_account",
"id": "{{brl_bank_account_id}}",
"currency": "brl",
"network": "pix"
},
"destination": {
"type": "wallet",
"id": "{{wallet_id}}",
"currency": "usdc",
"network": "polygon"
},
"integratorBpsFeeRate": "50"
}BRL transfer constraints apply
BRL transfers are capped at $7,500 per transfer, require integratorBpsFeeRate (fixed fees are not allowed), and Solana is not supported. See BRL/PIX transfer constraints for the full list.
Step 2 — Wait for the on-ramp to succeed
Poll the transfer until it reaches succeeded:
https://api.spherepay.co/v2/transfer/{{onramp_transfer_id}}
The on-ramp is complete when the transfer status is succeeded and USDC has been delivered to the wallet. Do not create the off-ramp transfer until this happens.
Step 3 — Create the USDC → USD off-ramp
Once USDC is in the wallet, move it out to USD via wire.
POSThttps://api.spherepay.co/v2/transfer
{
"amount": "{{usdc_amount_received}}",
"customer": "{{customer_id}}",
"source": {
"type": "wallet",
"id": "{{wallet_id}}",
"currency": "usdc",
"network": "polygon"
},
"destination": {
"type": "bank_account",
"id": "{{usd_bank_account_id}}",
"currency": "usd",
"network": "wire"
}
}Use the actual USDC amount received
The USDC amount from the on-ramp may differ from the original BRL amount due to the exchange rate and fees. Use the actual USDC balance delivered to the wallet, not a hard-coded value.
Step 4 — Wait for the off-ramp to succeed
Poll the off-ramp transfer until it reaches succeeded:
https://api.spherepay.co/v2/transfer/{{offramp_transfer_id}}
When this transfer succeeds, USD has been wired to the recipient's US bank account. The full BRL → USD flow is complete.
Error handling
Because this is a two-transfer flow, failures on either leg need distinct handling:
| Scenario | What happens | What to do |
|---|---|---|
| On-ramp fails | BRL is returned via PIX. No USDC is minted. | Retry the on-ramp or surface the failure to your user. No off-ramp cleanup needed. |
| On-ramp succeeds, off-ramp fails | USDC sits in the wallet. No USD is sent. | Retry the off-ramp. The USDC is still in the wallet and can be retried without a new on-ramp. |
| On-ramp succeeds, off-ramp not created | USDC sits in the wallet indefinitely. | Your orchestration layer must ensure the off-ramp is always created after a successful on-ramp. |
Looking ahead — single-call BRL → USD
Today this flow requires two API calls and your own orchestration logic. SpherePay is working toward a single-call cross-currency transfer that abstracts the intermediate stablecoin hop — you would send one request with BRL as the source currency and USD as the destination currency, and SpherePay would handle the routing internally.
When that API is available, the two-transfer pattern in this guide will still work, but you'll have the option to simplify your integration to a single call. This guide gives you a working integration today and a clear migration path to the simpler API when it ships.
Related
- Transfers API Guide — Full transfer creation and tracking reference
- BRL/PIX transfer constraints — Limits, supported networks, and fee rules
- Bank Accounts — Registering PIX and USD bank accounts
- Transfer Lifecycle — Status definitions and state machine
- Supported Rails & Currencies — Full compatibility matrix
Last updated on