> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.crisscross.money/payout-bank-account-verification/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.crisscross.money/_mcp/server. # Bank Account Verification > **Warning** > > This endpoint is **deprecated**. Use the unified [account validation endpoint](/api-reference/payouts/verification) — `POST /v1/accounts/validate` with `accountType: bank_account` — instead. It covers bank accounts and mobile money, supports asynchronous resolution with polling, and returns richer status detail. See [Verification Sandbox Testing](/payout-verification-sandbox-testing) to try it in the sandbox. Bank account verification allows you to validate recipient bank account details before initiating payout transactions. This helps reduce failed payouts, confirms account holder information when available, and improves reconciliation. ## Introduction When processing bank payouts, recipient account validation is not performed as part of the payout request. Verifying the account beforehand lets you: * **Reduce failed payouts** — Confirm the account exists and is open before sending funds * **Match identity** — Optionally verify that the account holder name or identity matches (e.g. SA ID, passport, or business registration) * **Improve UX** — Show the account holder name for confirmation before disbursement * **Avoid wasted fees** — Catch invalid or closed accounts early Bank account verification is currently available for **South Africa (ZAR)**. Use the same [bank codes](/payout-market-south-africa#bank-codes-south-africa) as for ZAR payouts. ## Prerequisites * **CrissCross Integration:** You have integrated with CrissCross and have access to the API. * **Authentication:** Valid API credentials and Bearer token. See [Authentication](/authentication). * **Merchant ID:** Your merchant ID for API requests. * **Supported market:** ZAR (South Africa). Contact CrissCross for other markets. ## API Endpoint **Endpoint:** `POST https://api.crisscross.money/v1/verification/bank-account` **Authentication:** Bearer Token (required) ## Request Format Minimum required fields: `accountNumber`, `bankCode`, `country`, `merchantId`. Optionally include `accountHolder` to verify name/identity match. ```json { "accountNumber": "4080499390", "bankCode": "absa", "country": "ZAF", "merchantId": "your-merchant-id" } ``` With optional account holder details (for identity/name matching): ```json { "accountNumber": "4080499390", "bankCode": "absa", "country": "ZAF", "merchantId": "your-merchant-id", "accountType": "current", "accountHolder": { "type": "individual", "initials": "J", "familyName": "Clegg", "identityDocument": { "country": "ZA", "number": "5306075800082" } } } ``` ### Request Parameters | Parameter | Type | Required | Description | | --------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `accountNumber` | string | Yes | Bank account number to verify | | `bankCode` | string | Yes | Bank identifier. For ZAR use a [supported bank code](/payout-market-south-africa#bank-codes-south-africa) (e.g. `absa`, `standard_bank`, `fnb`) | | `country` | string | Yes | 3-letter ISO country code (e.g. `ZAF` for South Africa) | | `merchantId` | string | Yes | Your merchant ID | | `accountType` | string | No | `current` or `savings`; verified if provided | | `accountHolder` | object | No | Account holder details for identity/name matching (see below) | **accountHolder** (optional): * **type:** `individual` or `business` * **Individual (South African ID):** `initials`, `familyName`, `identityDocument: { country, number }` (2-letter country, e.g. ZA) * **Individual (passport):** `initials`, `familyName`, `passport: { country, number }` for foreign account holders * **Business:** `name`, `registration: { country, number }` (business registration number) ## Response Format ```json { "verified": true, "accountHolderName": "J Clegg", "accountExists": true, "identityMatch": true, "accountOpen": true, "accountAcceptsCredits": true } ``` ### Response Fields | Field | Type | Description | | ----------------------- | ------- | ----------------------------------------------------------------------------------- | | `verified` | boolean | Overall result: account valid and open, and any provided identity/name matched | | `accountHolderName` | string | Account holder name as returned by the bank, when available | | `accountExists` | boolean | Whether the account exists at the bank | | `identityMatch` | boolean | Whether provided identity/registration matched (only when `accountHolder` was sent) | | `accountOpen` | boolean | Whether the account is still open | | `accountAcceptsCredits` | boolean | Whether the account can receive credits (e.g. payouts) | ## Example Usage ```bash curl -X POST https://api.crisscross.money/v1/verification/bank-account \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "accountNumber": "4080499390", "bankCode": "absa", "country": "ZAF", "merchantId": "your-merchant-id" }' ``` **Success (200 OK):** ```json { "verified": true, "accountHolderName": "J Clegg", "accountExists": true, "accountOpen": true, "accountAcceptsCredits": true } ``` **Unverified (200 OK):** ```json { "verified": false, "accountExists": false } ``` ## Integration Workflow 1. **Collect recipient details** — Account number, bank code (use [ZAR bank codes](/payout-market-south-africa#bank-codes-south-africa)), and optionally name/identity for matching. 2. **Verify before payout** — Call `POST /verification/bank-account` before creating the payout. 3. **Confirm with user** — If verified, show `accountHolderName` for confirmation (e.g. "Send payout to **J Clegg**?"). 4. **Create payout** — If verified (or if you proceed anyway), create the payout with [Single Payout](/payout-single) or [Bulk Payout](/payout-bulk), using the same `accountNumber` and `bankCode`. ## Best Practices * **Verify before processing** — Call verification for ZAR bank payouts when you want to reduce failures and show account holder name. * **Use same bank codes** — Use the same `bankCode` values for verification and for the payout request; see [South Africa — Bank codes](/payout-market-south-africa#bank-codes-south-africa). * **Optional identity matching** — Send `accountHolder` when you have SA ID, passport, or business registration to verify the account holder. * **Handle unverified** — If `verified` is false, you can still attempt the payout or ask the user to confirm/update details. * **Audit trail** — Log verification results with payout transactions for reconciliation. ## Supported Markets Bank account verification is currently available for: * **South Africa (ZAF):** ZAR bank accounts. Use [bank codes](/payout-market-south-africa#bank-codes-south-africa) from the South Africa payout guide. Support for additional markets may be available. Contact CrissCross support for your use case. ## Related * [South Africa Payouts](/payout-market-south-africa) — ZAR payouts and bank codes * [Bank Transfers](/payout-bank-transfers) — Payout request shape for bank accounts * [Verification API Reference](/api-reference/verification) — Full request/response schema > Verify recipient bank accounts before processing payouts