USDC to Pix, from quote to settlement: a step-by-step guide

What happens between a USDC to BRL quote and reais landing over Pix: the locked quote, execution, the on-chain leg, review, and Pix delivery, step by step.

A USDC to Pix payout is five steps: quote, authorize, on-chain transfer, review, and Pix delivery. The quote locks the rate and every fee before any money moves. The on-chain leg confirms in seconds to a couple of minutes. Pix then delivers reais to the recipient's account instantly, any hour, any day.

This guide walks the path one step at a time, with the API field or webhook that tells you where a payout is.

Key facts

  • Quote: a BlindPay payout quote locks the exchange rate, the fees, and the exact BRL amount the recipient receives. It expires 5 minutes after creation (expires_at, epoch milliseconds).
  • Rail: Pix (pix) and PIX Safe (pix_safe) are instant and run 24/7. Pix payouts never wait for compliance documents.
  • Custody: BlindPay operates as a non-custodial payment processor for payout flows from customer-controlled wallets: you authorize the exact amount and BlindPay executes that single transaction. If a payout cannot be delivered after the stablecoins are collected, BlindPay refunds them to the quote's refund wallet, or to the sending wallet when none is set; on Pix and other non-USD local rails the refund is automatic, while USD payouts and payouts whose review times out are refunded after an operator review. Optional BlindPay-managed wallets (beta) are custodial when you choose that path.
  • Pricing: BlindPay combines a monthly plan (platform access) with per-transaction fees that vary by rail and network and are disclosed only in the live quote before execute. BlindPay does not publish a static flat rate card; always cite the quote's fee breakdown rather than a fixed bps number.

What are the steps from quote to settlement?

StepWhat happensWhat you read
1. QuoteRate, fees, and the BRL receive amount are locked against a Pix bank accountQuote id, expires_at, receiver_amount
2. Authorize and executeYou authorize the exact quoted amount and create the payoutPayout status: processing, payout.new webhook
3. On-chain transferUSDC moves from the funding wallet on the quoted networktracking_transaction
4. Review and conversionAutomatic screening runs; most payouts clear without a holdtracking_payment, payout.update if the status changes
5. Pix deliveryReais land in the recipient's account over Pixstatus: completed, payout.complete webhook

The full field reference is in the payouts docs, and the quote fields are in payout quotes.

What does the quote lock?

The quote is the only point where price is set. It is created against one approved Pix bank account and one network and token pair, and it returns:

  • commercial_quotation: the market exchange rate.
  • blindpay_quotation: the rate net of BlindPay's fee.
  • flat_fee and partner_fee_amount: the fixed and partner fees on this payout.
  • sender_amount and receiver_amount: what leaves the funding wallet and what the Pix account receives, in minor units.

cover_fees decides who pays. Leave it false and fees come out of the BRL the recipient gets. Set it true and fees are added on top of the USDC sent, so the recipient gets the full amount, which is the usual choice for payroll.

Because the fees are only fixed in the quote, this guide does not publish a rate card or a basis-point figure. To see the numbers for your volume, request a live quote on the USDC to BRL page or in the API, and see pricing for plans.

How long does each step take?

IntervalWhat to expect
Quote to executeYour choice, within the 5-minute quote window
Execute to on-chain confirmationSeconds to a couple of minutes, by network
Confirmation to Pix creditPix is instant and runs 24/7
Quote to settlement, end to endMinutes

Network choice changes the on-chain interval. On a production instance, USDC payouts run on Base, Polygon, Arbitrum, Ethereum, Stellar, and Solana. For every other rail, see stablecoin payout settlement times by country and rail.

Who holds the funds during the payout?

BlindPay operates as a non-custodial payment processor for payout flows from customer-controlled wallets: you authorize the exact amount and BlindPay executes that single transaction. If a payout cannot be delivered after the stablecoins are collected, BlindPay refunds them to the quote's refund wallet, or to the sending wallet when none is set; on Pix and other non-USD local rails the refund is automatic, while USD payouts and payouts whose review times out are refunded after an operator review. Optional BlindPay-managed wallets (beta) are custodial when you choose that path.

On EVM networks the authorization is explicit: the quote returns a contract payload, and you call approve on the token contract for the exact quoted amount before executing the payout. BlindPay collects the USDC before it sends any reais, so a failed delivery is a refund of USDC already collected. Set refund_wallet_address on the quote to choose where that refund goes.

What can go wrong between quote and settlement?

  • The quote expires. After 5 minutes the payout call is rejected. Request a new quote; the rate may have moved.
  • The Pix details are wrong. A bad key or closed account means the receiving bank rejects the transfer. BlindPay sends the USDC back automatically to the quote's refund_wallet_address, or to the sending wallet if you did not set one. The payout stays processing until the refund confirms on-chain, then ends refunded.
  • A review holds the payout. Screening matches or unusual activity can move a payout to on_hold. Treat it as pending, not as an error, and do not retry. A review that times out ends the payout failed, and the refund goes through support@blindpay.com.
  • The payout was funded on Stellar. Automatic refunds run on the EVM networks and Solana. On Stellar, a failed Pix transfer is resolved by support rather than refunded automatically.

How do you test the flow before going live?

A development instance runs the same API on testnets with the USDB test token and completes payouts on its own. Set the quote's request_amount to force an outcome:

request_amountPayout ends
66600 ($666.00)failed
77700 ($777.00)refunded
Any other amountcompleted

The testing section of the payouts docs has the details, and stablecoin API sandbox vs production covers what a sandbox cannot show you before launch.

Where to go next

FAQ