slippage into one budget for the whole route instead of a tolerance for each step. You send slippageScope=route, and LI.FI returns a single minimum output for the route as toAmountMin. The transaction is built so the user receives at least that amount. If that can’t happen, the transaction reverts, or the transfer is reported as not fulfilled.
It is opt-in per request. Omitting slippageScope, or sending slippageScope=step, keeps today’s per-step behavior exactly as it is.
Per-step vs route-wide slippage
slippage can apply in two ways, chosen per request with slippageScope:
- Per-step (
step, the default).slippageis the tolerance for each step that carries price risk. Each step gets its own minimum. - Route-wide (
route).slippageis one budget for the whole route. LI.FI splits it across those steps and returns a single minimum for the route.
How it works
Route-wide slippage works with three numbers:- Budget (
slippage). The total slippage you allow for the route, as a decimal.0.01is 1%. - Expected output (
routeSlippage.referenceToAmount). What the route is expected to deliver when it is quoted. - Floor (
routeSlippage.minimumToAmount).ceil(referenceToAmount × (1 − slippage)), in the destination token’s base units. It is also returned astoAmountMin.
Show the floor
Show
toAmountMin as the minimum the user receives. The route and its steps carry a routeSlippage object.Build
A quote already includes
transactionRequest. For a route, post each step unchanged to /v1/advanced/stepTransaction, including routeSlippage. Do not drop this field when reconstructing or serializing a step: a step submitted without it is built with per-step slippage instead.Track
Poll
/v1/status. Once the transfer is final, routeSlippage.outcome tells you whether the floor was met.Supported routes
Route-wide slippage covers EVM routes with at most one swap:
These routes aren’t protected:
- Routes with a swap or contract call on the destination chain after the bridge
- Routes with more than one swap
- Routes that start or end on a non-EVM chain, such as Solana, Bitcoin, Sui or Tron
- Tokens that charge a fee on transfer
- Routes through Allbridge, Hyperliquid deposits or Smart Deposits, and same-chain intent-based swaps
- Exact-output quotes (
/v1/quote/toAmount) and contract-call quotes (/v1/quote/contractCalland/v1/quote/contractCalls). These rejectslippageScope=routewith a400.
ROUTE_SLIPPAGE_UNSUPPORTED:
- Routes requests list it in
unavailableRoutes.filteredOut. - If no route can be protected, a quote request returns a
404that lists the reasons inerrors.filteredOut.
Cross-chain settlement
LI.FI’s contracts enforce amounts on the source chain only. On a cross-chain route, the source transaction holds the swap to the checkpoint, and the bridge then delivers on the destination chain. How the floor is held from there depends on the bridge:- Mayan, Across and Stargate V2. The bridge’s own order carries at least the floor, so the bridge won’t settle under it. A Mayan order carries a minimum output, Across fills an exact output amount, and Stargate V2 reverts the source transaction under its minimum. A same-token Mayan MCTP transfer carries no minimum, because it delivers the burned amount minus fees that are fixed in the transaction.
- Other bridges. The floor isn’t in the transaction. The bridge is quoted for the amount the source transaction guarantees it, and the transaction is built only if the bridge’s own minimum for that amount reaches the floor. Delivery then relies on the bridge honoring that minimum.
/v1/status judges every protected transfer against the floor. A refund or the delivery of another token is reported as NOT_FULFILLED with REFUNDED or DIFFERENT_TOKEN. BELOW_FLOOR isn’t an expected way for a transfer to settle: it means the bridge delivered the committed token under the minimum it was built with. It is reported so that such a delivery is never counted as FULFILLED.
Request a route-protected quote
/v1/quote returns one step with the transaction already built against the floor:
slippageScope in the routes request options:
slippage must be a decimal from 0 up to, but not including, 1, with at most eight decimal places. A value that needs more precision is rejected, not rounded, because rounding would move the floor. If you omit slippage, the budget is the default slippage LI.FI would otherwise apply.
Read the response
On a route-protected response:toAmountMinis the floor.toAmountis the current estimate. It can change between requests while the floor doesn’t.- The step’s
action.slippageis the whole budget. - Each included step’s
action.slippageis its share of the budget.
routeSlippage commitment:
A same-chain example, with 1,000 USDC to WETH at a 1% budget:
Build and send the transaction
A quote already includestransactionRequest, built against the floor. Send it like any other quote.
For a route, post each step to /v1/advanced/stepTransaction exactly as it was returned, including routeSlippage. LI.FI re-quotes each step to build the transaction and then checks the transaction’s bytes against the commitment:
- If the fresh quotes can still deliver the floor, the transaction encodes it and the response returns the same
toAmountMin. - If they can’t, the request fails with
409andROUTE_SLIPPAGE_FLOOR_UNREACHABLE. Request a new quote and show the user the new floor. LI.FI never lowers the floor to make a build pass.
Track the outcome
For a route-protected transfer,/v1/status adds two fields:
quote.routeSlippageis the commitment the transaction was built with.routeSlippageis the verdict.
FULFILLED.
Errors
Route-wide slippage errors use the standard error codes. The reason is the stable prefix ofmessage, and of reason in filteredOut, so you can match on it without parsing the rest:
Next steps
- If Smart Slippage is enabled for your integrator, use its recommendations to choose a budget.
- Follow transfers to completion with status tracking.

