Skip to content

Create a disbursement batch​

POST
/v2/payments/bulk-withdrawals/batches

Requires DISBURSEMENTS_CREATE (granted by DISBURSEMENTS_WRITE) and DISBURSEMENTS_APPROVE (granted by DISBURSEMENTS_WRITE) (bundles)

Creates a batch of ZAR payouts and executes it straight away: batches created with an API key skip the approval step, so the fee is charged and the payouts are submitted immediately, and the key needs the DISBURSEMENTS_APPROVE permission as well (the DISBURSEMENTS_WRITE bundle includes it). Your payout account must have enough available balance for the payouts plus the fee. X-VALR-Idempotency-Key is optional. Send one to make retries safe: repeating a key returns the original batch's ID with status 200. Without it, every request creates a new batch.

Parameters​

Header Parameters

X-VALR-Idempotency-Key

Your unique key for this batch: up to 128 letters, digits, :, _, . or -. Reuse it only to retry the same request.

Type
string
Example"payroll-2026-10-23-001"
Pattern
"^[A-Za-z0-9:_.\\-]{1,128}$"
Max Length
128

Request Body​

application/json
JSON
{
"label": "October salaries",
"withdrawals": [
{
"bank": "FNB",
"accountHolder": "Thandi Nkosi",
"accountNumber": "62845190327",
"branchCode": "250655",
"accountType": "CHEQUE",
"amount": 12500.75,
"reference": "OCT SALARY",
"email": "thandi@example.com",
"type": "INDIVIDUAL",
"country": "ZA"
},
{
"bank": "CAPITEC",
"accountHolder": "Sipho Dlamini",
"accountNumber": "1453987621",
"branchCode": "470010",
"accountType": "SAVINGS",
"amount": 8000.25,
"reference": "OCT SALARY"
}
]
}

Responses​

A batch with this idempotency key already exists. Its ID is returned and nothing new is created.

application/json
JSON
{
"id": "5b9a3c1e-2f4d-4a7b-9c8e-1d2f3a4b5c6d"
}

Samples​

Errors

HTTPErrorWhen
400-113INVALID_JSONThe body isn't valid JSON.
400-11INVALID_REQUESTThe body is empty or has no withdrawals array, or X-VALR-Idempotency-Key isn't valid, in which case validationErrors names the header.
400BAD_REQUESTA query parameter or field is invalid.
403-16098PAYMENTS_USER_ACCESS_NOT_CONFIGUREDPayments haven't been set up for your business yet.
409CONFLICTThe idempotency key belongs to a batch that was cancelled, so retry with a new key, or to one that failed after its fee was charged, so contact support instead of retrying.
500INTERNAL_ERRORUnexpected error in the payments service.
502-16097EXCHANGE_API_ERRORThe payments service failed to process the request.
502EXCHANGE_API_ERRORThe payments service couldn't complete the request. Try again later.
503-16099PAYMENTS_BACKEND_PROXY_DISABLEDPayments endpoints are temporarily unavailable.

Plus the errors common to all signed endpoints.