A stablecoin API quote locks the rate, fees, and amounts for a few minutes. How expiry works, which side pays the fee, and the field that flips meaning.
A stablecoin API quote is a price lock. It fixes the exchange rate, the fees, the amount the sender pays, and the amount the recipient gets, for a short window. You execute the payment against the quote's id before it expires. If it expires, nothing moves, and you ask for a new one.
Simple on paper. In practice, three fields cause most of the bugs: when the quote expires, which side pays the fee, and which currency the amount is in.
Everything the user needs to say yes. A good quote response answers four questions with numbers, not estimates:
Here's a BlindPay payout quote response, straight from the payout quotes docs:
commercial_quotation is the raw market rate. blindpay_quotation is the rate net of the fee. The gap between them is the spread, visible on every quote. sender_amount and receiver_amount are the two numbers your UI shows. EVM payout quotes also carry a contract object: the ERC-20 approve payload for wallets that sign their own transactions.
If a provider's quote gives you one rate and one total, you can't tell spread from fee. Ask for the itemized version.
Because FX moves. A quote that lasted an hour would either carry a fat buffer (you pay for it) or leave the provider exposed. Minutes is the normal range.
At BlindPay the defaults are:
| Quote type | Default expiry | Exception |
|---|---|---|
| Payin quote | 5 minutes | OTC Pix payin quotes: 10 seconds |
| Payout quote | 5 minutes | SEPA payout quotes can be shorter |
| Transfer quote | 5 minutes | None |
Read expires_at from every response. Don't hardcode 5 minutes. And note the unit: expires_at is epoch milliseconds, not seconds. Divide by 1,000 before passing it to a library that expects seconds, or your countdown will say the quote expires in the year 56,000.
Every rail's window is in the cut-off times reference.
The execute call fails and no money moves. That's the point: an expired quote protects both sides from a stale price.
Build the UX around it:
expires_at.On an external wallet flow, there's one extra trap. If the user signs an on-chain approval and the transaction is slow to mine, the quote can expire while they wait. Quote again rather than committing an expired one.
Also: a quote backs one payment. At BlindPay, a quote_id can only back one payout, and a second call with the same quote returns an error. That's a useful second layer against double-sends, but it's not a substitute for proper idempotency on your retries.
The cover_fees flag decides it, and the choice changes which number stays fixed.
cover_fees | Who pays | What happens to the amounts |
|---|---|---|
false | The recipient | The fee comes off what the recipient gets. The common case. |
true | The sender | The fee is added on top, so the recipient gets the full amount. |
Payroll is the classic true case. A company paying a contractor in Mexico wants them to receive exactly 20,000 MXN, so the company absorbs the fee. A marketplace paying out sellers usually leaves it false and shows the net.
This is the one that bites. currency_type says which side of the payment request_amount refers to, and on BlindPay it means opposite things on payins and payouts:
| Quote | currency_type: "sender" | currency_type: "receiver" |
|---|---|---|
| Payout quote | The stablecoin being sent | The fiat the bank account receives |
| Payin quote | The fiat the payer sends | The stablecoin the wallet receives |
Same field, same values, flipped direction. If you share one "build quote" helper across both flows, test both. A payout helper that assumes sender means fiat will quote the wrong side of every payment.
Floating point and money don't mix. 0.1 + 0.2 isn't 0.3 in JavaScript, and you don't want to find that out in a reconciliation report. So stablecoin APIs usually take minor units.
At BlindPay, request_amount is an integer and doesn't accept floats. 10000 is 100.00. 500000 is 5,000.00. Two more rules worth knowing:
10050 fails with request_amount_must_be_a_whole_currency_unit, because those rails settle in whole units.Convert at the edge of your system, once. Store minor units everywhere else.
cover_fees style flag, not a support ticket.The quote is where the price gets set, so it's also where hidden costs hide. Settlement speed matters too: see how long a stablecoin payout takes. For where the quote sits in the full flow, see how a stablecoin payment moves.
BlindPay is a stablecoin API for cross-border payouts and collections: USDC or USDT in, local currency out over Pix, SPEI, ACH, RTP, SEPA, and SWIFT (POBO/COBO) to 100+ countries, with no pre-funding. Every quote itemizes the market rate, the applied rate, and each fee, and virtual USD accounts turn ACH, wire, and SWIFT deposits into stablecoins. Pricing is on the pricing page.
Create a payout quote on a free development instance and read the response field by field. Then flip cover_fees and currency_type and watch which numbers move. Ten minutes of that beats an hour of docs. Start with the payout quotes guide, then the payin quotes guide for the flipped direction.
This article is for general information only and is not legal, tax, or financial advice.
AP2, ACP, and x402 each verify that an AI agent had permission to spend. What each covers, who backs it, and the reconciliation gap none close.
Seven stablecoin payment platforms compared for US fintechs in 2026: production readiness, compliance, settlement speed against ACH, and 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.