> ## 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.

# Bridging

The [transfer API](/wallets/actions/transfer/overview) automatically supports bridging assets across chains and converting between stablecoins of the same peg.

<Note>
  Cross-chain transfers are powered by [Relay](https://relay.link). Privy does not control bridge
  routing, fill times, or available liquidity. Transfer rates may differ from quoted estimates due
  to market conditions. These materials are for general information purposes only and are not
  investment advice.
</Note>

## Usage

To execute a transfer involving a bridge, specify a `destination.chain` different from `source.chain`.

To execute a transfer involving a stablecoin conversion, specify a `destination.asset` different from `source.asset`.

You can also combine both a bridge and a stablecoin conversion in the same transfer call.

<View title="NodeJS" icon="node-js">
  ```typescript theme={"system"}
  // Bridge USDC from Tempo to Ethereum (exact_input is the default)
  const response = await privy.wallets().transfer('insert-wallet-id', {
    amount: '10.0',
    amount_type: 'exact_input',
    source: {
      asset: 'usdc',
      chain: 'tempo',
    },
    destination: {
      address: '0xRecipientAddress',
      chain: 'ethereum',
    },
  });
  ```
</View>

<View title="REST API" icon="terminal">
  ```bash theme={"system"}
  curl -X POST https://api.privy.io/v1/wallets/{wallet_id}/transfer \
    -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": "ethereum"
      }
    }'
  ```

  ```json Example response theme={"system"}
  {
    "id": "action-id",
    "status": "pending",
    "wallet_id": "wallet-id",
    "created_at": "2026-04-14T20:09:11.929Z",
    "type": "transfer",
    "source_asset": "usdc",
    "source_amount": "10.0",
    "source_chain": "tempo",
    "destination_address": "0xRecipientAddress",
    "destination_chain": "ethereum"
  }
  ```
</View>

## Amount types

The `amount_type` parameter controls whether the specified `amount` refers to what leaves the source wallet or what arrives at the destination. It defaults to `exact_input`.

|                          | `exact_input` (default)                                 | `exact_output`                                    |
| ------------------------ | ------------------------------------------------------- | ------------------------------------------------- |
| **What `amount` means**  | The amount deducted from the source wallet              | The guaranteed amount the recipient receives      |
| **What varies**          | Destination amount (depends on fees and bridge pricing) | Source amount (estimated by the bridge provider)  |
| **When to use**          | Sending a known balance or fixed spend                  | Guaranteeing a recipient receives an exact payout |
| **Quote field to check** | `estimated_output_amount`                               | `estimated_input_amount`                          |

To guarantee an exact destination amount, set `amount_type: 'exact_output'` and specify the desired payout in `amount`. Use the [quote endpoint](/wallets/actions/transfer/quote) to preview the estimated source cost before executing.

For `exact_output` transfers, the `source_amount` field on the action response is `null` at creation and populated once the transfer is confirmed on-chain.

<Warning>Exact output bridging is not yet supported when Solana is the source chain.</Warning>

## Limitations

<AccordionGroup>
  <Accordion title="Supported bridging and conversion routes">
    Cross-asset bridges are only supported between assets of the same economic category:

    * **USD-backed stablecoins** can be bridged to other USD-backed stablecoins (e.g. USDC → USDT, USDC → USDG).
    * **Native tokens** can only be bridged to the same native token on another chain (e.g. ETH on Base → ETH on Ethereum).
    * **Cross-category swaps are not supported** — native tokens cannot be exchanged for stablecoins via the bridge path. Use the [swap API](/wallets/actions/swap/overview) for token swaps on a single chain.
  </Accordion>

  <Accordion title="Custom tokens not supported for bridging or stablecoin conversions">
    Cross-chain transfers are only supported for well-known assets (`usdc`, `usdt`, `usdg`, `eth`,
    etc.). Custom tokens specified via `asset_address` cannot be bridged.
  </Accordion>

  <Accordion title="Solana not yet supported as source for exact_output">
    The `amount_type: 'exact_output'` parameter is not yet supported when the source chain is Solana.
    Solana-sourced transfers only support `exact_input` (the default).
  </Accordion>

  <Accordion title="Testnet support">
    Testnet bridging is available between `base_sepolia` and `ethereum_sepolia`. Other testnet cross-chain routes may have limited availability depending on the bridge provider's testnet infrastructure.

    Testnet bridges are best-effort and may have slower fill times than mainnet.
  </Accordion>

  <Accordion title="Source and destination must be on the same network">
    Mainnet-to-testnet and testnet-to-mainnet bridges are not supported. The source and destination chains must both be mainnet or both be testnet.
  </Accordion>
</AccordionGroup>

## Tracking a bridge transfer

Bridge transfers follow the standard [wallet action lifecycle](/wallets/actions/overview#wallet-action-lifecycle). The action status progresses:

1. `pending` — source chain transaction submitted; bridge fill in progress.
2. `succeeded` — bridge fill confirmed on destination chain.
3. `failed` — the bridge fill was not completed (e.g. insufficient liquidity, expired quote).

Bridge fills typically complete within seconds on mainnet. During periods of high network activity, fills may take longer.

To receive a notification when the bridge completes, listen for the [`wallet_action.transfer.succeeded`](/api-reference/webhooks/wallet-action/transfer/succeeded) webhook event.

## API reference

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