> ## Documentation Index
> Fetch the complete documentation index at: https://docs.layerzero.network/llms.txt
> Use this file to discover all available pages before exploring further.

# Request Quotes

> Request cross-chain transfer quotes with fees, routes, and execution steps.

Returns one or more quotes for cross-chain transfers, each with fee breakdowns, estimated duration, and execution steps.

***

## Reference

### Request body

| Parameter                     | Type   | Required | Description                                               |
| ----------------------------- | ------ | -------- | --------------------------------------------------------- |
| `amount`                      | string | Yes      | Amount in smallest units (wei for ETH, lamports for SOL)  |
| `srcChainKey`                 | string | Yes      | Source chain identifier (for example, `base`, `ethereum`) |
| `srcTokenAddress`             | string | Yes      | Source token contract address                             |
| `srcWalletAddress`            | string | Yes      | Sender wallet address                                     |
| `dstChainKey`                 | string | Yes      | Destination chain identifier                              |
| `dstTokenAddress`             | string | Yes      | Destination token contract address                        |
| `dstWalletAddress`            | string | Yes      | Recipient wallet address                                  |
| `options`                     | object | No       | Optional transfer configuration                           |
| `options.amountType`          | enum   | No       | `EXACT_SRC_AMOUNT` (default)                              |
| `options.feeTolerance`        | object | No       | Maximum acceptable fee variance                           |
| `options.feeTolerance.type`   | string | No       | `PERCENT`                                                 |
| `options.feeTolerance.amount` | number | No       | Tolerance percentage (0-100). Default: `1`                |
| `options.dstNativeDropAmount` | string | No       | Native gas drop on destination. Default: `0`              |

## Response

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

### Quote attributes

| Attribute                     | Type           | Description                                                   |
| ----------------------------- | -------------- | ------------------------------------------------------------- |
| `id`                          | string         | Unique quote identifier (becomes transfer ID after execution) |
| `routeSteps`                  | array          | Array of route segments with protocol types                   |
| `fees`                        | array          | Detailed fee breakdown by chain and type                      |
| `duration`                    | object         | Estimated transfer duration                                   |
| `duration.estimated`          | string or null | Duration in milliseconds (null if unknown)                    |
| `feeUsd`                      | string         | Total fees in USD                                             |
| `feePercent`                  | string         | Fee as percentage of transfer amount                          |
| `srcAmount`                   | string         | Exact amount leaving source chain                             |
| `dstAmount`                   | string         | Expected amount on destination chain                          |
| `dstAmountMin`                | string         | Minimum guaranteed amount (with slippage protection)          |
| `srcAmountUsd`                | string         | Source amount in USD                                          |
| `dstAmountUsd`                | string         | Destination amount in USD                                     |
| `userSteps`                   | array          | Actions to execute (transactions or signatures)               |
| `options`                     | object         | Transfer options                                              |
| `options.dstNativeDropAmount` | string         | Native gas drop configuration                                 |
| `expiresAt`                   | string         | Quote expiration timestamp (may not be present on all quotes) |

### Route step attributes

| Attribute     | Type   | Description                                      |
| ------------- | ------ | ------------------------------------------------ |
| `type`        | enum   | Route protocol (see [Route types](#route-types)) |
| `srcChainKey` | string | Chain where this step executes                   |
| `description` | string | Human-readable step description                  |

### Fee attributes

| Attribute     | Type   | Description                                             |
| ------------- | ------ | ------------------------------------------------------- |
| `chainKey`    | string | Chain where fee is paid                                 |
| `type`        | enum   | `MESSAGE`, `GENERAL`, `DST_NATIVE_DROP`, `CCTP_RECEIVE` |
| `description` | string | Human-readable fee description                          |
| `amount`      | string | Fee amount in token units                               |
| `address`     | string | Token address for fee                                   |

### User step types

User steps can be `TRANSACTION` or `SIGNATURE`:

**TRANSACTION step:**

```typescript wrap theme={null}
{
  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):**

```typescript wrap theme={null}
{
  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:

| Step    | `transaction.encoded.to`          | Purpose                                                                                                     |
| ------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Approve | ERC20 token contract (e.g., USDC) | Calls `approve(TransferDelegate, amount)`. The TransferDelegate address is encoded inside the `data` field. |
| Bridge  | **LZMulticall** contract          | Routes the bridge transaction through LayerZero's feeWrapper.                                               |

<Danger>
  **Never approve the LZMulticall (Wrapper) as a token spender**

  LZMulticall 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](/v2/developers/value-transfer-api/contracts/overview) for details on the contract architecture.
</Danger>

### Route types

The API evaluates multiple protocols and returns the best routes:

| Type               | Description                   |
| ------------------ | ----------------------------- |
| `OFT`              | OFT Standard transfers        |
| `STARGATE_V2_TAXI` | Stargate V2 instant transfers |
| `STARGATE_V2_BUS`  | Stargate V2 batched transfers |
| `CCTP`             | Circle CCTP for native USDC   |
| `AORI`             | Intent-based swaps via Aori   |

## Code examples

### EVM transfer

<Tabs>
  <Tab title="cURL">
    ```bash wrap theme={null}
    curl -X POST "https://transfer.layerzero-api.com/v1/quotes" \
      -H "Content-Type: application/json" \
      -H "x-api-key: YOUR_API_KEY" \
      -d '{
        "srcChainKey": "base",
        "dstChainKey": "arbitrum",
        "srcTokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "dstTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
        "srcWalletAddress": "0x1234567890123456789012345678901234567890",
        "dstWalletAddress": "0x1234567890123456789012345678901234567890",
        "amount": "1000000"
      }'
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript wrap theme={null}
    const response = await fetch('https://transfer.layerzero-api.com/v1/quotes', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-api-key': 'YOUR_API_KEY',
      },
      body: JSON.stringify({
        srcChainKey: 'base',
        dstChainKey: 'arbitrum',
        srcTokenAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
        dstTokenAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
        srcWalletAddress: '0x1234567890123456789012345678901234567890',
        dstWalletAddress: '0x1234567890123456789012345678901234567890',
        amount: '1000000',
      }),
    });

    const {quotes} = await response.json();
    console.log('Quote ID:', quotes[0].id);
    console.log('Fee:', quotes[0].feeUsd, 'USD');
    ```
  </Tab>

  <Tab title="Python">
    ```python wrap theme={null}
    import requests

    response = requests.post(
      "https://transfer.layerzero-api.com/v1/quotes",
      headers={"x-api-key": "YOUR_API_KEY"},
      json={
        "srcChainKey": "base",
        "dstChainKey": "arbitrum",
        "srcTokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "dstTokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
        "srcWalletAddress": "0x1234567890123456789012345678901234567890",
        "dstWalletAddress": "0x1234567890123456789012345678901234567890",
        "amount": "1000000",
      },
    )

    quote = response.json()["quotes"][0]
    print(f"Quote ID: {quote['id']}")
    print(f"Fee: {quote.get('feeUsd', 'N/A')} USD")
    ```
  </Tab>
</Tabs>

### Response

```json wrap theme={null}
{
  "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:

```json wrap theme={null}
{
  "error": {
    "status": 4000,
    "message": "Invalid input",
    "issues": [
      {
        "message": "Invalid source token"
      }
    ]
  },
  "quotes": []
}
```

Check the `error` field before processing quotes:

```typescript wrap theme={null}
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.

```typescript wrap theme={null}
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');
  }
}
```

## Related endpoints

* [Build user steps](./build-user-steps) — Generate fresh transaction data for Solana transfers
* [Submit signature](./submit-signature) — Submit EIP-712 signatures for intent-based routes
* [Status](./status) — Track transfer progress after execution

## Examples

* [EVM Example](../examples/evm) — Complete transfer with viem
* [Solana Example](../examples/solana) — Complete Solana transfer


## OpenAPI

````yaml POST /quotes
openapi: 3.0.3
info:
  title: Value Transfer API
  version: 1.0.0
  description: Unified API for cross-chain value transfers across 150+ blockchains
servers:
  - url: https://transfer.layerzero-api.com/v1
security: []
paths:
  /quotes:
    post:
      tags:
        - Transfer
      summary: Get transfer quotes
      description: >-
        Request quotes for a cross-chain transfer. Returns one or more quotes
        with fees, estimated duration, and transaction steps to execute.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - srcChainKey
                - dstChainKey
                - srcTokenAddress
                - dstTokenAddress
                - srcWalletAddress
                - dstWalletAddress
                - amount
              properties:
                srcChainKey:
                  type: string
                  description: Source chain key (for example, 'base', 'arbitrum')
                  example: base
                dstChainKey:
                  type: string
                  description: Destination chain key
                  example: optimism
                srcTokenAddress:
                  type: string
                  description: Source token address (use 0xEeee...EEeE for native ETH)
                  example: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
                dstTokenAddress:
                  type: string
                  description: Destination token address
                  example: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
                srcWalletAddress:
                  type: string
                  description: Sender wallet address
                  example: '0x1234567890123456789012345678901234567890'
                dstWalletAddress:
                  type: string
                  description: Recipient wallet address
                  example: '0x1234567890123456789012345678901234567890'
                amount:
                  type: string
                  description: Transfer amount in smallest units (wei for ETH)
                  example: '100000000000000000'
      responses:
        '200':
          description: Successfully retrieved quotes
          content:
            application/json:
              schema:
                type: object
                properties:
                  quotes:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        feeUsd:
                          type: string
                        feePercent:
                          type: string
                        srcAmount:
                          type: string
                        dstAmount:
                          type: string
                        routeSteps:
                          type: array
                          items:
                            type: object
                            properties:
                              type:
                                type: string
                              srcChainKey:
                                type: string
                        userSteps:
                          type: array
                          items:
                            type: object
                            properties:
                              type:
                                type: string
                              chainKey:
                                type: string
                              chainType:
                                type: string
                  tokens:
                    type: array
                    items:
                      type: object
                example:
                  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: []
      security:
        - apiKey: []
components:
  securitySchemes:
    apiKey:
      type: apiKey
      name: x-api-key
      in: header
      description: >-
        API key for authenticating requests. Required for /quotes,
        /build-user-steps, /submit-signature, and /status endpoints.

````