Skip to content
Last updated

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.


On-ramp (buy crypto)

Create the ramp

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.

Display payment instructions

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.

Reference is required

Instruct users to include the depositReference when making the transfer. Without it, Banxa cannot match the payment to the transaction.


Off-ramp (sell crypto)

Provide bank account details

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

Display the deposit address

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

Locking the exchange rate

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=500

The 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.

quoteId support

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.


Tracking transaction status

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: INITIALIZEDPAYMENT_RECEIVEDIN_PROGRESSCOMPLETED

Typical off-ramp lifecycle: AWAITING_FUNDSIN_PROGRESSCOMPLETED

See Webhooks for the full payload schema and all status values.