API
Payouts API
Schedule creditor, salary and refund payments out of your Netcash account, follow their status, and cancel them.
On this page
Overview#
Payouts are payments out of your Netcash account to a bank account: supplier and creditor payments, salaries, and refunds to customers. They need a Netcash Creditor & Salary Payments gateway (the netcash_creditor module) under Settings → Gateways; salaries also need its Salary payments service key. No plan feature is required beyond API access. Payouts are in ZAR.
| Endpoint | Purpose |
|---|---|
POST /api/v1/payouts | Schedule a payout |
GET /api/v1/payouts | List, filter by status, kind or customer |
GET /api/v1/payouts/{id} | Get one payout |
POST /api/v1/payouts/{id}/cancel | Cancel before it is submitted |
Wherever a path takes {id}, you can also use the payout reference. To refund a credit note by payout, use POST /api/v1/credit-notes/{id}/refund with method: "payout" instead, so the credit balance is updated.
The payout object#
The same object is returned by every payout endpoint and sent as data in payout.* webhooks.
{
"object": "payout",
"id": "cmg3p4q5r0003pay0001abcd",
"reference": "PAY-000031",
"kind": "creditor",
"status": "scheduled",
"beneficiaryName": "Acme Supplies",
"beneficiaryEmail": "[email protected]",
"bankName": "FNB",
"accountLast4": "4821",
"amount": 12500,
"currency": "ZAR",
"description": "Invoice AS-2291",
"statementRef": "CentraPoint AS-2291",
"actionDate": "2026-10-01T00:00:00.000Z",
"submittedAt": null,
"paidAt": null,
"failureReason": null,
"customer": null,
"creditNote": null,
"createdAt": "2026-09-27T10:00:00.000Z",
"updatedAt": "2026-09-27T10:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
objectrequired | string | Always payout. |
idrequired | string | CentraPoint payout ID. |
referencerequired | string | Your account reference for the payment in the Netcash batch. |
kindrequired | string | creditor, salary or refund. |
statusrequired | string | See Statuses. |
beneficiaryName, beneficiaryEmailrequired | string / string | null | Who is paid. |
bankName, accountLast4required | string | null | The only bank details returned. |
amount, currencyrequired | number, string | Always ZAR. |
descriptionrequired | string | null | Your internal description. |
statementRefrequired | string | null | What the beneficiary sees on their statement (max 20 chars). |
actionDaterequired | string | The payment date (UTC midnight of that calendar day). |
submittedAt, paidAtrequired | string | null | When it went to Netcash, and when it was marked paid. |
failureReasonrequired | string | null | Why it failed (when failed). |
customerrequired | object | null | { id, externalReference, email } when linked to a customer. |
creditNoterequired | object | null | { id, number } when it pays back a credit note. |
createdAt, updatedAtrequired | string |
Statuses#
| status | Meaning |
|---|---|
scheduled | Waiting for its action date. Can be cancelled. |
submitted | Sent to Netcash in a batch (by default one day before the action date, per the gateway's setting). |
paid | Netcash loaded the batch and the action date has passed. |
failed | Rejected by Netcash or the upload failed; see failureReason. A credit note's reserved amount is released. |
cancelled | Cancelled before submission. |
Schedule a payout#
/api/v1/payouts| Field | Type | Description |
|---|---|---|
kindrequired | string | creditor, salary or refund. |
beneficiaryNamerequired | string | 1–50 chars. |
bankrequired | object | accountHolder, accountNumber, branchCode, accountType (current, savings or transmission), optional bankName. Invalid details return 400. |
amountrequired | number | Greater than 0, up to 5 000 000. |
actionDaterequired | string (YYYY-MM-DD) | Payment date; today or later (South African time). |
providerIdoptional | string | Your Netcash Creditor & Salary Payments gateway. Default: the first enabled one (the default gateway first); 400 if none. |
beneficiaryEmailoptional | string | Optional. |
descriptionoptional | string | Up to 1000 chars. |
statementRefoptional | string | Up to 20 chars; default the beneficiary name. |
customerId / customerExternalReferenceoptional | string | Optionally link the payout to one of your customers (at most one of the two; unknown returns 400). |
curl -X POST "https://app.centrapoint.co.za/api/v1/payouts" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY" \
-H "Idempotency-Key: d2f4a6c8-7e9b-4c1d-b3f5-8a0c2e4b6d17" \
-H "Content-Type: application/json" \
-d '{
"kind": "creditor",
"beneficiaryName": "Acme Supplies",
"beneficiaryEmail": "[email protected]",
"bank": {
"accountHolder": "Acme Supplies (Pty) Ltd",
"accountNumber": "62000004821",
"branchCode": "250655",
"accountType": "current",
"bankName": "FNB"
},
"amount": 12500,
"actionDate": "2026-10-01",
"description": "Invoice AS-2291",
"statementRef": "CentraPoint AS-2291"
}'Returns 201 with the payout object and emits payout.scheduled.
List payouts#
/api/v1/payouts| Field | Type | Description |
|---|---|---|
statusoptional | string | scheduled, submitted, paid, failed or cancelled. |
kindoptional | string | creditor, salary or refund. |
customerIdoptional | string | Only payouts linked to this customer. |
limit, startingAfteroptional | Keyset pagination: the response is { data, hasMore, nextCursor }, newest first. |
curl -X GET "https://app.centrapoint.co.za/api/v1/payouts?status=scheduled&kind=salary" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY"Get a payout#
/api/v1/payouts/{id}curl -X GET "https://app.centrapoint.co.za/api/v1/payouts/cmg3p4q5r0003pay0001abcd" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY"Cancel a payout#
/api/v1/payouts/{id}/cancelCancels a scheduled payout. No body is needed. Once submitted to Netcash it can't be cancelled here (400). If the payout pays back a credit note, its amount returns to the credit note's balance. Returns the updated payout and emits payout.cancelled.
curl -X POST "https://app.centrapoint.co.za/api/v1/payouts/cmg3p4q5r0003pay0001abcd/cancel" \
-H "Authorization: Bearer $CENTRAPOINT_API_KEY" \
-H "Idempotency-Key: e5a7c9b1-8f0d-4e2a-b4c6-9d1f3a5c7e80"Webhook events#
payout.scheduled, payout.submitted, payout.paid, payout.failed and payout.cancelled are sent to your webhook endpoints with the payout object as data, including payouts scheduled from the dashboard or for credit notes.
Errors#
| Status | error | When |
|---|---|---|
| 400 | invalid_request | Validation failed; invalid bank details; no enabled payout gateway or unknown providerId; gateway disabled; salary without a salary service key; action date in the past; customer not found; unknown status/kind filter; cancelling a payout that is no longer scheduled. |
| 403 | plan_restricted / account_restricted | Plan lacks the API, or the account is read-only (writes). |
| 404 | not_found | No payout with this ID or reference in your organisation. |
| 409 | idempotency_conflict | Idempotency-Key reused with a different body. |
| 401 / 429 / 500 | unauthorized / rate_limited / internal_error | See Errors |