Buying stablecoins and selling them back happen at two prices. How bid, ask, and mid-market rates work, and how to calculate a round-trip cost.
On-ramp and off-ramp rates differ because a provider buys and sells at two prices. The ask, what you pay to get dollars or stablecoins, sits above the mid-market rate. The bid, what you get when you sell them, sits below it. Convert one way and straight back and you pay both gaps plus fees. That total is the round-trip cost.
People notice this the first time they on-ramp R$ 54,000, off-ramp it a minute later, and get back less. Nothing is broken. Two spreads and two sets of fees did exactly what they are built to do. Every term below is defined in the on/off-ramp liquidity glossary.
Key takeaways
The bid is the price a dealer pays to buy a currency from you. The ask is the price it charges to sell that currency to you. The mid-market rate sits halfway between them.
Wholesale markets publish both sides. Brazil's central bank releases a daily buy and sell PTAX dollar rate in its open data portal. On September 23, 2026, the buy rate was 5.14080 BRL per USD and the sell rate was 5.14140. That is a gap of 0.0006 reais, about 1.2 basis points around the midpoint.
That is the interbank end of the market, at size, between dealers. Any price you get through an app or an API sits wider, because the provider adds its own margin on each side. The ECB makes the same point about its euro reference rates: they are published for information purposes only, and using them for transactions is strongly discouraged.
Because it gets paid in the gap. A provider that fills conversions on demand has to hold inventory in both currencies, hedge the risk of holding it, move money over local rails, and run compliance on every customer.
Four costs end up in the spread:
What is a liquidity market explains where that inventory comes from.
The direction of the conversion decides the side. This table uses BRL per USD, the way Brazilian rates are usually quoted.
| Flow | You are | Rate you get | Compared with mid |
|---|---|---|---|
| On-ramp, BRL to USDC | Buying dollars with reais | Ask | More reais per USDC than mid |
| Off-ramp, USDC to BRL | Selling dollars for reais | Bid | Fewer reais per USDC than mid |
| On-ramp, USD to USDC | Moving dollars into a dollar stablecoin | No FX | Fee line only |
| Off-ramp, USDC to USD | Moving a dollar stablecoin into dollars | No FX | Fee line only |
The last two rows matter. USDC is designed to be redeemable 1:1 for US dollars, so dollars in and USDC out is not a currency exchange. The cost there is a fee, not a spread. Virtual account fees breaks those fees down.
Apply each leg's quoted rate and fees in order, then compare the end amount with the start.
Round-trip cost % = (1 - final amount / starting amount) x 100
Illustrative example. A company on-ramps R$ 54,000 into USDC and off-ramps it straight back. Mid-market is 5.40 BRL per USDC. Each leg carries a 0.5% margin, plus a small flat fee. All numbers are made up for the arithmetic, not BlindPay pricing.
| Step | Rate or fee | Running amount |
|---|---|---|
| Start | R$ 54,000.00 | |
| On-ramp at the ask | 5.427 BRL per USDC (mid + 0.5%) | 54,000 / 5.427 = 9,950.25 USDC |
| On-ramp flat fee | 10 USDC | 9,940.25 USDC |
| Off-ramp at the bid | 5.373 BRL per USDC (mid - 0.5%) | 9,940.25 x 5.373 = R$ 53,408.96 |
| Off-ramp flat fee | R$ 20 | R$ 53,388.96 |
| Round-trip cost | R$ 611.04, or 1.13% |
Two margins of 50 basis points each make about 100 basis points. The flat fees add the rest. On a real corridor the two margins may differ, which is why you measure both.
More often than you would guess. Three patterns show up again and again.
The fix is the same each time: use stablecoins for the leg that crosses a border, and keep same-currency flows in that currency. Where the exchange rate gets fixed shows which step of each flow sets the rate.
Both quote types show the margin directly. A payin quote returns commercial_quotation, the raw market rate, and blindpay_quotation, the rate including BlindPay's fee. A payout quote returns the same two fields, with blindpay_quotation net of the fee.
To measure one leg:
commercial_quotation and blindpay_quotation from the quote.commercial_quotation x 100.flat_fee, partner_fee_amount if your platform adds a markup, and billing_fee_amount if the fee is invoiced at month end.To measure the round trip, request a payin quote and a payout quote for the same corridor and amount at the same moment, and run the arithmetic from the table above. A quote from this morning and another from this afternoon measures market movement, not spread.
Instance owners and admins can also see the fee schedule per rail and per network, with payin and payout fees listed separately, through the billing fees endpoint. Live quote vs forward vs fixed rate covers what to do when the timing, not the spread, is the risk.
Request one payin quote and one payout quote on the same corridor, at the same minute, and compute the round trip from commercial_quotation and blindpay_quotation. The payin quotes docs show the request and every response field.
The five risks of a stablecoin card: peg, program failure, custody, smart contracts, and fraud, with the August 2026 incident and a safety checklist.
Stablecoin payments are as safe as the issuer, the network, the provider, and your own controls. The seven risks to check, with real incidents and fixes.
Five stablecoin APIs compared for cross-border payments: primary use case, pre-funding requirement, payout regions, and developer experience, plus how to choose by buyer scenario.