On/off ramp liquidity with live quotes: how it works and why it matters

What on/off ramp liquidity with live quotes means for developers: live quote vs batch rate, the quote ID flow in an API, what happens on expiry, how liquidity depth changes spread by transaction size, rate windows and UX, and a checklist for evaluating a live quote API.

Reading time: about 6 minutes.

On/off ramp liquidity with live quotes means a provider holds enough fiat and stablecoin inventory to fill conversions on demand, and prices each one at the moment it is requested rather than from a cached rate. For a developer, the implication is that the rate returned by the quote endpoint is the rate that settles, as long as the transaction is confirmed inside the quote's window.

What is the difference between a live quote and a batch rate?

Live quoteBatch rate
When rate is determinedAt the moment of the API requestOn a schedule (every minute, hour, or day) and cached
Rate windowStated expiry, typically 10 seconds to 5 minutes, honored on confirmationNo commitment; settlement happens at the rate in effect later
User experienceThe amount on the confirmation screen is the amount that settlesThe user sees an estimate and learns the real amount afterward
Slippage riskCarried by the provider inside the windowCarried by the user, or hidden inside a wider spread
Best forConsumer flows, payroll, any product that shows an amount before sendingInternal treasury moves where the sender tolerates variance
Worst forNothing at the application layer; the cost is on the provider's sideAny flow where a person confirms a number they expect to receive

A batch rate is not a cheaper version of a live quote. It is a different allocation of risk, and the risk lands on the user.

How does a live quote actually work in an API?

The flow has six steps, and the quote ID is what ties them together.

  1. The application calls the quote endpoint with the corridor, the amount, and which side (sender or receiver) the amount is fixed on.
  2. The provider returns the rate, the itemized fees, the resulting amount, a quote ID, and an expiry timestamp in a single synchronous response.
  3. The application displays the amount and a countdown to the user.
  4. The user confirms.
  5. The application submits the transaction with the quote ID attached.
  6. The provider checks that the quote has not expired, honors the quoted rate, and executes the conversion.

Providers that own their liquidity implement this directly. BlindPay, for example, returns expires_at with every quote and holds bank payout quotes for a default five minute window, rejecting late submissions with a quote_expired error so the client can re-quote.

What happens when a live quote expires?

The user confirms in time. The transaction is submitted with a valid quote ID, the provider executes at the quoted rate, and the user receives the amount shown on screen. This is the only scenario in which the provider carries any rate risk.

The user does not confirm. The quote lapses, nothing is executed, and no funds move. The application requests a new quote when the user returns, and the new amount may differ.

The quote expires during processing. The application submitted the quote ID inside the window, so the provider honors it even if on-chain confirmation or fiat settlement finishes after the expiry timestamp. If the application submits after the window has closed, the provider rejects the transaction with an expiry error, and the correct client behavior is to re-quote and ask the user to confirm again rather than to retry blindly.

How does liquidity depth affect quote quality?

Liquidity depth is the volume a provider can convert on a corridor before the rate degrades. A deep book fills a large order at nearly the same price as a small one; a thin book has to reach for worse prices as the order grows.

Take a USDC to BRL corridor. A $500 quote and a $50,000 quote from a deep provider might differ by a few basis points, because both fill from the same inventory at the same price. The same two quotes from a thin provider might differ by 50 to 150 basis points, because the larger order exhausts the good inventory and fills the remainder at worse prices or is routed to a third party with its own markup.

Depth also sets reliability. A provider that has to source liquidity from a partner at quote time cannot guarantee the rate, so it either widens the spread to protect itself or quotes indicatively and settles at market.

To test depth during evaluation, request quotes at $500, $5,000, and $50,000 on the same corridor within one minute and compare the effective rate after fees. Then ask for the maximum single-transaction size per corridor and whether that limit is stated in writing. A provider whose spread is flat across the three sizes has the depth it claims.

What is a typical rate window and how should it affect your UX design?

Most live quote windows fall between 10 and 90 seconds for crypto-native flows, with some providers holding bank payout quotes for several minutes. The window length dictates which confirmation pattern your interface can support.

  • About 15 seconds: single-screen confirmation only. The amount and a confirm button must be on the same screen with a visible countdown, and the quote should be requested when that screen loads, not earlier.
  • About 60 seconds: multi-step confirmation is possible. The user can review a summary, pick a bank account, and confirm, provided the app re-quotes automatically if the timer runs out.
  • 90 seconds and up: batch approval flows work. A finance user can review a list of payouts, each with its quoted amount, and approve them together before any quote lapses.

A window under 10 seconds is a bad consumer experience. Network latency, screen rendering, and the user reading the number consume most of it, so a meaningful share of confirmations arrive expired and the user sees a changed amount on every retry. If a provider's window is that short, either the corridor is illiquid or the provider is passing its own risk to your users.

Design for expiry as a normal path, not an error. Show the countdown, re-quote silently when it hits zero, and highlight the change only if the amount moved.

What should a developer look for in a live quote API?

  • Synchronous response under one second. The quote is on the critical path of the confirmation screen, so a slow endpoint eats into the rate window before the user sees a number.
  • Quote ID enforcement on the transaction endpoint. The execute call must require the quote ID and reject unknown or expired ones, otherwise the "honored rate" is a promise with no mechanism behind it.
  • Explicit expiry timestamp and a distinct expiry error code. The client needs the timestamp to render a countdown and the error code to distinguish "re-quote" from "something else failed".
  • Itemized fees in the quote. Rate, spread, flat fee, and network fee as separate fields, so the amount displayed matches the amount settled and reconciliation works without guesswork.
  • Webhook settlement events. Execution is asynchronous after confirmation, so the API must emit signed events for on-chain confirmation and fiat settlement rather than requiring polling.
  • Sandbox parity with production. Expiry, rejection, and error codes must behave the same in sandbox, or the integration ships with untested failure paths. Sandbox vs production covers what sandboxes can and cannot exercise.

A provider that meets all six has built a live quote system. A provider that meets fewer has built a rate display. The buyer's guide to on/off ramp providers shows how to weigh this against corridor coverage, settlement speed, and licensing.

This article is general information, not legal, tax, or financial advice.

FAQ