Skip to main content
POST
/
quotes
Get transfer quotes
curl --request POST \
  --url https://transfer.layerzero-api.com/v1/quotes \
  --header 'Content-Type: application/json' \
  --data '
{
  "srcChainKey": "base",
  "dstChainKey": "optimism",
  "srcTokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
  "dstTokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
  "srcWalletAddress": "0x1234567890123456789012345678901234567890",
  "dstWalletAddress": "0x1234567890123456789012345678901234567890",
  "amount": "100000000000000000"
}
'
{
  "quotes": [
    {
      "id": "quote_abc123",
      "feeUsd": "0.50",
      "feePercent": "0.5",
      "srcAmount": "100000000000000000",
      "dstAmount": "99500000000000000",
      "routeSteps": [
        {
          "type": "STARGATE_V2_TAXI",
          "srcChainKey": "base"
        }
      ],
      "userSteps": [
        {
          "type": "TRANSACTION",
          "chainKey": "base",
          "chainType": "EVM"
        }
      ]
    }
  ],
  "tokens": []
}
Returns one or more quotes for cross-chain transfers, each with fee breakdowns, estimated duration, and execution steps.

Reference

Request body

ParameterTypeRequiredDescription
amountstringYesAmount in smallest units (wei for ETH, lamports for SOL)
srcChainKeystringYesSource chain identifier (for example, base, ethereum)
srcTokenAddressstringYesSource token contract address
srcWalletAddressstringYesSender wallet address
dstChainKeystringYesDestination chain identifier
dstTokenAddressstringYesDestination token contract address
dstWalletAddressstringYesRecipient wallet address
optionsobjectNoOptional transfer configuration
options.amountTypeenumNoEXACT_SRC_AMOUNT (default)
options.feeToleranceobjectNoMaximum acceptable fee variance
options.feeTolerance.typestringNoPERCENT
options.feeTolerance.amountnumberNoTolerance percentage (0-100). Default: 1
options.dstNativeDropAmountstringNoNative gas drop on destination. Default: 0

Response

Returns a quotes array, rejectedQuotes array, and tokens array.

Quote attributes

AttributeTypeDescription
idstringUnique quote identifier (becomes transfer ID after execution)
routeStepsarrayArray of route segments with protocol types
feesarrayDetailed fee breakdown by chain and type
durationobjectEstimated transfer duration
duration.estimatedstring or nullDuration in milliseconds (null if unknown)
feeUsdstringTotal fees in USD
feePercentstringFee as percentage of transfer amount
srcAmountstringExact amount leaving source chain
dstAmountstringExpected amount on destination chain
dstAmountMinstringMinimum guaranteed amount (with slippage protection)
srcAmountUsdstringSource amount in USD
dstAmountUsdstringDestination amount in USD
userStepsarrayActions to execute (transactions or signatures)
optionsobjectTransfer options
options.dstNativeDropAmountstringNative gas drop configuration
expiresAtstringQuote expiration timestamp (may not be present on all quotes)

Route step attributes

AttributeTypeDescription
typeenumRoute protocol (see Route types)
srcChainKeystringChain where this step executes
descriptionstringHuman-readable step description

Fee attributes

AttributeTypeDescription
chainKeystringChain where fee is paid
typeenumMESSAGE, GENERAL, DST_NATIVE_DROP, CCTP_RECEIVE
descriptionstringHuman-readable fee description
amountstringFee amount in token units
addressstringToken address for fee

User step types

User steps can be TRANSACTION or SIGNATURE: TRANSACTION step:
{
  type: "TRANSACTION",
  description: string,
  chainKey: string,
  chainType: "EVM" | "SOLANA" | "STARKNET",
  signerAddress: string,
  transaction: {
    encoded: {
      to: string,
      data: string,
      value?: string,
      chainId: number,
      from?: string,
      gasLimit?: string
    }
  }
}
SIGNATURE step (EIP-712 for Aori routes):
{
  type: "SIGNATURE",
  description: string,
  chainKey: string,
  signerAddress: string,
  signature: {
    type: "EIP712",
    typedData: {
      domain: object,
      types: object,
      message: object
    }
  }
}

Executing userSteps safely

For ERC20 token transfers, the API returns two user steps with different to addresses:
Steptransaction.encoded.toPurpose
ApproveERC20 token contract (e.g., USDC)Calls approve(TransferDelegate, amount). The TransferDelegate address is encoded inside the data field.
BridgeLZMulticall contractRoutes the bridge transaction through LayerZero’s feeWrapper.
Never approve the LZMulticall (Wrapper) as a token spenderLZMulticall executes bridge transactions. It is not the right spender, and approving it will lose you tokens. The correct spender is the TransferDelegate, and the API’s approve step already has this set in the calldata. Execute every userStep as returned.See Contracts Overview for details on the contract architecture.

Route types

The API evaluates multiple protocols and returns the best routes:
TypeDescription
OFTOFT Standard transfers
STARGATE_V2_TAXIStargate V2 instant transfers
STARGATE_V2_BUSStargate V2 batched transfers
CCTPCircle CCTP for native USDC
AORIIntent-based swaps via Aori

Code examples

EVM transfer

curl -X POST "https://transfer.layerzero-api.com/v1/quotes" \
  -H "Content-Type: application/json" \
  -d '{
    "srcChainKey": "base",
    "dstChainKey": "arbitrum",
    "srcTokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "dstTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    "srcWalletAddress": "0x1234567890123456789012345678901234567890",
    "dstWalletAddress": "0x1234567890123456789012345678901234567890",
    "amount": "1000000"
  }'

Response

{
  "error": null,
  "quotes": [
    {
      "id": "0x00000000000000000000000000000000019c43bf3589735e9c7299af4c6f5971",
      "routeSteps": [
        {
          "type": "STARGATE_V2_TAXI",
          "srcChainKey": "base",
          "description": "Stargate"
        }
      ],
      "fees": [
        {
          "chainKey": "base",
          "type": "MESSAGE",
          "description": "",
          "amount": "45604559761712",
          "address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
        }
      ],
      "duration": {
        "estimated": "27600"
      },
      "feeUsd": "0.00033795",
      "feePercent": "0.00033800",
      "srcAmount": "1000000",
      "dstAmount": "999662",
      "dstAmountMin": "990000",
      "srcAmountUsd": "0.99986254",
      "dstAmountUsd": "0.99952459",
      "userSteps": [
        {
          "type": "TRANSACTION",
          "description": "approve",
          "chainKey": "base",
          "chainType": "EVM",
          "signerAddress": "0x1234567890123456789012345678901234567890",
          "transaction": {
            "encoded": {
              "chainId": 8453,
              "data": "0x095ea7b300000000000000000000000027a16dc786820b16e5c9028b75b99f6f604b5d2600000000000000000000000000000000000000000000000000000000000f4240",
              "from": "0x1234567890123456789012345678901234567890",
              "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
            }
          }
        },
        {
          "type": "TRANSACTION",
          "description": "bridge",
          "chainKey": "base",
          "chainType": "EVM",
          "signerAddress": "0x1234567890123456789012345678901234567890",
          "transaction": {
            "encoded": {
              "chainId": 8453,
              "data": "0xc7c7f5b3...",
              "from": "0x1234567890123456789012345678901234567890",
              "to": "0x27a16dc786820B16E5c9028b75B99F6f604b5d26",
              "value": "45604559761712"
            }
          }
        }
      ],
      "options": {
        "dstNativeDropAmount": "0"
      }
    }
  ],
  "rejectedQuotes": [],
  "tokens": [
    {
      "chainKey": "base",
      "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "decimals": 6,
      "symbol": "USDC",
      "name": "USD Coin",
      "price": {
        "usd": 0.99986254
      }
    },
    {
      "chainKey": "arbitrum",
      "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
      "decimals": 6,
      "symbol": "USDC",
      "name": "USD Coin",
      "price": {
        "usd": 0.99986254
      }
    },
    {
      "chainKey": "base",
      "address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
      "decimals": 18,
      "symbol": "ETH",
      "name": "Ether",
      "price": {
        "usd": 2132.32235403
      }
    },
    {
      "chainKey": "arbitrum",
      "address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
      "decimals": 18,
      "symbol": "ETH",
      "name": "ETH",
      "price": {
        "usd": 2132.32235403
      }
    }
  ]
}

Errors

The API returns an error object when the request fails:
{
  "error": {
    "status": 4000,
    "message": "Invalid input",
    "issues": [
      {
        "message": "Invalid source token"
      }
    ]
  },
  "quotes": []
}
Check the error field before processing quotes:
const result = await response.json();

if (result.error) {
  console.error('Quote error:', result.error.message);
  result.error.issues?.forEach((issue) => {
    console.error('  -', issue.message);
  });
  return;
}

Quote expiration

Quotes may include an expiresAt timestamp. Execute quotes promptly or request a new quote if expired.
const quote = quotes[0];

if (quote.expiresAt) {
  const expiresAt = new Date(quote.expiresAt);
  if (new Date() > expiresAt) {
    console.log('Quote expired, request a new one');
  }
}
  • Build user steps — Generate fresh transaction data for Solana transfers
  • Submit signature — Submit EIP-712 signatures for intent-based routes
  • Status — Track transfer progress after execution

Examples

Body

application/json
srcChainKey
string
required

Source chain key (for example, 'base', 'arbitrum')

Example:

"base"

dstChainKey
string
required

Destination chain key

Example:

"optimism"

srcTokenAddress
string
required

Source token address (use 0xEeee...EEeE for native ETH)

Example:

"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"

dstTokenAddress
string
required

Destination token address

Example:

"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"

srcWalletAddress
string
required

Sender wallet address

Example:

"0x1234567890123456789012345678901234567890"

dstWalletAddress
string
required

Recipient wallet address

Example:

"0x1234567890123456789012345678901234567890"

amount
string
required

Transfer amount in smallest units (wei for ETH)

Example:

"100000000000000000"

Response

200 - application/json

Successfully retrieved quotes

quotes
object[]
tokens
object[]