Skip to main content

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"
}
FieldTypeDescription
tokenAddressstringERC20 contract address, or the zero address for native transfers; on solana, the token's base58 mint
recipientAddressstringRecipient EVM address, or a base58 address on solana — resolve ENS names, X handles and Farcaster usernames first with GET /addresses/resolve
amountstringHuman-readable amount (e.g. "100" for 100 USDC)
isNativeTokenbooleantrue for the chain's native token (e.g. ETH, SOL), false for ERC20 or SPL
chainstringOptional: 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, solana on Solana and evm otherwise (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_reverted with a message and the txHash; nothing was sent, but the network fee was paid
  • Chain not enabled yet: a chain Bankr recognizes but hasn't enabled for transactions yet gets 400 chain_disabled with a message naming the chain; nothing is signed
note

Transfers are supported on all EVM chains and Solana. Omitting chain defaults to Base.

Solana wallets

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"
}'