Transfer Endpoint
Execute a direct ERC20 or native token transfer on an EVM chain, or a SOL or SPL token transfer on Solana.
Endpoint
POST /wallet/transfer
Request Body
{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"recipientAddress": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "100",
"isNativeToken": false,
"chain": "base"
}
| Field | Type | Description |
|---|---|---|
tokenAddress | string | ERC20 contract address, or the zero address for native transfers; on solana, the token's base58 mint |
recipientAddress | string | Recipient EVM address, or a base58 address on solana — resolve ENS names, X handles and Farcaster usernames first with GET /addresses/resolve |
amount | string | Human-readable amount (e.g. "100" for 100 USDC) |
isNativeToken | boolean | true for the chain's native token (e.g. ETH, SOL), false for ERC20 or SPL |
chain | string | Optional: base (default), mainnet, polygon, arbitrum, unichain, worldchain, bnb, robinhood, arc, or solana |
Response
Success (200 OK)
{
"success": true,
"txHash": "0xabc123..."
}
On Solana, txHash is the base58 transaction signature.
Access Control
- Wallet API (
walletApiEnabled) required; read-only keys are rejected with 403 - Allowed recipients: If configured on the API key, the recipient must be in the list for the transfer's chain,
solanaon Solana andevmotherwise (403 otherwise), so a key with only one chain's list can't send on the other - Wallet security settings: a paused wallet answers 403; a transfer over the per-transaction or daily limit, or to an address outside the wallet's permitted recipients, answers 400 with the reason in
error - Gas: a wallet without enough native token for gas gets 400
insufficient_funds_for_gas - Reverted onchain: an EVM transfer that is mined but reverts gets 400
transfer_revertedwith amessageand thetxHash; nothing was sent, but the network fee was paid - Chain not enabled yet: a
chainBankr recognizes but hasn't enabled for transactions yet gets 400chain_disabledwith amessagenaming the chain; nothing is signed
Transfers are supported on all EVM chains and Solana. Omitting chain defaults to Base.
A Solana transfer sends from the wallet's Solana address and creates the recipient's token account when it has none. The Solana address pays the network fee and that account's rent, so it needs a little SOL; a send that would fail on-chain (too little SOL or token) gets 400 before anything is signed. A wallet with no Solana address gets 400; partner wallets get one when provisioned with wallet.solana: true. For native SOL, set isNativeToken: true and pass So11111111111111111111111111111111111111112 as tokenAddress; that mint always sends native SOL, even with isNativeToken: false, never wrapped SOL from a token account.
Examples
curl — Transfer USDC
curl -X POST https://api.bankr.bot/wallet/transfer \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"recipientAddress": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "10",
"isNativeToken": false
}'
curl — Transfer native ETH
curl -X POST https://api.bankr.bot/wallet/transfer \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"tokenAddress": "0x0000000000000000000000000000000000000000",
"recipientAddress": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "0.01",
"isNativeToken": true
}'
curl — Transfer USDC on Solana
curl -X POST https://api.bankr.bot/wallet/transfer \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"recipientAddress": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
"amount": "10",
"isNativeToken": false,
"chain": "solana"
}'