The build plan for a US-to-LatAm remittance app on stablecoin rails: fund the send, quote the receive amount, pay out over Pix or SPEI, and meet Reg E.
A remittance app on an on/off-ramp API has four moving parts: the sender funds in dollars, a binding quote converts that into the recipient's local amount, a payout lands in the recipient's bank over Pix, SPEI, or another local rail, and your app adds the disclosures US consumer law requires. You own the sender.
The cost case for stablecoin remittances is covered in the five-part cost check. This page is the build: which API calls, in what order, and which obligations sit with you rather than the provider. How ramp providers get paid for each leg is in how on/off-ramp providers make money.
Key takeaways
Three layers. Your app holds the sender relationship: sign-up, the amount screen, disclosures, receipts, and support. The ramp API holds the money movement: KYC records, payins, conversion, and payouts. Webhooks connect them, so your app updates the transfer status without polling.
| Step | Your app | The ramp API |
|---|---|---|
| Onboard the sender | Collects identity data, shows terms | Runs KYC, returns kyc_status |
| Add the recipient | Collects bank details (Pix key, CLABE, CBU) | Validates and stores the bank account |
| Fund | Shows deposit instructions or a connect button | Creates the payin, converts to stablecoin |
| Quote | Shows send amount, rate, fees, receive amount, expiry | Returns a binding payout quote |
| Pay out | Shows the receipt with a delivery date | Executes the payout on the local rail |
| Track | Notifies the sender | Fires payout webhooks with each status |
The split matters for compliance too. Your app can't hand KYC to the provider and forget about it, and the provider can't write your Reg E disclosures. Who owns what in on-ramp compliance goes deeper on the line.
With a payin that turns dollars into stablecoins in a wallet the transfer can draw from. BlindPay's payment methods reference lists three ways US dollars come in:
memo_code from the payin, so the deposit gets matched (payin quotes).The funding wallet is a product decision. A customer-controlled blockchain wallet keeps the payout flow non-custodial: BlindPay operates as a non-custodial payment processor for payout flows from customer-controlled wallets, where you authorize the exact amount and BlindPay executes that single transaction. A BlindPay-managed wallet (beta) is simpler to run and is custodial when you choose that path.
Create a payout quote against the recipient's bank account the moment the sender reaches the confirm screen, not while they type. The quote returns sender_amount, receiver_amount, commercial_quotation, blindpay_quotation, the fee lines, and expires_at in epoch milliseconds (payout quotes).
Two fields decide what the sender sees:
currency_type. sender fixes the stablecoin amount and returns the local amount. receiver fixes the local amount, which fits a sender who promised exactly R$ 2,000 to family.cover_fees. true adds fees on top of the stablecoin sent, so the recipient gets the full amount. false deducts them from what the recipient receives.Illustrative example. A sender in Texas wants to send $500 to a Pix key in Brazil. The app requests a quote with currency_type: sender and cover_fees: false:
| Line on the screen | Value |
|---|---|
| You send | 500.00 USDC, from the balance an earlier ACH deposit funded |
| Exchange rate after fee | 5.38 BRL per USDC |
| Transfer fee | Shown from the quote's fee lines |
| They receive | 500 x 5.38 = R$ 2,690.00 |
| Quote valid until | 5 minutes from creation |
| Arrives | Minutes, over Pix |
If the sender walks away and returns after 5 minutes, the app requests a new quote and shows the new number. It never executes the old one. Partner fees on live quotes covers how to add your own margin as a visible line instead of hiding it in the rate.
Over the recipient country's own rail. BlindPay's cut-off times list Pix at up to 5 minutes, running 24/7, and SPEI at up to 10 minutes. Transfers 3.0 in Argentina settles in up to 10 minutes, and ACH Colombia takes about 1 business day.
Recipient details are where remittances fail most. Validate the Pix key or CLABE before the first transfer, and store the recipient as a saved bank account so the second transfer is one tap. Pix keys, CPF, and CLABE lists the fields per country.
If a payout can't 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. Your app should turn that status into a plain message and a retry button.
More than most teams expect. Three layers apply.
Customer visibility. BlindPay's nested payments policy says you may not move payments for any party whose identity or activity BlindPay can't see. A remittance app that pools every sender's money into one company account is the textbook case. Onboard each sender as a customer in your instance instead. Money services are a high-risk category that is allowed with disclosure and enhanced due diligence, per BlindPay's prohibited and high-risk activities list.
Consumer remittance rules. The CFPB's Regulation E subpart B, "Requirements for Remittance Transfers," runs from 12 CFR 1005.30 to 1005.36: definitions, disclosures, estimates, error resolution, cancellation and refund, acts of agents, and scheduled transfers. The provider owes a pre-payment disclosure and a receipt. How to show a cross-border quote maps each required field to the quote.
Cancellation timing. Under 12 CFR 1005.34, a sender can cancel if the request arrives "no later than 30 minutes after the sender makes payment," but only if the funds "have not been picked up by the designated recipient or deposited into an account of the designated recipient." With a Pix payout that lands in minutes, that window can close fast. Decide your execution timing with counsel before launch.
Treat every webhook as a sender notification waiting to happen. Map each payout status to one line of copy: processing, completed, failed, or refunded. Show the delivery date on the receipt, and keep the quote ID, the rate, and the receive amount on the transfer record so support can answer "why did my mother get R$ 2,690 and not R$ 2,700?" in one look.
Test the unhappy paths before launch. On a development instance, a payout request_amount of 66600 fails and 77700 is refunded, so you can rehearse both screens without real money.
Create a development instance, onboard one test sender, add one Pix recipient, and run the full loop: payin, quote, payout, webhook. The payout quotes reference has every field your confirm screen needs.
Seven places blockchain payments beat bank rails: contractor payroll, remittances, B2B suppliers, marketplaces, 24/7 treasury, bill pay, and PSP payouts.
Push means the payer sends an ACH transfer. Pull means you debit a connected account. How each funds a USD to USDC on-ramp, the fees, and the return risk.
AP2, ACP, and x402 each verify that an AI agent had permission to spend. Here is what every protocol covers, who backs it, and the reconciliation gap none of them close.