Why does a locked quote cost money? The free option inside a 5-minute window, and last look

A locked quote gives the customer a free option on the rate. How providers price it, who can exploit it, and how last look differs from a firm quote.

A locked quote costs the provider money because it gives the customer a free option. For the length of the window, the customer can execute if the market moved against them and walk away if it moved in their favor. The provider carries that risk, so it prices the option into the spread and keeps the window short.

This is the reason behind every quote window you have seen: 5 minutes, 10 seconds, 30 minutes. The window length is a pricing decision, not a UX accident. Who carries FX risk in a stablecoin payout maps the risk step by step. This page puts a number on it.

Key takeaways

  • A locked quote is an option: the customer chooses whether to execute, the provider is stuck with the price.
  • Option value rises with volatility, with size, and with the square root of the window length.
  • A 5-minute lock is cheap on normal days. A 24-hour lock costs about 17 times as much on the same assumptions.
  • The real cost is higher than the math, because customers who execute selectively pick the moments that hurt the provider.
  • Last look lets a provider reject an accepted trade on price. A firm quote does not.
  • Ask every provider whether an accepted, unexpired quote can still be refused.

Why is a locked quote an option?

Because it gives one side a choice and the other side an obligation. The customer may execute at the locked rate any time before expiry. The provider must honor it. If the market moves so the locked rate beats the new market rate, the customer executes. If it moves the other way, the customer can let it lapse and request a new quote.

Take an off-ramp from USDC to reais. You lock 5.40 BRL per USDC. If the real strengthens and the market drops to 5.37, your 5.40 is now better than the market, so you execute. If the real weakens and the market rises to 5.43, you could wait for expiry and ask again at the higher rate. Heads you win, tails you try again.

A binding quote is the commitment that makes this possible. Indicative rate vs binding quote covers the two kinds of price an API can return. This page is about what the binding kind costs to offer.

How much is that option worth?

A common rule of thumb values an at-the-money option at about 0.4 × volatility × square root of time, as a fraction of the amount. Volatility here is annual, and time is the window length in years. The square root is what makes short windows cheap and long ones expensive.

Illustrative example. Assume 15% annual volatility for a currency pair. This is an assumption for the math, not a market figure.

WindowTime in yearsOption value (0.4 × 15% × √T)On $100,000
10 seconds0.00000032about 0.34 bps$3.38
5 minutes0.0000095about 1.85 bps$18.50
30 minutes0.000057about 4.53 bps$45.30
1 hour0.000114about 6.41 bps$64.10
24 hours0.00274about 31.4 bps$314.00

Two things fall out. A 5-minute lock is cheap, under 2 basis points on these assumptions. And doubling volatility doubles every number, which is why windows tighten on days when a currency is moving fast.

Compare that with a published price for locks. Stripe's FX Quotes API charges a duration_premium that grows with lock length: 0.12%, 0.15%, and 0.30% for 5 minutes, 1 hour, and 24 hours on its Group 2 currencies, which include BRL, MXN, and COP (Stripe FX Quotes API). The 5-minute premium is well above the textbook option value. The next section explains the gap.

Who can exploit a free option?

Anyone who requests quotes often and executes selectively. If a customer asks for a quote every minute and only executes when the market has moved in its favor since the lock, the provider loses on every trade that executes. That pattern is called adverse selection, and it costs more than the raw option value.

Three patterns providers watch for:

  1. Quote shopping. Requesting many quotes, executing few, and only near expiry.
  2. Latency plays. Comparing the locked rate with a faster market feed and executing when the feed shows the lock is stale.
  3. Size games. Locking a small amount, then trying to execute a much larger one at the same rate.

Providers defend with short windows, limits on how often a customer can quote, monitoring of the quoted-to-executed ratio, and thresholds that cancel a lock when the market jumps. Stripe documents one such threshold: an extended payment quote is invalidated when the rate moves more than 3.5%, and a transfer quote at 1% (Stripe FX Quotes API).

For a normal business paying suppliers or payroll, none of this applies. You quote because you intend to pay. That is the customer providers want, and short windows cost you nothing if you execute right after you quote.

Why are quote windows so short?

Because the option grows with the square root of time and with size. Doubling the window adds about 41% to the option value; going from 5 minutes to 24 hours multiplies it by about 17. Providers set the window to the shortest time a real customer needs to confirm, and price the rest.

That's why window lengths differ by use case:

Use caseTypical needWindow that fits
API payout executed by codeSecondsSeconds to a few minutes
Human reviewing a payout screenOne to three minutesAbout 5 minutes
Consumer transfer flowSeveral minutesUp to 30 minutes, for example Wise locks the rate for 30 minutes (Wise quote reference)
Large OTC tradeImmediate acceptanceSeconds
Pricing a catalog in local currencyHours1 to 24 hours, priced as a premium

BlindPay sits on the short end. Payout quotes lock the exchange rate and fee and expire 5 minutes after creation (payout quotes docs). Payin quotes also last 5 minutes, and OTC payin quotes, priced for BRL into USDT, last 10 seconds (payin quotes docs). Read expires_at, in epoch milliseconds, on every response instead of hardcoding the window. Live quote vs forward contract vs fixed rate covers what to use when you need certainty for days or weeks instead of minutes.

What is last look, and how is it different from a firm quote?

Last look is a second check after you accept. The provider receiving your trade request gets "a final opportunity to accept or reject the request against its quoted price," in the words of the FX Global Code, Principle 17. A firm quote has no such step: accept inside the window and the trade is yours at that price.

Last look shifts part of the option back to you. If the market moved against the provider between quote and acceptance, it can decline, and you are left holding the market risk of a trade that didn't happen. The Code accepts the practice only under conditions (FX Global Code):

  • It should be "a risk control mechanism used in order to verify validity and/or price."
  • Providers must disclose whether price changes "in either direction" affect the decision, and how long the decision takes.
  • It "should not be used for purposes of information gathering with no intention to accept the Client's request to trade."
  • The provider should not trade on the information in your request during the last look window.

For a payout API, the practical question is simple. If you accept a valid, unexpired quote, can the provider still refuse or reprice it? BlindPay's docs describe the quote as a way to "show the customer a firm number before committing to the payout," and a payout executes only against a valid, unexpired quote. What a market maker does explains where last look sits in the wholesale chain behind your quote.

What should you ask a provider about its quote window?

Ask five questions in writing, because each one tells you who holds the option and for how long. The answers should be specific: a number of seconds, a percentage threshold, a yes or no on last look.

  1. How long does a quote stay valid, and is that returned on each response?
  2. Can an accepted, unexpired quote be rejected or repriced? Under what conditions?
  3. Does a large market move cancel an open quote? At what threshold?
  4. Are there limits on how often I can request quotes?
  5. Does the window change by currency, rail, or size?

These numbers also explain part of the spread. How on/off-ramp providers make money lays out the other revenue lines that sit next to the cost of locking a price.

What to do next

On a BlindPay development instance, create a payout quote, log expires_at, and execute it within the window. Then let one expire and confirm your code requests a fresh quote instead of retrying the old one. The payout quotes docs show the fields.

FAQ