Sandbox Test Numbers
Use these identifiers to simulate the scenarios your integration must handle. Requests made with a sandbox API key return these seeded responses instantly β no provider is called.
How Sandbox Works
- Determined by the API key you send. Sandbox and live keys are issued separately from your dashboard.
- Sandbox requests are free (
priceUsdAtCall: 0) but still count toward your sandbox rate limits and show up in your verification list alongside live records. - Async sandbox requests fire a real webhook to your registered webhook URL after a short delay (approximately 3 seconds).
Unknown identifiers
- Sending an identifier not listed on this page returns
TEST_NUMBER_NOT_FOUND. - Sending a bank code outside the per-country list below returns
INVALID_BANK_CODE.
Account Verification (POST /verify/account)
| Country | accountNumber | bankCode | Scenario | Success name |
|---|---|---|---|---|
| NG | 0000000001 |
044 |
SUCCESS | Test Okoye |
| NG | 0000000002 |
044 |
NOT_FOUND | β |
| NG | 0000000003 |
044 |
PROVIDER_ERROR | β |
| GH | 1000000001 |
GH010100 |
SUCCESS | Sandbox Mensah |
| GH | 1000000002 |
GH010100 |
NOT_FOUND | β |
| GH | 1000000003 |
GH010100 |
PROVIDER_ERROR | β |
| ZM | 3000000001 |
023 |
SUCCESS | Test Banda |
| ZM | 3000000002 |
023 |
NOT_FOUND | β |
| ZM | 3000000003 |
023 |
PROVIDER_ERROR | β |
| CI | 4000000001 |
ORANGE |
SUCCESS | Alpha KouamΓ© |
| CI | 4000000002 |
ORANGE |
NOT_FOUND | β |
| CI | 4000000003 |
ORANGE |
PROVIDER_ERROR | β |
| SN | 5000000001 |
ORANGE |
SUCCESS | Sandbox Diop |
| SN | 5000000002 |
ORANGE |
NOT_FOUND | β |
| SN | 5000000003 |
ORANGE |
PROVIDER_ERROR | β |
| CM | 6000000001 |
MTN |
SUCCESS | Test Nkomo |
| CM | 6000000002 |
MTN |
NOT_FOUND | β |
| CM | 6000000003 |
MTN |
PROVIDER_ERROR | β |
| BF | 7000000001 |
ORANGE |
SUCCESS | Alpha Ouedraogo |
| BF | 7000000002 |
ORANGE |
NOT_FOUND | β |
| BF | 7000000003 |
ORANGE |
PROVIDER_ERROR | β |
| ML | 8000000001 |
ORANGE |
SUCCESS | Sandbox TraorΓ© |
| ML | 8000000002 |
ORANGE |
NOT_FOUND | β |
| ML | 8000000003 |
ORANGE |
PROVIDER_ERROR | β |
| BJ | 9000000001 |
ORANGE |
SUCCESS | Test Hounsou |
| BJ | 9000000002 |
ORANGE |
NOT_FOUND | β |
| BJ | 9000000003 |
ORANGE |
PROVIDER_ERROR | β |
| TG | 0100000001 |
ORANGE |
SUCCESS | Alpha Agbeko |
| TG | 0100000002 |
ORANGE |
NOT_FOUND | β |
| TG | 0100000003 |
ORANGE |
PROVIDER_ERROR | β |
Phone Verification (POST /verify/phone)
| Country | phoneNumber | Scenario | Success subscriber name |
|---|---|---|---|
| NG | +2348000000001 |
SUCCESS | Test Okoye |
| NG | +2348000000002 |
NOT_FOUND | β |
| NG | +2348000000003 |
PROVIDER_ERROR | β |
GH (needs networkCode: "MTN") |
+2330000000001 |
SUCCESS | Sandbox Mensah |
| GH | +2330000000002 |
NOT_FOUND | β |
| GH | +2330000000003 |
PROVIDER_ERROR | β |
| UG | +2560000000001 |
SUCCESS | Sandbox Nakato |
| UG | +2560000000002 |
NOT_FOUND | β |
| UG | +2560000000003 |
PROVIDER_ERROR | β |
| ZM | +2600000000001 |
SUCCESS | Test Banda |
| ZM | +2600000000002 |
NOT_FOUND | β |
| ZM | +2600000000003 |
PROVIDER_ERROR | β |
| CI | +2250000000001 |
SUCCESS | Alpha KouamΓ© |
| CI | +2250000000002 |
NOT_FOUND | β |
| CI | +2250000000003 |
PROVIDER_ERROR | β |
| SN | +2210000000001 |
SUCCESS | Sandbox Diop |
| SN | +2210000000002 |
NOT_FOUND | β |
| SN | +2210000000003 |
PROVIDER_ERROR | β |
| CM | +2370000000001 |
SUCCESS | Test Nkomo |
| CM | +2370000000002 |
NOT_FOUND | β |
| CM | +2370000000003 |
PROVIDER_ERROR | β |
| BF | +2260000000001 |
SUCCESS | Alpha Ouedraogo |
| BF | +2260000000002 |
NOT_FOUND | β |
| BF | +2260000000003 |
PROVIDER_ERROR | β |
| ML | +2230000000001 |
SUCCESS | Sandbox TraorΓ© |
| ML | +2230000000002 |
NOT_FOUND | β |
| ML | +2230000000003 |
PROVIDER_ERROR | β |
| BJ | +2290000000001 |
SUCCESS | Test Hounsou |
| BJ | +2290000000002 |
NOT_FOUND | β |
| BJ | +2290000000003 |
PROVIDER_ERROR | β |
| TG | +2280000000001 |
SUCCESS | Alpha Agbeko |
| TG | +2280000000002 |
NOT_FOUND | β |
| TG | +2280000000003 |
PROVIDER_ERROR | β |
BVN Identity Verification (POST /verify/identity β NG)
| idNumber | Scenario |
|---|---|
22222222201 |
SUCCESS |
22222222202 |
NOT_FOUND |
22222222203 |
PROVIDER_ERROR |
SUCCESS β example response for 22222222201
{
"id": "8f3a7b2c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
"status": "success",
"verificationType": "BVN",
"idType": "bvn",
"country": "NG",
"identifier": "22222222201",
"verifiedAt": "2026-04-21T09:15:32.104Z",
"verified": true,
"firstName": "Test",
"lastName": "Okoye",
"middleName": "Sandbox",
"dateOfBirth": "1990-01-01",
"phoneNumber": "+2348000000001",
"gender": "Male",
"enrollmentBranch": "Victoria Island",
"enrollmentInstitution": "Access Bank",
"registrationDate": "2010-05-15",
"nin": "12345678901",
"levelOfAccount": "Tier 3",
"address": {
"town": "Lagos",
"lga": "Eti-Osa",
"state": "Lagos",
"street": "10 Sandbox Street"
},
"title": "Mr",
"maritalStatus": "Single",
"lgaOfOrigin": "Onitsha North",
"otherMobile": "+2348000000099",
"stateOfOrigin": "Anambra",
"watchListed": "NO",
"nameOnCard": "OKOYE TEST SANDBOX",
"image": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=",
"validation": null
}
id and verifiedAt vary per call; everything else is deterministic. image is a 1Γ1 transparent PNG encoded as base64 β lets you exercise your decoding pipeline end-to-end without a real photo. validation is populated only when your request includes a validation block (see the BVN reference for the full matcher schema).
NOT_FOUND β example response for 22222222202
{
"id": "β¦",
"status": "failed",
"verificationType": "BVN",
"idType": "bvn",
"country": "NG",
"identifier": "22222222202",
"verifiedAt": "β¦",
"error": { "code": "BVN_NOT_FOUND", "message": "BVN not found" }
}
PROVIDER_ERROR β example response for 22222222203
{
"id": "β¦",
"status": "error",
"verificationType": "BVN",
"idType": "bvn",
"country": "NG",
"identifier": "22222222203",
"verifiedAt": "β¦",
"error": { "code": "PROVIDER_ERROR", "message": "Simulated upstream provider error" }
}
Note the different status values: failed is a business failure (BVN does not exist upstream); error is an infrastructure failure (upstream provider returned 5xx). Matches live behavior.
Lipa Na M-Pesa (POST /verify/lipa-na-mpesa β KE)
| identifier | identifierType | Scenario | Success name |
|---|---|---|---|
500001 |
paybill |
SUCCESS | Test Paybill Org |
500002 |
paybill |
NOT_FOUND | β |
500003 |
paybill |
PROVIDER_ERROR | β |
600001 |
till |
SUCCESS | Test Till Merchant |
600002 |
till |
NOT_FOUND | β |
600003 |
till |
PROVIDER_ERROR | β |
M-Pesa Agent (POST /verify/mpesa-agent β KE)
| agentCode | Scenario | Success name |
|---|---|---|
700001 |
SUCCESS | Test Njoroge Agent |
700002 |
NOT_FOUND | β |
700003 |
PROVIDER_ERROR | β |
Sandbox-valid bank & operator codes
Any bank/operator code outside this list returns INVALID_BANK_CODE.
- NG:
044(Access),058(GTBank),057(Zenith),033(UBA),011(First Bank) - GH:
GH010100(Ghana Commercial Bank) - ZM:
014(FNB),016(Stanbic),017(Standard Chartered),022(UBA),023(Zanaco),025(ZICB),028(AB Bank) - CI, SN, CM, BF, ML, BJ, TG:
ORANGE,MTN,MOOV,WAVE - UG: bank-account verification is not supported β use phone verification instead.
- KE: no bank code field β lipa-na-mpesa and mpesa-agent endpoints do not take one.
Testing Async Webhooks
-
Register a webhook URL in your dashboard and subscribe to
verification.completed. -
POST a verification request with
"mode": "async". You will receive apendingresponse immediately. -
After about 3 seconds, your webhook URL receives a
verification.completedevent:{ "event": "verification.completed", "data": { "id": "verif_abc123", "status": "success", "type": "ACCOUNT_NUMBER", "accountName": "Test Okoye" } } -
If your process crashes before delivery, the verification stays
pending. This is intentional β lets you test crash recovery in your own code.
