Skip to main content
POST
/
v1
/
wallets
/
{wallet_id}
/
transfer
Transfer
curl --request POST \
  --url https://api.privy.io/v1/wallets/{wallet_id}/transfer \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '
{
  "amount_type": "exact_input",
  "source": {
    "asset": "usdc",
    "amount": "10.5",
    "chain": "base"
  },
  "destination": {
    "asset": "usdc",
    "chain": "base",
    "address": "0xB00F0759DbeeF5E543Cc3E3B07A6442F5f3928a2"
  },
  "slippage_bps": 100
}
'
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "pending",
  "wallet_id": "fmfdj6yqly31huorjqzq38zc",
  "type": "transfer",
  "source_asset": "usdc",
  "source_amount": "10.5",
  "source_chain": "base",
  "destination_address": "0xB00F0759DbeeF5E543Cc3E3B07A6442F5f3928a2"
}
If your app has gas sponsorship configured, usage of the /transfer endpoint will be gas-sponsored by default. There is no need to specify additional parameters for sponsorship.
Cross-chain and cross-asset transfers accept an optional fee_configuration parameter to control fee distribution between Privy and your app. Use the quote endpoint to preview fees before executing a transfer.

Authorizations

Authorization
string
header
required

Basic Auth header with your app ID as the username and your app secret as the password.

Headers

privy-app-id
string
required

ID of your Privy app.

privy-authorization-signature
string

Request authorization signature. If multiple signatures are required, they should be comma separated.

privy-request-expiry
string

Request expiry. Value is a Unix timestamp in milliseconds representing the deadline by which the request must be processed.

privy-idempotency-key
string

Idempotency keys ensure API requests are executed only once within a 24-hour window.

Path Parameters

wallet_id
string
required

ID of the wallet.

Body

application/json

Request body for initiating a sponsored token transfer from an embedded wallet.

source
NamedTokenTransferSource · object
required

Source for a transfer identified by a named asset (e.g. "usdc", "eth"). Use this variant for first-class assets maintained by Privy.

Example:
{
"asset": "usdc",
"amount": "10.5",
"chain": "base"
}
destination
TokenTransferDestination · object
required

The destination address for a token transfer. Optionally specify a different asset or chain for cross-asset or cross-chain transfers.

Example:
{
"address": "0xB00F0759DbeeF5E543Cc3E3B07A6442F5f3928a2"
}
amount_type
enum<string>

Whether the amount refers to the input token or output token.

Available options:
exact_input,
exact_output
slippage_bps
integer

Maximum allowed slippage in basis points (1 bps = 0.01%). Only applicable for cross-chain or cross-asset transfers; omit to use the provider default.

Required range: 0 <= x <= 10000
fee_configuration
FeeConfiguration · object

Optional fee configuration for the transfer. If omitted, cross-chain transfers will not charge additional fees.

Example:
{ "type": "total_fee_bps", "value": 50 }

Response

200 - application/json

Transfer initiated successfully.

Response for a transfer action.

id
string
required

The ID of the wallet action.

status
enum<string>
required

The current status of the wallet action.

Available options:
pending,
succeeded,
rejected,
failed
wallet_id
string
required

The ID of the wallet involved in the action.

created_at
string<date-time>
required

ISO 8601 timestamp of when the wallet action was created.

type
enum<string>
required
Available options:
transfer
source_chain
string
required

Chain name (e.g. "base", "ethereum").

destination_address
string
required

Recipient address.

destination_amount
string | null
required

Amount received on the destination chain. Set at creation for same-chain transfers. Null until fill confirmation for cross-chain or cross-asset transfers.

failure_reason
FailureReason · object

Top-level failure context for the wallet action. Present on rejected or failed actions when available.

steps
(EVMTransactionWalletActionStep · object | EVMUserOperationWalletActionStep · object | SVMTransactionWalletActionStep · object | ExternalTransactionWalletActionStep · object)[]

The steps of the wallet action. Only returned if ?include=steps is provided.

A wallet action step consisting of an EVM transaction.

source_asset
string

Asset identifier (e.g. "usdc", "eth"). Present when the transfer was initiated with a named asset; omitted for custom-token transfers.

source_asset_address
string

Token contract address (EVM) or mint address (Solana). Present when the transfer was initiated with asset_address.

source_asset_decimals
integer

Number of decimals for the transferred token. Present when the transfer was initiated with asset_address and the decimals were resolved on-chain.

source_amount
string

Decimal amount sent on the source chain (e.g. "1.5"). Omitted for exact_output cross-chain transfers until the source amount is determined.

destination_asset
string

Destination asset for cross-asset transfers. Omitted for same-asset transfers.

destination_chain
string

Destination chain for cross-chain transfers. Omitted for same-chain transfers.

estimated_fees
(RelayerFee · object | PrivyFee · object | DeveloperFee · object)[] | null

Estimated fee breakdown from the provider quote. Only present for cross-chain or cross-asset transfers. Populated after on-chain confirmation.

Estimated fee paid to the relayer.

Example:
{
"type": "privy",
"recipient": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "0.20"
}
estimated_gas
Gas · object

Estimated source-chain gas cost from the provider quote. Only present for cross-chain or cross-asset transfers. Populated after on-chain confirmation.

Example:
{
"base_amount": "100000000000000",
"amount": "0.0001",
"gas_asset": "ETH"
}
fees
(RelayerFee · object | PrivyFee · object | DeveloperFee · object)[] | null

Actual fees paid for the transfer. Populated after on-chain confirmation. Only present for cross-chain transfers.

Estimated fee paid to the relayer.

Example:
{
"type": "privy",
"recipient": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "0.20"
}
gas
Gas · object

Actual source-chain gas cost. Populated after on-chain confirmation. Only present for cross-chain transfers.

Example:
{
"base_amount": "100000000000000",
"amount": "0.0001",
"gas_asset": "ETH"
}