Bank transfers are fully API-driven. There is no SDK involved — your backend creates the ramp, and the API returns payment instructions for the user to complete the transfer. This makes bank transfer the simplest Native API integration path: no platform setup, no payment sheet.
This guide covers on-ramp (fiat → crypto) and off-ramp (crypto → fiat) via bank transfer. Identity creation, KYC, eligibility, and pricing are covered in the Integration Guide — start there if you haven't set those up yet. This guide picks up from paymentReady: true.
Once your backend confirms paymentReady: true, create the ramp with POST /eapi/v0/ramps. Pass the fiat currency, payment method, crypto asset, blockchain, and wallet address. Set either fiatAmount or cryptoAmount — not both.
POST /eapi/v0/ramps
Content-Type: application/json
{
"identityReference": "partner-abc123",
"source": {
"fiat": {
"id": "AUD",
"method": "payid-bank-transfer"
}
},
"target": {
"crypto": {
"id": "USDT",
"blockchain": "TRON",
"walletAddress": "TYDzsYUEpvnYmQk4zGP9sWWcTEd2MiAtW6"
}
},
"fiatAmount": "500.00"
}Use the same identityReference you used for eligibility.
The response includes sourceDepositInstructions — the details the user needs to complete the bank transfer. Display these in your UI.
{
"id": "b7f1ffbb2f1bd7a5e2ba152b4049d234",
"status": "INITIALIZED",
"source": {
"fiat": { "id": "AUD", "method": "payid-bank-transfer" },
"amount": "500.00"
},
"target": {
"crypto": {
"id": "USDT",
"blockchain": "TRON",
"walletAddress": "TYDzsYUEpvnYmQk4zGP9sWWcTEd2MiAtW6"
},
"amount": "324.51"
},
"sourceDepositInstructions": {
"recipientEmail": "[email protected]",
"depositReference": "BNX-12345678"
},
"receipt": {
"gatewayFee": "2.50",
"networkFee": "2.00",
"sourceAmount": "500.00",
"targetAmount": "324.51"
},
"createdAt": "2026-04-17T03:45:00.000Z"
}The instruction fields vary by payment method — for PayID, recipientEmail and depositReference are returned. The user sends the transfer from their bank, using the deposit reference so Banxa can match the payment.
Instruct users to include the depositReference when making the transfer. Without it, Banxa cannot match the payment to the transaction.
For off-ramp transactions, include the user's bank account instructions in the request — Banxa needs these to pay out the fiat.
The fields required depend on the payment method. For PayID (AUD):
POST /eapi/v0/ramps
Content-Type: application/json
{
"identityReference": "partner-abc123",
"source": {
"crypto": {
"id": "USDT",
"blockchain": "TRON",
"walletAddress": "TYDzsYUEpvnYmQk4zGP9sWWcTEd2MiAtW6"
}
},
"target": {
"fiat": {
"id": "AUD",
"method": "payid-bank-transfer",
"instructions": [
{
"accountName": "Jane Smith",
"accountNumber": "12345678",
"bsb": "063123"
}
]
}
},
"cryptoAmount": "100.00"
}The response returns a crypto deposit address. The user sends their crypto to this address — once Banxa receives it, the fiat payout is initiated.
{
"id": "c8g2ggcc3g2ce8b6f3cb263b5150e345",
"status": "AWAITING_FUNDS",
"source": {
"crypto": {
"id": "USDT",
"blockchain": "TRON",
"walletAddress": "TYDzsYUEpvnYmQk4zGP9sWWcTEd2MiAtW6"
},
"amount": "100.00"
},
"target": {
"fiat": { "id": "AUD", "method": "payid-bank-transfer" },
"amount": "150.20"
},
"sourceDepositInstructions": {
"depositAddress": "TBanxaDepositAddress123456"
}
}Optionally, lock the exchange rate before creating the ramp. Get a quote first:
GET /eapi/v0/quote?fiat=AUD&crypto=USDT&blockchain=TRON&method=payid-bank-transfer&transactionType=ONRAMP&fiatAmount=500The response includes a quoteId valid for 3 minutes. Pass it in your ramp creation request:
{
"identityReference": "partner-abc123",
"quoteId": "q_abc123xyz"
}The source, target, and amount are inferred from the quote — you don't repeat them in the request body.
The quoteId is currently only accepted by POST /eapi/v0/ramps. If you are building a card or mobile wallet flow, use indicative pricing (GET /eapi/v0/price) instead.
Bank transfers are asynchronous — the user completes the transfer independently, and processing takes time. Configure a webhook endpoint to receive status updates, or poll using GET /eapi/v0/ramps/{id}.
Typical on-ramp lifecycle: INITIALIZED → PAYMENT_RECEIVED → IN_PROGRESS → COMPLETED
Typical off-ramp lifecycle: AWAITING_FUNDS → IN_PROGRESS → COMPLETED
See Webhooks for the full payload schema and all status values.