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

# Quote transfer fees

> Get a fee estimate and expected output amount before executing a transfer

The transfer quote endpoint returns a fee breakdown and estimated output amount for a cross-chain or cross-asset transfer before executing it. Use quotes to show users what they will receive and what fees apply before they confirm a transfer.

<Info>
  The quote endpoint is only supported for cross-chain or cross-asset transfers (i.e. those that
  specify `destination.chain` or `destination.asset`). Same-chain, same-asset transfers do not
  require a quote.
</Info>

## Understanding fees

Every cross-chain transfer includes up to three fee components:

* **Relayer fee** — paid to the bridge provider for routing the transfer. This varies with network conditions and liquidity.
* **Developer fee** — fees to the app developer.

Fees are denominated in USD and deducted from the transfer amount. The `estimated_output_amount` already reflects all fees — it is what the recipient will receive.

## Usage

To get a quote via REST API, make a `POST` request to :

```bash theme={"system"}
https://api.privy.io/v1/wallets/{wallet_id}/transfer/quote
```

### Body

<ParamField body="source" type="object" required>
  The source asset, amount, and chain for the transfer.

  <Expandable title="properties" defaultOpen>
    <ParamField body="source.asset" type="string" required>
      The asset to transfer. Must be one of `usdc`, `usdc_e`, `usdt`, `usdt0`, `usdb`, `eth`, `sol`,
      `pol`, or `eurc`. Custom token addresses (`asset_address`) are not supported for cross-chain
      transfers.
    </ParamField>

    <ParamField body="source.chain" type="string" required>
      The chain to transfer from. Must be one of `ethereum`, `base`, `arbitrum`, `polygon`, `tempo`,
      or `solana`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="destination" type="object" required>
  The destination for the transfer.

  <Expandable title="properties" defaultOpen>
    <ParamField body="destination.address" type="string" required>
      The recipient wallet address.
    </ParamField>

    <ParamField body="destination.chain" type="string">
      The destination chain. Required for cross-chain transfers. Must differ from `source.chain`.
    </ParamField>

    <ParamField body="destination.asset" type="string">
      The destination asset. Required for cross-asset transfers. Must be a USD-backed stablecoin if
      `source.asset` is a USD-backed stablecoin, or the same native token on another chain.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="amount" type="string">
  Amount as a decimal string in standard units (e.g. `"10.0"` for 10 USDC). For `exact_input`, the
  amount to send. For `exact_output`, the exact amount to receive. Takes precedence over
  `source.amount` when both are provided.
</ParamField>

<ParamField body="amount_type" type="'exact_input' | 'exact_output'">
  Whether the amount refers to the input token (`exact_input`) or the output token (`exact_output`).
  Defaults to `exact_input`. When set to `exact_output`, the quote returns the estimated source
  amount needed to deliver the specified destination amount.
</ParamField>

<ParamField body="fee_configuration" type="object">
  Optional fee configuration to apply to the transfer.

  <Expandable title="properties">
    <ParamField body="fee_configuration.type" type="'total_fee_bps'" required>
      The fee configuration type. Currently only `total_fee_bps` is supported.
    </ParamField>

    <ParamField body="fee_configuration.value" type="number" required>
      Total fee cap in basis points (0–10000). For example, `100` represents 1%.
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="amount_type" type="'exact_input' | 'exact_output'">
  The amount type from the request, echoed back for clarity.
</ResponseField>

<ResponseField name="source" type="object">
  The source asset, amount, and chain from the request.
</ResponseField>

<ResponseField name="destination" type="object">
  The destination address, asset, and chain from the request.
</ResponseField>

<ResponseField name="estimated_input_amount" type="string">
  The estimated amount the sender provides, as a decimal string in source token units. For
  `exact_input`, this equals the source amount. For `exact_output`, this is the estimated amount
  needed to deliver the requested destination amount.
</ResponseField>

<ResponseField name="estimated_output_amount" type="string">
  The estimated amount the recipient will receive, as a decimal string in destination token units
  (e.g. `"9.97"` for 9.97 USDC). For `exact_output`, this equals the requested amount.
</ResponseField>

<ResponseField name="estimated_fees" type="FeeLineItem[]">
  An array of fee line items that make up the total transfer cost. Each item has a `type` and an
  `amount` in USD.

  <Expandable title="Fee line item types">
    | Type        | Description                                |
    | ----------- | ------------------------------------------ |
    | `relayer`   | Fee charged by the bridge/relayer provider |
    | `developer` | Fee allocated to the app developer         |
  </Expandable>
</ResponseField>

<ResponseField name="expires_at" type="number">
  Unix timestamp (in seconds) after which the quote is no longer accepted. Executing the transfer
  before this time gives the best chance of matching the quoted output amount and fees. Quoted
  amounts are estimates — actual results may vary slightly if market conditions shift between quote
  and execution.
</ResponseField>

## Examples

<Tip>
  Quotes are best-effort estimates. Executing a transfer close to the time of the quote improves the
  likelihood of matching the quoted output and fees, but small deviations are possible if market
  conditions shift between quote and execution.
</Tip>

<Accordion title="Example (exact_input)">
  <Tabs>
    <Tab title="Node SDK">
      ```typescript theme={"system"}
      const quote = await privy.wallets().transferQuote('insert-wallet-id', {
        amount: '10.0',
        amount_type: 'exact_input',
        source: {
          asset: 'usdc',
          chain: 'tempo',
        },
        destination: {
          address: '0xRecipientAddress',
          chain: 'arbitrum',
        },
        fee_configuration: {
          type: 'total_fee_bps',
          value: 80,
        },
      });
      ```
    </Tab>

    <Tab title="REST API">
      ```bash theme={"system"}
      curl -X POST https://api.privy.io/v1/wallets/{wallet_id}/transfer/quote \
        -u "<your-privy-app-id>:<your-privy-app-secret>" \
        -H "privy-app-id: <your-privy-app-id>" \
        -H "Content-Type: application/json" \
        -d '{
          "amount": "10.0",
          "amount_type": "exact_input",
          "source": {
            "asset": "usdc",
            "chain": "tempo"
          },
          "destination": {
            "address": "0xRecipientAddress",
            "chain": "arbitrum"
          },
          "fee_configuration": {
            "type": "total_fee_bps",
            "value": 80
          }
        }'
      ```

      ```json Example response theme={"system"}
      {
        "amount": "10.0",
        "amount_type": "exact_input",
        "source": {
          "asset": "usdc",
          "chain": "tempo"
        },
        "destination": {
          "address": "0xRecipientAddress",
          "chain": "arbitrum"
        },
        "estimated_output_amount": "9.94",
        "estimated_fees": [
          {
            "type": "relayer",
            "amount": "0.02"
          },
          {
            "type": "developer",
            "recipient": "0x1234567890abcdef1234567890abcdef12345678",
            "amount": "0.04"
          }
        ],
        "expires_at": 1715200000
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

<Accordion title="Example (exact_output)">
  To quote a transfer where the recipient receives exactly 100 USDC on Arbitrum, regardless of fees:

  <Tabs>
    <Tab title="Node SDK">
      ```typescript theme={"system"}
      const quote = await privy.wallets().transferQuote('insert-wallet-id', {
        amount: '100.0',
        amount_type: 'exact_output',
        source: {
          asset: 'usdc',
          chain: 'tempo',
        },
        destination: {
          address: '0xRecipientAddress',
          chain: 'arbitrum',
        },
      });

      // quote.estimated_input_amount — estimated source amount needed (e.g. "100.06")
      // quote.estimated_output_amount — guaranteed destination amount ("100.0")
      ```
    </Tab>

    <Tab title="REST API">
      ```bash theme={"system"}
      curl -X POST https://api.privy.io/v1/wallets/{wallet_id}/transfer/quote \
        -u "<your-privy-app-id>:<your-privy-app-secret>" \
        -H "privy-app-id: <your-privy-app-id>" \
        -H "Content-Type: application/json" \
        -d '{
          "amount": "100.0",
          "amount_type": "exact_output",
          "source": {
            "asset": "usdc",
            "chain": "tempo"
          },
          "destination": {
            "address": "0xRecipientAddress",
            "chain": "arbitrum"
          }
        }'
      ```

      ```json Example response theme={"system"}
      {
        "amount": "100.0",
        "amount_type": "exact_output",
        "source": {
          "asset": "usdc",
          "chain": "tempo"
        },
        "destination": {
          "address": "0xRecipientAddress",
          "chain": "arbitrum"
        },
        "estimated_input_amount": "100.06",
        "estimated_output_amount": "100.0",
        "estimated_fees": [
          {
            "type": "relayer",
            "amount": "0.04"
          }
        ],
        "expires_at": 1715200000
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

## Quote expiry

Quotes expire quickly — typically within a few minutes. Executing a transfer after `expires_at` means the quoted output and fees no longer apply — the transfer will proceed but at current market rates. Fetch a fresh quote before each transfer execution.

## Limitations

<AccordionGroup>
  <Accordion title="Same-chain transfers not supported">
    The quote endpoint requires either `destination.chain` or `destination.asset` to differ from the
    source. Same-chain, same-asset transfers have no fees to quote.
  </Accordion>

  <Accordion title="Custom tokens not supported">
    Transfers using `asset_address` (custom token contracts) are not supported for cross-chain
    quotes. Only named assets (`usdc`, `usdt`, `eth`, etc.) can be quoted.
  </Accordion>
</AccordionGroup>

## API reference

See the [API reference](/api-reference/wallets/transfer/quote) for the full parameter reference.
