Skip to main content

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.

The transfer API automatically supports bridging stablecoins and swapping between stablecoins of the same peg. To bridge, specify a destination.chain different from the source chain. To also swap the asset (e.g. USDC to USDT), specify a destination.asset.
Cross-chain transfers are powered by Relay. 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.

How it works

A cross-chain transfer creates two steps in the wallet action:
  1. Source chain transaction — the wallet signs and broadcasts a deposit transaction to the bridge contract on the source chain.
  2. Bridge fill — the bridge provider detects the deposit and delivers tokens to the destination address on the destination chain.
Privy polls the bridge provider status and marks the transfer succeeded once the fill is confirmed.

Usage

To bridge, include destination.chain in the request body. To swap assets (e.g. USDC on Base → USDC on Ethereum is a bridge; USDC on Base → ETH on Base is a swap, which is not supported via the bridge path), include destination.asset.
// Bridge USDC from Base to Ethereum
const response = await privy.wallets().transfer('insert-wallet-id', {
  source: {
    asset: 'usdc',
    amount: '10.0',
    chain: 'base',
  },
  destination: {
    address: '0xRecipientAddress',
    chain: 'ethereum',
  },
});

Cross-asset bridge

To bridge and swap the asset in a single operation, specify both destination.chain and destination.asset. Both assets must be USD-backed stablecoins, or both must be the same native token.
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 '{
    "source": {
      "asset": "usdc",
      "amount": "10.0",
      "chain": "polygon"
    },
    "destination": {
      "address": "GDoFGgZ5YrPPQPHhiKVkDk3wS4gngcS6rYqXUmYxdQvg",
      "chain": "solana",
      "asset": "usdg"
    }
  }'

Solana as source chain

Solana wallets can bridge to EVM chains. The transaction is signed by the wallet’s Solana key and submitted to the bridge contract on Solana.
curl -X POST https://api.privy.io/v1/wallets/{solana_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 '{
    "source": {
      "asset": "usdc",
      "amount": "5.0",
      "chain": "solana"
    },
    "destination": {
      "address": "0xRecipientAddress",
      "chain": "base"
    }
  }'

Supported routes

Cross-chain transfers are supported between the following chains:
Source chainSupported destination chains
EthereumBase, Arbitrum, Polygon, Solana
BaseEthereum, Arbitrum, Polygon, Solana
ArbitrumEthereum, Base, Polygon, Solana
PolygonEthereum, Base, Arbitrum, Solana
SolanaEthereum, Base, Arbitrum, Polygon
For each route, the bridge provider must have sufficient liquidity. If a route is unavailable, the transfer returns an error at quote time.

Limitations

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 for token swaps on a single chain.
Cross-chain transfers are only supported for named assets (usdc, usdt, usdg, eth, etc.). Custom tokens specified via asset_address cannot be bridged.
The amount_type: 'exact_output' parameter is not supported for cross-chain transfers. Only exact_input (the default) is supported — the source amount is fixed and the destination amount varies based on bridge pricing and fees.
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.
Mainnet-to-testnet and testnet-to-mainnet bridges are not supported. The source and destination chains must both be mainnet or both be testnet.

Tracking a bridge transfer

Bridge transfers follow the standard 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 webhook event.

API reference

See the API reference for the full parameter reference.