Already using the LI.FI SDK or Widget? Composer works automatically. See the SDK guide or Widget guide instead.
Authentication
The LI.FI API is open and requires no API key. You can start making requests immediately.integrator(optional query parameter): A string that identifies your application in analytics and on-chain events. Defaults to"lifi-api"when omitted. Must be alphanumeric with hyphens, underscores, or dots, max 23 characters.x-lifi-api-key(optional header): An API key is generated automatically when you create an integration in the LI.FI partner portal. Attach it for higher rate limits. Without a key, unauthenticated limits apply: 75 requests per two hours for/quoteand/advanced/routes, 50 requests per two hours for/advanced/stepTransaction, and 100 requests per minute for other endpoints. With an API key, the default is 100 requests per minute across all endpoints.
Overview
Composer does not require a dedicated endpoint. SettoToken to a supported protocol token address and LI.FI returns a Composer route from the standard endpoints.
The integration flow:
- Request a quote via
GET /v1/quoteorPOST /v1/advanced/routes - Set token allowance by approving the LI.FI Diamond contract to spend your tokens
- Send the transaction using the
transactionRequestfrom the quote response - Track status by polling
GET /v1/statusfor cross-chain transfers
Request a Composer Quote
Using GET /quote (Recommended)
The simplest way to get a Composer transaction. Returns a single best route with transaction data included.
Slippage
Theslippage parameter is a decimal value representing the maximum acceptable price difference. For example, 0.005 means 0.5%. If omitted, the API defaults to 0.005. Cross-chain routes involve more steps, so consider 0.01 (1%) or higher for cross-chain flows.
| Value | Meaning |
|---|---|
0.005 | 0.5% (default) |
0.01 | 1% |
0.03 | 3% |
Using POST /advanced/routes
Returns multiple route options. Useful when you want to present choices to the user or need more control over route selection.
When using
/advanced/routes, transaction data is not included in the response. You must call POST /v1/advanced/stepTransaction to get the transactionRequest for each step. With /quote, transaction data is included directly.Getting transaction data for a route step
TypeScript
Quote Response Structure
A Composer quote response contains the route details, estimated output, and a ready-to-sign transaction. Here are the key fields:Key fields
| Field | Description |
|---|---|
tool | "composer" for same-chain Composer routes. For cross-chain routes, this is the bridge name (e.g., "stargateV2"). Check includedSteps for tool: "composer" to confirm Composer is in the route. |
action.fromToken / action.toToken | Token objects with address, symbol, decimals, and chainId. |
action.slippage | The slippage tolerance applied to this quote. |
estimate.toAmount | Estimated output in the toToken’s smallest unit. |
estimate.toAmountMin | Minimum output accounting for slippage. |
estimate.approvalAddress | The contract address to approve for token spending (see below). |
estimate.executionDuration | Estimated execution time in seconds. |
transactionRequest | Ready-to-sign EVM transaction. Fields (value, gasLimit, gasPrice) are hex-encoded strings. |
estimate.feeCosts | Array of fee entries. Every Composer route includes a feeCollection step that takes a small percentage fee. Check this array to surface fee details to users. |
includedSteps | Ordered list of steps the route will execute. Typically includes a feeCollection step followed by the composer step. |
Hex-encoded values: The
transactionRequest fields value, gasLimit, and gasPrice are hex strings (e.g., "0x5f45bc"). The chainId field is a plain number. When building transactions manually (e.g., in Python), parse hex fields with int(value, 16).Contract addresses
Theestimate.approvalAddress and transactionRequest.to both point to the LI.FI Diamond contract, a verified, audited smart contract deployed on all supported chains.
| Chain | LI.FI Diamond Address |
|---|---|
| All EVM chains | 0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE |
Morpho vault naming
Morpho vaults are named after their curator, not after Morpho itself. For example, the address0x7BfA7C4f149E7415b73bdeDfe609237e29CBF34A returns symbol: "sparkUSDC" because it is a Spark-curated Morpho vault. This is expected: Morpho provides the vault infrastructure, and curators like Spark create strategies on top.
Set Token Allowance
Before executing, the LI.FI Diamond contract needs approval to spend your tokens. The approval address is returned in the quote response atestimate.approvalAddress.
Skip this step if
fromToken is a native token (e.g., ETH). Native tokens don’t require approval.Send the Transaction
Submit thetransactionRequest from the quote response. This is a standard EVM transaction.
Track Status
For same-chain Composer transactions, the operation is complete once the transaction is confirmed. For cross-chain Composer flows, poll the/status endpoint until the transfer completes:
Error Handling
Common errors when working with Composer:| Error | Cause | Resolution |
|---|---|---|
No routes found | Vault token not supported or insufficient liquidity | Verify the vault token address is correct and the protocol is supported |
Simulation failed | The Composer execution would fail onchain | Check token balances, allowances, and that the vault is accepting deposits |
Insufficient allowance | Token approval not set or too low | Call approve() with the correct approvalAddress and amount |
Next Steps
Cross-Chain Patterns
Advanced cross-chain Composer flows and patterns
Withdrawals Guide
Implement same-chain and cross-chain withdrawals
Vault Deposit Recipes
Copy-paste recipes for Morpho, Aave, Euler, and more
SDK Integration
Managed execution with hooks, events, and automatic retries
Supported Protocols
Full list of supported protocols and capabilities

