Skip to main content

Buy crypto with PIX (onramp)

The workflows described so far move crypto into local currency. This one runs the other way: your user pays a PIX in Brazilian Reais and receives stablecoin at a wallet address you supply.

The shape is the mirror of a payout — Quote, Accept, Pay — but the legs swap. Instead of giving your user an address to send crypto to, Abroad gives you a PIX BR Code for them to pay, and delivers the crypto once it settles.

Lifecycle​

  1. Create an onramp quote: you state the BRL amount your user will pay. Abroad returns how much stablecoin they receive.
  2. Accept the transaction: you pass the quote and the destination wallet. Abroad returns a copy-paste BR Code.
  3. Your user pays the PIX from any Brazilian bank.
  4. Abroad delivers the crypto to the destination wallet and reports the on-chain hash.

1. Create an onramp quote (POST /quote/onramp)​

curl -X POST https://api.abroad.finance/quote/onramp \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fiat_amount": 500,
"target_currency": "BRL",
"crypto_currency": "USDC",
"network": "CELO",
"payment_method": "PIX"
}'
FieldMeaning
fiat_amountThe BRL your user pays.
crypto_currency / networkThe asset and chain they receive it on.
payment_methodPIX.

The response has the same shape as a payout quote, but value is the crypto amount your user receives:

{
"quote_id": "0a1b2c3d-...",
"value": 91.482,
"expiration_time": 1754400000000,
"fee": { "amount": "0.914", "currency": "USDC", "type": "combined" }
}

The fee is expressed in the crypto leg — it is the difference between what the raw desk rate would have delivered and what your user actually receives.

2. Accept the transaction (POST /transaction)​

Pass destination_address instead of account_number:

curl -X POST https://api.abroad.finance/transaction \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"quote_id": "0a1b2c3d-...",
"user_id": "your-user-42",
"destination_address": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
}'

The response carries payment_instructions:

{
"id": "9f8e7d6c-...",
"kycRequired": false,
"payment_instructions": {
"br_code": "00020126580014BR.GOV.BCB.PIX...",
"expires_at": 1754403600000
},
"transaction_reference": null
}

Render br_code as a QR or offer it as copy-paste. transaction_reference is null on an onramp — there is no memo for your user to include, because they are paying a PIX rather than sending crypto.

The destination address is validated up front​

Abroad checks the address against the selected network before returning a BR Code, so a malformed or wrong-chain address fails at acceptance rather than after your user has already paid. A Celo address must pass its EIP-55 checksum; a Solana address must be a valid on-curve public key; a Stellar address must be a classic G... account.

3. Your user pays​

Nothing to call. Abroad detects the settled PIX and starts the delivery.

4. Delivery​

Abroad sends the crypto and moves the transaction to PAYMENT_COMPLETED, with the delivery hash in on_chain_tx_hash. You are notified by the same transaction.updated webhook a payout uses — the event contract is identical in both directions.

Anyone can pay, and the crypto goes to the wallet you name​

The BR Code can be paid from any Brazilian account — the payer does not have to be the person receiving the crypto. Once the PIX settles, Abroad delivers to the destination_address you supplied, whoever funded it.

tax_id is optional. When you send one it is stored on the transaction and returned on reads; it is not matched against the payer and does not gate delivery. The CPF that actually paid is recorded separately from the deposit for your reconciliation.

Failure and refunds​

If the crypto cannot be delivered — for example the destination becomes unusable — the BRL is returned by PIX to the account that paid it. Abroad never refunds to an address supplied in the request, only to the original payer.

Supported corridors​

You payThey receiveNetworks
BRL via PIXUSDCStellar, Solana, Celo

Corridors are enabled individually. A corridor that is not configured returns corridor_unavailable from the quote endpoint.

Differences from a payout, at a glance​

Payout (crypto → fiat)Onramp (fiat → crypto)
Quote endpointPOST /quotePOST /quote/onramp
You stateThe fiat they receiveThe fiat they pay
value in the responseCrypto they sendCrypto they receive
Destination fieldaccount_numberdestination_address
FundingUser sends crypto with a memoUser pays a BR Code
transaction_referenceThe memo to includeNull
on_chain_tx_hashTheir inbound depositOur outbound delivery