New: BRL/PIX transfers now supported  View changelog

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:

  1. On-ramp — BRL enters via PIX and converts to USDC.
  2. 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

ResponsibilityOwner
Creating the customer, bank accounts, and walletYou (integrator)
Initiating the BRL → USDC on-ramp transferYou
PIX payment collection and BRL → USDC conversionSpherePay
Monitoring on-ramp status and triggering the off-rampYou
Initiating the USDC → USD off-ramp transferYou
USDC → USD conversion and wire deliverySpherePay
Handling failures or partial completions on either legYou

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:

  1. 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.
  2. A PIX bank account registered for the Brazilian sender (currency: brl, network: pix). See Bank Accounts — BRL.
  3. A USD bank account registered for the US recipient (currency: usd, network: wire). See Bank Accounts — USD.
  4. 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.

POST https://api.spherepay.co/v2/transfer
On-ramp: BRL → USDC
{
  "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:

GET 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.

POST https://api.spherepay.co/v2/transfer
Off-ramp: USDC → USD
{
  "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:

GET 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:

ScenarioWhat happensWhat to do
On-ramp failsBRL 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 failsUSDC 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 createdUSDC 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.


Last updated on