li-fi-api

SKILL.md

LI.FI REST API Integration

The LI.FI REST API provides direct HTTP access to cross-chain swap and bridge functionality. Use this API when building backend services, working with non-JavaScript languages, or needing fine-grained control over cross-chain operations.

Base URL

https://li.quest/v1

Authentication

API key is optional but recommended for higher rate limits.

# Without API key (lower rate limits)
curl "https://li.quest/v1/chains"

# With API key (higher rate limits)
curl "https://li.quest/v1/chains" \
  -H "x-lifi-api-key: YOUR_API_KEY"

Important: Never expose your API key in client-side code. Use it only in server-side applications.

Rate Limits

Tier Limit
Without API key Per IP address
With API key Per API key

Request an API key from LI.FI for production use with higher limits.

Quick Start

1. Get a Quote

curl "https://li.quest/v1/quote?\
fromChain=42161&\
toChain=10&\
fromToken=0xaf88d065e77c8cC2239327C5EDb3A432268e5831&\
toToken=0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1&\
fromAmount=10000000&\
fromAddress=0xYourAddress&\
slippage=0.005"

2. Execute the Transaction

Use the transactionRequest from the quote response to send the transaction via your wallet or web3 library.

3. Track Status

curl "https://li.quest/v1/status?\
txHash=0xYourTxHash&\
fromChain=42161&\
toChain=10&\
bridge=stargate"

Core Endpoints

GET /quote

Get a single-step quote with transaction data ready for execution.

Parameters:

Parameter Type Required Description
fromChain number Yes Source chain ID
toChain number Yes Destination chain ID
fromToken string Yes Source token address
toToken string Yes Destination token address
fromAmount string Yes Amount in smallest unit
fromAddress string Yes Sender wallet address
toAddress string No Recipient address
slippage number No Slippage tolerance (0.005 = 0.5%)
integrator string No Your integrator ID
allowBridges string[] No Allowed bridges (or all, none, default)
denyBridges string[] No Denied bridges
preferBridges string[] No Preferred bridges
allowExchanges string[] No Allowed exchanges (or all, none, default)
denyExchanges string[] No Denied exchanges
preferExchanges string[] No Preferred exchanges
allowDestinationCall boolean No Allow contract calls on destination (default: true)
order string No Route preference: FASTEST or CHEAPEST
fee number No Integrator fee (0.02 = 2%, max <100%)
referrer string No Referrer tracking information
fromAmountForGas string No Amount to convert to gas on destination
maxPriceImpact number No Max price impact threshold (0.1 = 10%, default: 10%)
skipSimulation boolean No Skip TX simulation for faster response
swapStepTimingStrategies string[] No Timing strategy for swap rates
routeTimingStrategies string[] No Timing strategy for route selection

Example Request:

curl "https://li.quest/v1/quote?\
fromChain=1&\
toChain=137&\
fromToken=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&\
toToken=0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174&\
fromAmount=1000000000&\
fromAddress=0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0&\
slippage=0.005"

The response includes transactionRequest with all data needed to execute the swap. See references/REFERENCE.md for complete response schema.

POST /advanced/routes

Get multiple route options for comparison. Returns routes without transaction data (use /advanced/stepTransaction to get TX data for a specific step).

Request Body:

{
  "fromChainId": 42161,
  "toChainId": 10,
  "fromTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
  "toTokenAddress": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1",
  "fromAmount": "10000000",
  "fromAddress": "0xYourAddress",
  "options": {
    "integrator": "YourAppName",
    "slippage": 0.005,
    "order": "CHEAPEST",
    "bridges": {
      "allow": ["stargate", "hop", "across"]
    },
    "exchanges": {
      "allow": ["1inch", "uniswap"]
    },
    "allowSwitchChain": true,
    "maxPriceImpact": 0.1
  }
}

Example Request:

curl -X POST "https://li.quest/v1/advanced/routes" \
  -H "Content-Type: application/json" \
  -d '{
    "fromChainId": 42161,
    "toChainId": 10,
    "fromTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    "toTokenAddress": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1",
    "fromAmount": "10000000",
    "options": {
      "slippage": 0.005,
      "integrator": "YourApp"
    }
  }'

Returns array of routes sorted by order preference. Each route contains steps but no transactionRequest - use /advanced/stepTransaction to get TX data.

POST /advanced/stepTransaction

Populate a step (from /advanced/routes) with transaction data. Use this after selecting a route to get the actual transaction to execute.

Request Body: Send the full Step object from a route.

Query Parameters:

Parameter Type Required Description
skipSimulation boolean No Skip TX simulation for faster response

Example:

curl -X POST "https://li.quest/v1/advanced/stepTransaction" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "step-id",
    "type": "cross",
    "tool": "stargate",
    "action": {...},
    "estimate": {...}
  }'

Response: Returns the Step object with transactionRequest populated.

GET /status

Track transaction status across chains. Can query by sending TX hash, receiving TX hash, or transactionId.

Parameters:

Parameter Type Required Description
txHash string Yes Transaction hash (sending, receiving, or transactionId)
fromChain number No Source chain ID (speeds up request)
toChain number No Destination chain ID
bridge string No Bridge tool name

For same-chain swaps, set fromChain and toChain to the same value.

Example Request:

curl "https://li.quest/v1/status?txHash=0x123abc..."

Response includes: transactionId, sending (txHash, amount, chainId), receiving (txHash, amount, chainId), status, substatus, lifiExplorerLink.

Status Values: NOT_FOUND, INVALID, PENDING, DONE, FAILED

Poll until status is DONE or FAILED. See references/REFERENCE.md for complete substatus values.

GET /chains

Get all supported chains.

Parameters:

Parameter Type Required Description
chainTypes string No Filter by chain types: EVM, SVM
curl "https://li.quest/v1/chains"
curl "https://li.quest/v1/chains?chainTypes=EVM,SVM"

GET /tokens

Get tokens for specified chains.

Parameters:

Parameter Type Required Description
chains string No Comma-separated chain IDs or keys (e.g., POL,DAI)
chainTypes string No Filter by chain types: EVM, SVM
minPriceUSD number No Min token price filter (default: 0.0001 USD)
curl "https://li.quest/v1/tokens?chains=1,137,42161"

GET /token

Get information about a specific token.

Parameters:

Parameter Type Required Description
chain string Yes Chain ID or key (e.g., POL or 137)
token string Yes Token address or symbol (e.g., DAI)
curl "https://li.quest/v1/token?chain=POL&token=DAI"

GET /tools

Get available bridges and exchanges. Use this to discover valid tool keys for filtering quotes.

Parameters:

Parameter Type Required Description
chains string No Filter by chain IDs
curl "https://li.quest/v1/tools"
curl "https://li.quest/v1/tools?chains=1,137"

Returns bridges and exchanges arrays with key, name, and supportedChains. Use these keys in allowBridges, denyBridges, allowExchanges, etc.

Special values: all, none, default, []

GET /connections

Get available token pair connections. At least one filter (chain, token, bridge, or exchange) is required.

Parameters:

Parameter Type Required Description
fromChain string No Source chain ID or key
toChain string No Destination chain ID or key
fromToken string No Source token address or symbol
toToken string No Destination token address or symbol
chainTypes string No Filter by chain types: EVM,SVM
allowBridges string[] No Allowed bridges
denyBridges string[] No Denied bridges
preferBridges string[] No Preferred bridges
allowExchanges string[] No Allowed exchanges
denyExchanges string[] No Denied exchanges
preferExchanges string[] No Preferred exchanges
allowSwitchChain boolean No Include routes requiring chain switch (default: true)
allowDestinationCall boolean No Include routes with destination calls (default: true)
curl "https://li.quest/v1/connections?\
fromChain=POL&\
fromToken=DAI"

POST /quote/contractCalls

Get a quote for bridging tokens and performing multiple contract calls on the destination chain. This enables 1-click DeFi workflows like bridge + swap + deposit.

Request Body:

{
  "fromChain": 10,
  "fromToken": "0x4200000000000000000000000000000000000042",
  "fromAddress": "0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0",
  "toChain": 1,
  "toToken": "ETH",
  "toAmount": "100000000000001",
  "integrator": "YourAppName",
  "contractCalls": [
    {
      "fromAmount": "100000000000001",
      "fromTokenAddress": "0x0000000000000000000000000000000000000000",
      "toTokenAddress": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84",
      "toContractAddress": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84",
      "toContractCallData": "0x",
      "toContractGasLimit": "110000"
    },
    {
      "fromAmount": "100000000000000",
      "fromTokenAddress": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84",
      "toTokenAddress": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",
      "toContractAddress": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",
      "toFallbackAddress": "0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0",
      "toContractCallData": "0xea598cb000000000000000000000000000000000000000000000000000005af3107a4000",
      "toContractGasLimit": "100000"
    }
  ]
}

Integration Examples

Python

import requests

BASE_URL = "https://li.quest/v1"

def get_quote(from_chain, to_chain, from_token, to_token, amount, address):
    response = requests.get(f"{BASE_URL}/quote", params={
        "fromChain": from_chain,
        "toChain": to_chain,
        "fromToken": from_token,
        "toToken": to_token,
        "fromAmount": amount,
        "fromAddress": address,
        "slippage": 0.005
    })
    return response.json()

def get_status(tx_hash, from_chain, to_chain, bridge):
    response = requests.get(f"{BASE_URL}/status", params={
        "txHash": tx_hash,
        "fromChain": from_chain,
        "toChain": to_chain,
        "bridge": bridge
    })
    return response.json()

# Example usage
quote = get_quote(
    from_chain=42161,
    to_chain=10,
    from_token="0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    to_token="0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1",
    amount="10000000",
    address="0xYourAddress"
)

print(f"Estimated output: {quote['estimate']['toAmount']}")
print(f"Gas cost: {quote['estimate']['gasCosts']}")

Node.js (fetch)

const BASE_URL = 'https://li.quest/v1';

async function getQuote(params) {
  const searchParams = new URLSearchParams(params);
  const response = await fetch(`${BASE_URL}/quote?${searchParams}`);
  return response.json();
}

async function getRoutes(body) {
  const response = await fetch(`${BASE_URL}/routes`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(body),
  });
  return response.json();
}

async function pollStatus(txHash, fromChain, toChain, bridge) {
  const params = new URLSearchParams({ txHash, fromChain, toChain, bridge });
  
  while (true) {
    const response = await fetch(`${BASE_URL}/status?${params}`);
    const data = await response.json();
    
    if (data.status === 'DONE' || data.status === 'FAILED') {
      return data;
    }
    
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

// Example usage
const quote = await getQuote({
  fromChain: 42161,
  toChain: 10,
  fromToken: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
  toToken: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',
  fromAmount: '10000000',
  fromAddress: '0xYourAddress',
  slippage: 0.005,
});

Error Handling

HTTP Status Description
200 Success
400 Bad request - check parameters
429 Rate limit exceeded - wait or use API key
500 Internal error - retry

See references/REFERENCE.md for complete error codes and response schemas.

Best Practices

  1. Always specify slippage - Default is conservative. Adjust based on token volatility.

  2. Poll status endpoint - For cross-chain transfers, poll every 5-10 seconds until DONE or FAILED.

  3. Handle rate limits - Implement exponential backoff for 429 responses.

  4. Cache chain/token data - /chains and /tokens responses change infrequently.

  5. Use integrator parameter - Always include integrator for analytics and potential monetization.

  6. Validate addresses - Ensure token addresses match the specified chain.

  7. Handle gas estimation - The API provides gas estimates, but actual costs may vary.

See references/REFERENCE.md for complete endpoint documentation and response schemas.

Weekly Installs
8
First Seen
Jan 24, 2026
Installed on
claude-code7
codex7
cursor6
opencode5
windsurf5
gemini-cli5