Test Credentials
All test credentials only work with your sandbox API key (sk_sand_...). No real money is moved in sandbox mode.
Test cards
Use these card numbers in sandbox to simulate different authorization flows. The expiry, CVV, and name can be any valid values.
Successful flows
| Card number | Network | Flow | Description |
|---|---|---|---|
4084084084084081 | Visa | Direct (no PIN/OTP) | Charge succeeds immediately |
5061460410120223210 | Verve | PIN → OTP | Requires PIN 1234 then OTP 123456 |
5399838383838381 | Mastercard | PIN only | Requires PIN 1234 |
4751763333335678 | Visa | PIN only | Requires PIN 4321 |
6280280280280282 | Verve | PIN → OTP | Requires PIN 0000 then OTP 000000 |
Decline flows
| Card number | Network | Decline reason |
|---|---|---|
4084080000000409 | Visa | Insufficient funds |
5265335335335352 | Mastercard | Card blocked |
5061460000000000000 | Verve | Invalid card |
PIN values
When a card flow requires a PIN, use 1234 unless a different PIN is listed in the table above.
OTP values
When an OTP step is required, use 123456.
Test virtual accounts
Virtual accounts are created dynamically when you initiate a bank_transfer payin in sandbox. The account number shown on the checkout is real within the sandbox environment.
To simulate receiving a bank transfer:
- Copy the Account number shown on the checkout
- Go to Dashboard → Sandbox → Simulator → Bank Transfer
- Paste the account number and enter the amount
- Click Send transfer — the payin transitions to
succeededwithin seconds
Test mobile money numbers
Register test numbers in Dashboard → Sandbox → Simulator → Test Numbers before initiating a mobile money payin.
Preconfigured test numbers
| Phone number | Currency | Operator | Auth flow |
|---|---|---|---|
+234 800 000 0001 | NGN | MTN | PIN → OTP |
+233 500 000 001 | GHS | MTN | PIN only |
+254 700 000 001 | KES | M-Pesa | PIN only |
+221 770 000 001 | XOF | Orange | PIN → birthday |
Auth values
| Step | Value |
|---|---|
| PIN | 1234 |
| OTP | 123456 |
| Birthday | 01/01/1990 |
Simulating approval from the Simulator
- Go to Dashboard → Sandbox → Simulator → Pending Charges
- Find your charge by phone number
- Tap Approve (or Reject to simulate a failure)
Test payout scenarios
Payouts in sandbox always succeed unless the beneficiary account number matches a failure trigger.
| Account number | Scenario |
|---|---|
| Any valid number | Succeeds within 5 seconds |
0000000000 | Fails with channel_beneficiary_bank_down |
1111111111 | Fails with channel_unknown_error |
9999999999 | Reversal after 30 seconds |
Test FX rates
Sandbox FX rates are fixed (not live):
| Pair | Rate |
|---|---|
| USD → NGN | 1,645 |
| EUR → NGN | 1,790 |
| GBP → NGN | 2,090 |
| USD → GHS | 13.5 |
| NGN → USD | 0.00061 |
Sandbox control
You can adjust sandbox behaviour via the mock-channel API:
# Set a 30% failure rate
curl -X PATCH http://localhost:4000/_control \
-H 'Content-Type: application/json' \
-d '{"failureRate": 0.3}'
# Set instant mode (webhooks fire immediately instead of with delay)
curl -X PATCH http://localhost:4000/_control \
-d '{"mode": "instant"}'
# Set async mode (default — webhooks fire after 1–3 second delay)
curl -X PATCH http://localhost:4000/_control \
-d '{"mode": "async"}'