FX slippage is the gap between the rate a stablecoin on-ramp or off-ramp shows and the rate that settles. Why quote freshness is a liquidity signal, and how to check a quote-then-execute flow.
An on-ramp converts fiat money into stablecoins: dollars in a bank account become USDC in a wallet. An off-ramp does the reverse: USDC or USDT becomes local currency in a bank account, over a rail like Pix or SPEI. Every on-ramp and off-ramp payment has an exchange rate, and FX slippage is the gap between the rate you were shown and the rate that actually settled.
A live quote is how a provider closes that gap. How fresh the quote is, and whether it is binding, tells you more about a provider's liquidity than any coverage map.
FX slippage is the difference between the quoted exchange rate and the settled exchange rate. It shows up when a provider displays one rate, executes the conversion later, and settles at whatever the market says at that later moment.
The formula is short:
slippage (bps) = (quoted rate - settled rate) / quoted rate x 10,000
An illustrative example. An app shows a user 5.40 reais per USDC on a 10,000 USDC off-ramp, so the screen says 54,000 reais. The provider executes a minute later at 5.37. The recipient gets 53,700 reais. That is 300 reais missing, about 56 basis points of slippage, and nobody agreed to it.
Slippage can run in your favor too. It doesn't matter. A cost that moves randomly is still a cost you can't price, reconcile, or promise to a customer.
| Quote type | What it is | Is it binding? | Who carries the rate risk |
|---|---|---|---|
| Live quote | Calculated at request time, with an id and an expiry | Yes, inside the window | The provider, until expiry |
| Indicative quote | An estimate based on a recent market rate | No; execution happens later at market | You, or your recipient |
| Stale quote | A rate that was live once, then cached or shown past its expiry | No | You, and you may not know it |
A stale quote is the sneaky one. It looks like a live quote on screen. The number just stopped being true a while ago. The most common cause is an application that fetches a rate when a page loads and lets the user sit on it for ten minutes.
For the full quote lifecycle, including what happens when a quote expires and how window length should shape your UX, read on/off ramp liquidity with live quotes.
Because a provider can only commit to a rate it can fill. Freshness and bindingness are what real liquidity looks like from the outside.
A provider that holds local-currency inventory, or has direct access to market makers who do, can price a trade and hold that price for a few minutes. It knows it can deliver. A provider that has to go find the reais after you confirm can't make that promise, so it gives you an indicative rate instead and settles at whatever it gets.
Three things to read from a provider's quotes:
This is the same test as in what a liquidity market is: the quote is the visible edge of the liquidity behind it.
A live quote has four ingredients, calculated in one synchronous request:
A well-built quote response shows the first and third ingredients side by side, so you can see the spread. At BlindPay, every payout quote returns commercial_quotation (the market rate) next to blindpay_quotation (the rate after BlindPay's margin), plus sender_amount, receiver_amount, and each fee. The gap between the two rates is the spread, on every quote. Stablecoin API quotes explained walks through every field.
Both, possibly. They are different kinds of cost.
A binding live quote converts potential slippage into visible spread. The provider prices its risk for the window into the rate, and you see that price before you say yes. So a live quote with a slightly wider spread can cost less than a tight indicative rate plus slippage. The only way to know is to compare settled amounts, not screen rates. Stablecoin liquidity providers vs bank FX desks covers the rest of the hidden-cost list.
Run through this list against any provider's docs and sandbox:
receiver_amount, not an amount recalculated at execution.BlindPay's answers, for reference: payout quotes expire five minutes after creation by default (SEPA quotes can be shorter), with expires_at in epoch milliseconds. A quote backs one payout, and an expired quote is rejected rather than executed at a new rate. The payout runs on the quote's numbers when you create it inside the window.
A typical REST flow for an off-ramp payout has five steps. This is BlindPay's shape, but most stablecoin APIs follow the same pattern.
Step 1. Request a quote.POST /v1/instances/{instance_id}/quotes with the destination bank_account_id, request_amount in minor units (10000 means 100.00), currency_type (which side the amount is on), cover_fees (who pays), and the funding network and token.
Step 2. Read the response and show it.
The response returns the quote id, expires_at, commercial_quotation, blindpay_quotation, sender_amount, receiver_amount, and fees. Display receiver_amount with a countdown driven by expires_at.
Step 3. Authorize the funding, if needed.
For a self-custodied EVM wallet, sign the ERC-20 approve for the exact amount in the quote's contract payload. A BlindPay-managed wallet skips this step.
Step 4. Execute against the quote.POST /v1/instances/{instance_id}/payouts/evm with the quote_id and the sender wallet address, before expires_at. If the quote expired, request a new one, show the new numbers, and execute against the new id.
Step 5. Confirm settlement.
Listen for the payout.complete webhook, which fires when the payout reaches completed, failed, or refunded. Store the quoted and delivered amounts together for reconciliation.
The same flow runs from the terminal with the BlindPay CLI (blindpay quotes create, then blindpay payouts create --quote-id qu_...) and from the official SDKs for Node.js, Python, and Go, as well as PHP and Swift.
Log three numbers on every payout: the quoted rate at confirmation, the quoted receiver_amount, and the amount that actually landed. Then track, per corridor:
If realized slippage is ever non-zero on a "live" quote, you have learned something important about your provider.
Pick one corridor and run the eight-point checklist in a sandbox: request a quote, let it expire, submit it anyway, and confirm you get a clean expiry error. Then read the payout quotes documentation for the full request and response, or follow the payout quickstart to run the whole flow on a development instance.
This article is general information, not legal, tax, or financial advice.
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.
Seven stablecoin payment platforms compared for US fintechs in 2026: what makes an API production-ready, how each provider handles compliance, settlement speed against ACH, and how to run the evaluation.
How to choose a stablecoin payment provider in 2026: the four provider types, a comparison of 10 options, and the questions that decide the fit.