Skip to main content
The transfer wallet action API sends tokens from a Privy wallet to a destination address. Instead of constructing blockchain transactions from scratch, the transfer action accepts a human-readable asset, amount, chain, and destination address — Privy handles the onchain complexity.
The /transfer API supports the following assets:
AssetAPI value
USDCusdc
USDTusdt
USDBusdb
EURCeurc
ETHeth
POLpol
The /transfer API supports the following chains:
ChainCAIP-2API value
Ethereumeip155:1ethereum
Baseeip155:8453base
Arbitrumeip155:42161arbitrum
Polygoneip155:137polygon
Ethereum Sepoliaeip155:11155111ethereum_sepolia
Base Sepoliaeip155:84532base_sepolia
Arbitrum Sepoliaeip155:421614arbitrum_sepolia
Polygon Amoyeip155:80002polygon_amoy
To transfer assets or chains not listed above, use the low-level RPC API to construct and send transactions directly.

Usage

To execute a transfer, make a POST request to /v1/wallets/{wallet_id}/transfer.

Body

amount
string
required
The amount of tokens to transfer, as a decimal string in standard units (e.g. "10.0" for 10 USDC). The API handles decimal precision based on the asset — stablecoins like USDC use six decimal places, while native tokens like ETH use 18. There is no need to convert to the smallest unit (e.g. wei or micro-units) before sending the request.
source
object
required
The source asset and chain for the transfer.
destination
object
required
The destination for the transfer.

Response

The endpoint returns a 200 response with a pending wallet action resource.
The transfer action is processed asynchronously. The response contains a pending wallet action resource with status: "pending" that Privy processes in the background.
id
string
The unique identifier for the wallet action.
wallet_id
string
The ID of the wallet initiating the transfer.
type
'transfer'
The type of action. For transfers, this is always transfer.
status
'pending' | 'completed' | 'failed'
The current status of the action.
source
{asset: string, chain: string}
The source asset and chain for the transfer.
destination
{asset: string, address: string, chain: string}
The destination asset, chain, and address for the transfer.
balance_changes
array
A list of balance changes resulting from the action. Empty while the action is pending.
steps
array
A list of steps executed as part of the action. Empty while the action is pending.
To track the status of a transfer, see wallet action lifecycle.

Example

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",
      "chain": "base"
    },
    "destination": {
      "address": "0xRecipientAddress",
    },
    "amount": "10.0"
  }'
Example response
{
  "id": "action-id",
  "wallet_id": "wallet-id",
  "type": "transfer",
  "status": "pending",
  "source": {
    "asset": "usdc",
    "chain": "base"
  },
  "destination": {
    "address": "0xRecipientAddress"
  },
  "balance_changes": [],
  "steps": []
}

API reference

See the API reference for more details.