# Bank Transfer

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](/products/native-api/docs/guides/foundations) — 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.


```http
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.


```json
{
  "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": "15600270@banxa.com",
    "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):


```http
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.


```json
{
  "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:


```http
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:


```json
{
  "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: `INITIALIZED` → `PAYMENT_RECEIVED` → `IN_PROGRESS` → `COMPLETED`

Typical off-ramp lifecycle: `AWAITING_FUNDS` → `IN_PROGRESS` → `COMPLETED`

See [Webhooks](/products/native-api/docs/transaction-lifecycle/webhooks) for the full payload schema and all status values.