> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.crisscross.money/payout-market-south-africa/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.crisscross.money/_mcp/server. # South Africa Payouts Use this guide when you want to send ZAR payouts to recipients in South Africa. South Africa supports **bank transfers only**. ## Overview * **Currency:** ZAR * **Payment location:** `ZAF` * **Supported rails:** Bank transfer * **Payment method:** `paymentMethodId: "banktransfer"`, `recipient.type: "bank_account"` ## Required fields (bank transfer) | Field | Required | Notes | | ------------------- | -------- | ---------------------------------------------------------------------------- | | `accountNumber` | Yes | Bank account number | | `bankCode` | Yes | Use a value from [Bank codes (South Africa)](#bank-codes-south-africa) below | | `accountHolderName` | Yes | Name on the account | | `country` | Yes | `ZAF` | | `phoneNumber` | No | International format | Top-level required fields for every payout: `merchantId`, `merchantReference`, `destinationValue` (with `minorAmount` and `currency`), `paymentMethodId`, `paymentLocation`, `recipient`, `sender` (see [Sender details](#sender-details-required)). ## Sender details (required) Every payout requires a `sender` object for KYT/KYC screening. `fullName`, `identity`, and `identityNumber` are required; the remaining sender fields are optional but may be required by certain destinations. | Field | Required | Notes | | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- | | `fullName` | Yes | Sender's full name | | `identity` | Yes | Identity document type: `passport`, `nationalId`, `driversLicense`, `residencePermit`, `businessRegistrationNumber`, or `other` | | `identityNumber` | Yes | Identity document number | See [Create Payout](/api-reference/payouts/payouts/payouts/initiate-payout) for the full sender schema. ## Verify recipient before payout Recipient bank account validation is not performed as part of the payout request. To reduce failed payouts and confirm account holder details before sending, use **Bank Account Verification**. You can verify that the account exists, is open, and optionally that the account holder name or identity matches (e.g. South African ID, passport, or business registration). * **When to use:** Before creating a ZAR bank payout when you want to confirm the account and optionally match identity. * **How:** Call `POST /verification/bank-account` with the recipient's `accountNumber`, `bankCode` (use a [bank code](#bank-codes-south-africa) from the table below), `country: "ZAF"`, and your `merchantId`. Optionally include `accountHolder` for name/identity matching. * **Result:** The API returns whether the account is verified, the account holder name when available, and whether the account is open and accepts credits. See [Bank Account Verification](/payout-bank-account-verification) for the full guide and [Verification API Reference](/api-reference/payouts/verification/verify-bank-account) for the request and response schema. ## Beneficiary statement reference You can pass a **beneficiary reference** that appears on the recipient's bank statement. Use the optional top-level field `beneficiaryReference` (separate from `merchantReference`). This is useful when you want the recipient to see an invoice number, order ID, or other reference on their statement for reconciliation. * **`merchantReference`** — For your tracking and idempotency; not necessarily shown to the beneficiary. * **`beneficiaryReference`** — Shown on the beneficiary's statement where supported (ZAR bank payouts). See [Create Payout](/api-reference/payouts/payouts/payouts/initiate-payout) for the request schema. ## Bank codes (South Africa) For ZAR payouts, `recipient.bankCode` is the beneficiary bank's own 6-digit **universal** (any-branch) code. There is no single South Africa-wide universal code — each bank has its own. Branch-specific codes are not validated; use the universal code. The live list is available from `GET /v1/payout/banks?country=ZAF`. The accepted codes: | bankCode | Bank | | -------- | ------------------------------------- | | `632005` | Absa Bank | | `051001` | Standard Bank | | `198765` | Nedbank | | `250655` | First National Bank (FNB) | | `470010` | Capitec Bank | | `580105` | Investec Bank | | `430000` | African Bank | | `462005` | Bidvest Bank | | `678910` | TymeBank | | `679000` | Discovery Bank | | `450905` | Mercantile Bank | | `410506` | Access Bank South Africa (ex-Grobank) | | `888000` | Bank Zero | Account numbers are 9–13 digits. ## Payout speed CrissCross supports two clearing options for ZAR bank payouts: | Option | Description | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Instant** | Attempts to clear the payment with the beneficiary bank immediately. If the request is submitted after the bank’s cutoff time, it rolls over to the next business day. Instant clearing can incur an additional cost. | | **Standard** | Same-day clearing. If submitted after the bank’s cutoff time, the payout rolls over to the next business day. | Instant clearing is **not supported by all South African banks**. When it isn’t available for a given beneficiary bank, CrissCross will process the payout using standard clearing. To request instant clearing, set `clearingType` to `"instant"` in your payout request. Omit `clearingType` or set it to `"standard"` for standard clearing. See [Create Payout](/api-reference/payouts/payouts/payouts/initiate-payout) for the full request schema. ## Example request ```json { "merchantId": "your-merchant-id", "merchantReference": "PAYOUT-ZA-001", "beneficiaryReference": "INV-2024-0042", "destinationValue": { "minorAmount": 250000, "currency": "ZAR" }, "paymentMethodId": "banktransfer", "paymentLocation": "ZAF", "clearingType": "standard", "recipient": { "type": "bank_account", "accountNumber": "0123456789", "bankCode": "632005", "accountHolderName": "Sipho Dlamini", "country": "ZAF" }, "sender": { "fullName": "Jane Smith", "identity": "passport", "identityNumber": "A12345678" } } ``` * `beneficiaryReference` is optional; "INV-2024-0042" would appear on the recipient's bank statement where supported. * `bankCode: "632005"` is Absa Bank's universal code; see [Bank codes (South Africa)](#bank-codes-south-africa) for all supported values. Use `"clearingType": "instant"` when you want faster clearing (may incur an additional cost; not supported by all South African banks). ## Status and failure behaviour (ZAR) ZAR payouts use the same [CrissCross payout statuses](/payout-tracking#payout-status) as other destinations: **PENDING**, **PROCESSING**, **COMPLETED**, **FAILED**, and **CANCELLED**. The following describes behaviour that is specific to ZAR bank payouts. **Insufficient balance (held, then complete or fail)**\ If there is insufficient balance in your payout source when a ZAR payout is submitted, the payout may remain in **PENDING** or **PROCESSING** until balance is available. Payouts are processed in order (first in, first out). Once the balance is topped up, held payouts can move to **COMPLETED**. If the balance is not topped up in time, the payout may move to **FAILED** with a reason in `failureReason` (e.g. insufficient funds). Ensure sufficient balance before submitting, or top up promptly if you see payouts staying in PENDING/PROCESSING. **Reversals**\ In rare cases, a payout that has reached **COMPLETED** can be reversed by the bank (for example, if the beneficiary account was closed). When that happens, you will receive a final status update and the payout will no longer be considered completed—check your [payout history](/payout-tracking#viewing-payout-history) and [webhooks](/core-concepts-webhooks) for the updated status and any reason code. **Cancellation**\ You can cancel a ZAR payout that has not yet completed. Once cancelled, the payout has status **CANCELLED** and will not be processed. Cancelling a payout that was held (e.g. due to insufficient balance) can free balance for other payouts. Use the cancel endpoint or contact support as per your integration; see the [Payouts API Reference](/api-reference/payouts) for cancel behaviour if exposed. For full status definitions and how to track payouts, see [Tracking Payouts](/payout-tracking). ## Retries and idempotency (ZAR) If a ZAR payout request times out or returns an error, retry using the **same `merchantReference`**. CrissCross treats the request as idempotent: if the original request was already accepted, a retry with the same reference will not create a duplicate payout. * **Retry with the same `merchantReference`** — Do not generate a new reference on retry; reuse the one from the failed or timed-out request. * **Use exponential backoff** — Wait a short time before the first retry (e.g. a few seconds), then increase the delay between subsequent retries to avoid overwhelming the service. This applies to all payouts but is especially important for ZAR when you rely on idempotency to avoid double sends after timeouts or transient errors. ## Sandbox testing (ZAR) To simulate successful payouts and failure scenarios in the sandbox, use the account-number ending rules described in [Payout Trigger Endings](/payout-sandbox-testing). ## Related guides * [Bank Transfers](/payout-bank-transfers) * [Bank Account Verification](/payout-bank-account-verification) * [Tracking Payouts](/payout-tracking) * [Payout Trigger Endings](/payout-sandbox-testing) * [Supported Destinations](/payout-supported-destinations) > ZAR payouts to bank accounts