> ## Documentation Index
> Fetch the complete documentation index at: https://api.tandapay.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Bank transfer

> Issue a temporary bank account for one payment and reconcile it automatically.

Bank transfer suits larger payments and invoice-style collections. Tanda creates a temporary virtual account for one payment. When the customer transfers the exact amount before it expires, the payment is matched to your transaction automatically.

## 1. Create the account

Call [Bank transfer](https://api.tandapay.io/api-reference/endpoint/bank-transfer.md).

```bash theme={null}
curl -X POST https://api.tandapay.io/api/b2b/fiat/deposit/bank-transfer \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 50000,
    "currency": "KES",
    "email": "accounts@customer.co.ke",
    "externalReference": "inv_2026_0193"
  }'
```

```json Response theme={null}
{
  "success": true,
  "message": "Virtual account created successfully.",
  "data": {
    "transactionId": "aB3dE5fG7hJ9kL1mN2pQ",
    "virtualAccount": {
      "permanent": false,
      "accountNumber": "1234567890",
      "bankName": "Example Bank Kenya",
      "amount": "50000",
      "createdAt": "2026-10-28T09:00:00.000Z",
      "expiresAt": "2026-10-28T11:00:00.000Z",
      "note": "Transfer the exact amount before the account expires.",
      "bankLogo": "https://example.com/bank-logo.png"
    }
  }
}
```

## 2. Show the details

Display these to the customer:

* **Bank:** `bankName` (and `bankLogo` if you like)
* **Account number:** `accountNumber`
* **Amount:** `amount`, stated as an exact figure
* **Pay before:** `expiresAt`, ideally with a countdown

> [!WARNING]
>
> The customer must send the **exact** amount before `expiresAt`. Partial payments, overpayments and transfers after expiry won't reconcile automatically and may need manual handling through support.

If the account expires before the customer pays, create a new one with a new `externalReference`.

## 3. Confirm the payment

You'll get a `transaction_created` webhook when the account is issued and a `transaction_updated` webhook with `status: "successful"` or `"failed"` when it settles. Bank transfers can take longer than mobile money, so prefer webhooks over polling.

To check manually, use [Get transaction](https://api.tandapay.io/api-reference/endpoint/get-transaction.md). A settled transfer has `chargeStatus: "successful"`, `method: "bank"` and the bank's `thirdPartyReference`.

## Good practice

* Don't fulfil when the account is created. Wait for `successful`.
* Store both `transactionId` and `externalReference` against the invoice.
* Remind the customer to send the exact amount, without deducting their own bank charges.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.