Parent: Overview
Updated: 2026-08-27
GET /v1/account/list-banks to list banksPOST /v1/account/add-account to register a beneficiary accountGET /v1/account/list-accountPOST /v1/virtual-account/order/payout with merchant idempotency key requestId (fields follow the VO)VIRTUAL_ACCOUNT_ORDER_UPDATED or poll GET /v1/virtual-account/order/detailSUCCESS; handle FAIL per statuses.md| Key | Rule |
|---|---|
requestId | Timeout without a clear failure → retry with the same key; validation failure → fix params and use a new key |
RE* child (businessType=PAYOUT_REFUND). The original VA* payout stays SUCCESS.RE orderStatus | refundStatus | Meaning |
|---|---|---|
PROCESSING | REFUNDING | Refund created; channel not terminal |
REFUNDED | REFUNDED | Funds confirmed and ledger posted |
FAIL | REFUND_FAILED | Channel explicitly failed |
RE* child. Do not wait for the original payout orderStatus to move to REFUNDED. Timeout or missing callback must not be treated as success.POST /v1/virtual-account/order/refundbankAccountId alone, or accountEntityType + accountNumber + bankCode + bankCountry — plus firstName / lastName when accountEntityType=Individual, or accountName when Business. Get bankCode from GET /v1/account/list-banks with currency=ZAR (country defaults to ZA).accountInfo.bankSwiftCode on Add Bank Account) — it cannot be passed inline on the payout request. For ZAR, prefer registering the beneficiary first and paying out with bankAccountId.ZAR ... examples on Payout via Virtual Account.