Request
Create an outbound transfer to send cryptocurrency from a customer’s balance to an external address.
Transfer fees
Network Fee Polygon 1 USDT Arbitrum 1 USDT Optimism 1 USDT Tron 1 USDT Ethereum 3-25 USDT (dynamic based on gas prices)
Bitcoin transfer fees are dynamic based on current network congestion. All Bitcoin transfers are sent with fast priority to ensure quick confirmation. Fees typically range from 0.00001-0.0005 BTC depending on mempool conditions.
The fee is deducted from the customer’s balance in addition to the transfer amount. The response includes amount_gross (total deducted), amount_net (amount received by destination), and fee.
Body parameters
Customer initiating the transfer
Asset to transfer: USDT or BTC
Blockchain network:
For USDT: polygon, arbitrum, optimism, tron, ethereum
For BTC: bitcoin
Amount to send in the asset’s smallest unit (as string). This is the net amount the recipient will receive.
USDT: 6 decimals (e.g., "100000000" = 100 USDT)
BTC: 8 decimals (e.g., "1000000" = 0.01 BTC)
External address to send funds to
Unique key to prevent duplicate transfers
The customer must have sufficient balance. The amount_gross (amount + fee) will be deducted from their balance.
Response
Unique transfer identifier
Customer who initiated the transfer
Transfer direction: outbound
Total amount deducted from customer balance in smallest unit (amount_net + fee)
Amount the recipient will receive in smallest unit
Network fee charged in smallest unit
Decimal places for the asset (6 for USDT, 8 for BTC)
Transfer status: pending, processing, confirmed, failed
Transaction hash (available after broadcast)
cURL - USDT Transfer (100 USDT)
cURL - Bitcoin Transfer (0.01 BTC)
Python
Node.js
curl -X POST https://api.bipa.tech/v1/onchain/transfers \
-H "Authorization: Bearer bipa_live_sk_..." \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cus_a1b2c3d4e5f6",
"asset": "USDT",
"network": "polygon",
"amount": "100000000",
"destination_address": "0xabcdef1234567890abcdef1234567890abcdef12",
"idempotency_key": "txn_unique_456"
}'
201 Created - USDT (100 USDT + 1 USDT fee)
201 Created - Bitcoin (0.01 BTC + 0.00005 BTC fee)
400 Insufficient Balance
400 Invalid Address
400 Transfers Disabled
{
"id" : "txn_xyz789" ,
"customer_id" : "cus_a1b2c3d4e5f6" ,
"direction" : "outbound" ,
"asset" : "USDT" ,
"network" : "polygon" ,
"amount_gross" : "101000000" ,
"amount_net" : "100000000" ,
"fee" : "1000000" ,
"decimals" : 6 ,
"status" : "pending" ,
"destination_address" : "0xabcdef1234567890abcdef1234567890abcdef12" ,
"tx_hash" : null ,
"idempotency_key" : "txn_unique_456" ,
"created_at" : "2024-01-15T10:30:00Z"
}
Address validation
Bipa validates destination addresses before processing:
Ethereum-compatible : Checksum validation
Bitcoin : Bech32 (bc1…) and legacy (1…, 3…) formats
Tron : Base58 format starting with T
Always confirm the network and address with your user before submitting. Transactions to incorrect addresses cannot be reversed.