The Zuba sandbox lets you test integrations against real payment infrastructure without moving real money. For predictable outcomes during integration testing, send payouts using the documented sandbox test values below. Any payout that uses these values is guaranteed to resolve to the documented terminal state, so you can write tests that assert on success and failure paths reliably. Test values only behave deterministically in the sandbox environment. In production they are subject to normal account validation and will not produce these outcomes.Documentation Index
Fetch the complete documentation index at: https://docs.zuba.com/llms.txt
Use this file to discover all available pages before exploring further.
How status transitions work
Payouts always start inprocessing and transition asynchronously to a terminal state (paid or failed). The transition typically completes within one to two minutes in the sandbox, but you should not assume a fixed delay. Monitor for completion via either:
- Webhooks — the recommended approach. Subscribe to
payout.paidandpayout.failedevents and treat the webhook as the source of truth. - Polling —
GET /v1/payouts/:idand check thestatusfield. Avoid tight polling loops; one request every few seconds is plenty.
NGN bank transfers
bankCode | crAccount | Resolved holder name | Outcome |
|---|---|---|---|
033 | 0000000000 | Sandbox: paid | The payout transitions to paid. |
035 | 0000000000 | Sandbox: failed | The payout transitions to failed. |
011 | 9999999999 | Sandbox: invalid account | The payout is rejected immediately and returned with an invalid_account error. |
bankCode and crAccount is treated as a regular payout. Regular sandbox payouts exercise the full payment lifecycle but their outcome depends on live sandbox conditions and is not guaranteed.
The resolved holder name column shows the value the sandbox account-name resolver returns for each magic value. When you’re using these from the dashboard, the verified-account banner displays this name so you can tell at a glance which scenario you’re about to trigger.
Example — a guaranteed-success NGN payout
"status": "processing". After the asynchronous transition you will receive a payout.paid webhook (or you can poll GET /v1/payouts/:id until status is paid).
Example — a guaranteed-failure NGN payout
Switch thebankCode to 035 to assert your error-handling path:
processing and transitions to failed within one to two minutes. The failureReason field on the payout will describe the failure.
Other corridors
Documented test values for additional corridors (KES, GHS, USD, EUR, GBP) will be added over time. Until they are listed here, payouts in those corridors exercise live sandbox behaviour, which may be slower and less deterministic. If you need predictability for an unlisted corridor, contact us at hello@zuba.com.Tips
- Use distinct
clientRefvalues per test run so polling and webhook handlers can correlate requests cleanly. - Don’t assume the
processing→ terminal transition is instant. Tests that expect immediate state change will be flaky. Wait on the webhook or poll the GET endpoint. - Test failures too. It’s easy to verify the happy path; make sure your error-handling code is exercised by the documented failure values as well.
- Don’t mix test values with realistic ones in the same payout. A documented
bankCodepaired with a realisticcrAccountis treated as a regular payout, not a test value.