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 | 0000000017 | 000014 | SUCCESS | Test Okoye |
| NG | 0000000024 | 000014 | NOT_FOUND | — |
| NG | 0000000031 | 000014 | PROVIDER_ERROR | — |
| GH | 1000000001 | GCB | SUCCESS | Sandbox Mensah |
| GH | 1000000002 | GCB | NOT_FOUND | — |
| GH | 1000000003 | GCB | 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 | — |
| TZ | 2000000001 | 003 | SUCCESS | Test Shekimweri |
| TZ | 2000000002 | 003 | NOT_FOUND | — |
| TZ | 2000000003 | 003 | PROVIDER_ERROR | — |
| ET | 1000000000001 | 231402 | SUCCESS | Sandbox Bekele |
| ET | 1000000000002 | 231402 | NOT_FOUND | — |
| ET | 1000000000003 | 231402 | PROVIDER_ERROR | — |
| KE | 1000000011 | 01 | SUCCESS | Sandbox Wambui |
| KE | 1000000012 | 01 | NOT_FOUND | — |
| KE | 1000000013 | 01 | PROVIDER_ERROR | — |
| UG | 1400000001 | EQBLUGKA | SUCCESS: strong name match | Sandbox Nakato |
| UG | 1400000002 | EQBLUGKA | IDENTITY_MISMATCH: name did not match (verified: false) | Sandbox Mismatch |
| UG | 1400000003 | EQBLUGKA | NOT_FOUND | — |
| ZA | 2500000001 | 250655 | SUCCESS: account exists (existence only, no name score) | Sandbox van der Merwe |
| ZA | 2500000002 | 250655 | NOT_FOUND | — |
| GB | GB-VERIFIED-001 | 200000 | SUCCESS: no major risk identified | SANDBOX TEST ACCOUNT |
| GB | GB-SOMERISK-002 | 200000 | RISK_IDENTIFIED: some risks identified (verified: false) | SANDBOX SOME RISK |
| GB | GB-NOTFOUND-003 | 200000 | NOT_FOUND | — |
| GB | GB-RISK-004 | 200000 | RISK_IDENTIFIED: significant risk identified (verified: false) | SANDBOX SIGNIFICANT RISK |
| CN | 6228480402564890018 | CN-INDIV | SUCCESS: individual strong match | SANDBOX TEST |
| CN | 6228480402564890026 | CN-INDIV | IDENTITY_MISMATCH: name did not match | SANDBOX MISMATCH |
| DE | DE09000000000000000001 | (none) | SUCCESS: strong name match | SANDBOX DE ACCOUNT |
| DE | DE79000000000000000002 | (none) | IDENTITY_MISMATCH: name did not match | SANDBOX DE MISMATCH |
| DE | DE52000000000000000003 | (none) | NOT_FOUND | — |
| FR | FR4900000000000000000000001 | (none) | SUCCESS: strong name match | SANDBOX FR ACCOUNT |
| FR | FR2200000000000000000000002 | (none) | IDENTITY_MISMATCH: name did not match | SANDBOX FR MISMATCH |
| FR | FR9200000000000000000000003 | (none) | NOT_FOUND | — |
| NL | NL9200000000000001 | (none) | SUCCESS: strong name match | SANDBOX NL ACCOUNT |
| NL | NL6500000000000002 | (none) | IDENTITY_MISMATCH: name did not match | SANDBOX NL MISMATCH |
| NL | NL3800000000000003 | (none) | NOT_FOUND | — |
| ES | ES5500000000000000000001 | (none) | SUCCESS: strong name match | SANDBOX ES ACCOUNT |
| ES | ES2800000000000000000002 | (none) | IDENTITY_MISMATCH: name did not match | SANDBOX ES MISMATCH |
| ES | ES9800000000000000000003 | (none) | NOT_FOUND | — |
| AE | AE360000000000000000001 | (none) | SUCCESS: strong name match | SANDBOX AE ACCOUNT |
| AE | AE090000000000000000002 | (none) | IDENTITY_MISMATCH: name did not match | SANDBOX AE MISMATCH |
| AE | AE790000000000000000003 | (none) | NOT_FOUND | — |
| AU | 10000001 | 062000 | SUCCESS: strong name match | SANDBOX AU ACCOUNT |
| AU | 10000002 | 062000 | IDENTITY_MISMATCH: name did not match | SANDBOX AU MISMATCH |
| AU | 10000003 | 062000 | NOT_FOUND | — |
| US | 20000001 | 123456789 | SUCCESS: strong name match | SANDBOX US ACCOUNT |
| US | 20000002 | 123456789 | IDENTITY_MISMATCH: name did not match (verified: false) | SANDBOX US MISMATCH |
| US | 20000003 | 123456789 | NOT_FOUND | — |
| IN | 1001000001 | HDFC0000001 | SUCCESS: strong match | Arjun Kumar |
| IN | 1001000099 | HDFC0000001 | NOT_FOUND | — |
| ID | 2002000001 | BMRIIDJA | SUCCESS: strong match | Budi Santoso |
| ID | 2002000099 | BMRIIDJA | NOT_FOUND | — |
| VN | 3003000001 | BFTVVNVX | SUCCESS: strong match | Nguyen Van A |
| VN | 3003000099 | BFTVVNVX | NOT_FOUND | — |
| NP | 4004000001 | NABLNPKA | SUCCESS: strong match | Ram Bahadur |
| NP | 4004000099 | NABLNPKA | NOT_FOUND | — |
| PK | 5005000001 | HABBPKKA | SUCCESS: strong match | Ali Raza |
| PK | 5005000099 | HABBPKKA | NOT_FOUND | — |
| KR | 6006000001 | CZNBKRSE | SUCCESS: strong match | Kim Min Jun |
| KR | 6006000099 | CZNBKRSE | NOT_FOUND | — |
| BD | 7007000001 | MTBLBDDH | SUCCESS: strong match | Rahim Uddin |
| BD | 7007000099 | MTBLBDDH | NOT_FOUND | — |
| MY | 8008000001 | MBBEMYKL | SUCCESS: strong match | Tan Wei Ming |
| MY | 8008000099 | MBBEMYKL | NOT_FOUND | — |
| TH | 9009000001 | BKKBTHBK | SUCCESS: account exists | Somchai P |
| TH | 9009000099 | BKKBTHBK | NOT_FOUND | — |
| PH | 1010000001 | BOPIPHMM | SUCCESS: format valid | Jose Cruz |
| PH | 1010000099 | BOPIPHMM | NOT_FOUND | — |
| BR | BR850000000000000000000000001 | (none) | SUCCESS: strong match | Maria Silva |
| BR | BR580000000000000000000000002 | (none) | NOT_FOUND | — |
| MX | 000000000000000013 | (none) | SUCCESS: strong match | Juan Perez |
| MX | 000000000000000026 | (none) | NOT_FOUND | — |
| AR | 0000000000000000000000 | (none) | SUCCESS: strong match | Ana Gomez |
| AR | 0000000000000000000017 | (none) | NOT_FOUND | — |
| PE | 00000000000000000020 | (none) | SUCCESS: strong match | Luis Diaz |
| PE | 00000000000000000038 | (none) | NOT_FOUND | — |
| UY | UY0000000001 | BROUUYMM | SUCCESS: strong match | Sofia Sosa |
| UY | UY0000000002 | BROUUYMM | NOT_FOUND | — |
| CL | CL0000000001 | BCHICLRM | SUCCESS: strong match | Maria Soto |
| CL | CL0000000002 | BCHICLRM | NOT_FOUND | — |
| CO | CO0000000001 | COLOCOBM | SUCCESS: strong match | Carlos Ruiz |
| CO | CO0000000002 | COLOCOBM | NOT_FOUND | — |
| EC | EC0000000001 | PICHECEQ | SUCCESS: strong match | Pedro Mora |
| EC | EC0000000002 | PICHECEQ | NOT_FOUND | — |
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 | — |
TZ (needs networkCode: "503") | +2550000000001 | SUCCESS | Test Shekimweri |
| TZ | +2550000000002 | NOT_FOUND | — |
| TZ | +2550000000003 | PROVIDER_ERROR | — |
ET (needs networkCode: "TELEBIRR") | +251911000001 | SUCCESS | Sandbox Tadesse |
| ET | +251911000002 | NOT_FOUND | — |
| ET | +251911000003 | PROVIDER_ERROR | — |
ET (needs networkCode: "MPESA") | +251911000011 | SUCCESS | Sandbox Lemma |
| ET | +251911000012 | NOT_FOUND | — |
| ET | +251911000013 | 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.
NIN Identity Verification (POST /verify/identity, TZ)
| identifier | Scenario | Success name |
|---|---|---|
11111111111111111101 | SUCCESS | Test Mwangi |
11111111111111111102 | NIN_NOT_FOUND | — |
11111111111111111103 | IDENTITY_MISMATCH | — |
11111111111111111104 | PROVIDER_ERROR | — |
NIN identifiers are exactly 20 digits. The validation object must include firstName and lastName; motherFirstName, placeOfBirth, dateOfBirth, and sex are optional and used to answer the identity challenge question.
SUCCESS: example response for 11111111111111111101
{
"id": "…",
"status": "success",
"verificationType": "NIN",
"idType": "nin",
"country": "TZ",
"identifier": "11111111111111111101",
"verified": true,
"firstName": "Test",
"lastName": "Mwangi",
"gender": "M",
"dateOfBirth": "1990-01-01",
"placeOfBirth": "Dar es Salaam",
"verifiedAt": "…"
}NIN_NOT_FOUND: example response for 11111111111111111102
{
"id": "…",
"status": "failed",
"verificationType": "NIN",
"idType": "nin",
"country": "TZ",
"identifier": "11111111111111111102",
"verified": false,
"verifiedAt": "…",
"error": { "code": "NIN_NOT_FOUND", "message": "NIN not found" }
}IDENTITY_MISMATCH: example response for 11111111111111111103
{
"id": "…",
"status": "failed",
"verificationType": "NIN",
"idType": "nin",
"country": "TZ",
"identifier": "11111111111111111103",
"verified": false,
"verifiedAt": "…",
"error": { "code": "IDENTITY_MISMATCH", "message": "Identity attributes did not match" }
}PROVIDER_ERROR: example response for 11111111111111111104
{
"id": "…",
"status": "error",
"verificationType": "NIN",
"idType": "nin",
"country": "TZ",
"identifier": "11111111111111111104",
"verifiedAt": "…",
"error": { "code": "PROVIDER_ERROR", "message": "Simulated upstream provider error" }
}Ghana Identity Verification (POST /verify/identity, GH)
Ghana Card, Voter ID, and Passport document lookups. Send country: "GH" and the matching idType. SUCCESS returns the seeded identity; to exercise inconclusive, send a validation block whose firstName/lastName/dateOfBirth does not match the SUCCESS identity below.
| idType | idNumber | Scenario | Success name |
|---|---|---|---|
ghana_card | GHA-100000001-1 | SUCCESS | Kwame Mensah |
ghana_card | GHA-100000002-2 | IDENTIFIER_NOT_FOUND | — |
ghana_card | GHA-100000003-3 | PROVIDER_ERROR | — |
voter_id | 1100000001 | SUCCESS | Ama Owusu |
voter_id | 1100000002 | IDENTIFIER_NOT_FOUND | — |
voter_id | 1100000003 | PROVIDER_ERROR | — |
passport | G1000001 | SUCCESS | Yaw Asante |
passport | G1000002 | IDENTIFIER_NOT_FOUND | — |
passport | G1000003 | PROVIDER_ERROR | — |
Passport SUCCESS returns dateOfBirth: null (passport records often omit it) — treat DOB as optional downstream.
SUCCESS: example response for GHA-100000001-1
{
"id": "…",
"status": "success",
"verificationType": "GHANA_CARD",
"idType": "ghana_card",
"country": "GH",
"identifier": "GHA-100000001-1",
"verifiedAt": "…",
"verified": true,
"firstName": "Kwame",
"lastName": "Mensah",
"middleName": "Kofi",
"dateOfBirth": "1990-04-12",
"gender": "M",
"validation": null
}IDENTIFIER_NOT_FOUND: example response for GHA-100000002-2
{
"id": "…",
"status": "failed",
"verificationType": "GHANA_CARD",
"idType": "ghana_card",
"country": "GH",
"identifier": "GHA-100000002-2",
"verifiedAt": "…",
"error": { "code": "IDENTIFIER_NOT_FOUND", "message": "No identity record found" }
}Kenya Identity Verification (POST /verify/identity, KE)
National ID, Driver's License, and Passport document lookups. Send country: "KE" and the matching idType. SUCCESS returns the seeded identity. Kenya is success/fail only — there is no client-side cross-check, so a validation block is used for matching the request (and is required for drivers_license) but never produces an inconclusive result.
| idType | idNumber | Scenario | Success name |
|---|---|---|---|
national_id | 30000001 | SUCCESS | Wanjiru Kamau |
national_id | 30000002 | IDENTIFIER_NOT_FOUND | — |
national_id | 30000003 | PROVIDER_ERROR | — |
drivers_license | DL0000001 | SUCCESS | John Otieno Omondi |
drivers_license | DL0000002 | IDENTIFIER_NOT_FOUND | — |
drivers_license | DL0000003 | PROVIDER_ERROR | — |
passport | KE0000001 | SUCCESS | Grace Achieng Akinyi |
passport | KE0000002 | IDENTIFIER_NOT_FOUND | — |
passport | KE0000003 | PROVIDER_ERROR | — |
national_id returns discrete firstName/lastName; drivers_license and passport return only a combined fullName (with firstName/lastName null) — mirroring the upstream record. drivers_license also requires validation.firstName and validation.lastName on the request (a 422 is returned otherwise).
SUCCESS: example response for 30000001
{
"id": "…",
"status": "success",
"verificationType": "KE_NATIONAL_ID",
"idType": "national_id",
"country": "KE",
"identifier": "30000001",
"verifiedAt": "…",
"verified": true,
"firstName": "Wanjiru",
"lastName": "Kamau",
"middleName": "Njeri",
"fullName": "Wanjiru Njeri Kamau",
"dateOfBirth": "1992-03-15",
"gender": "F",
"nationality": "Kenyan",
"placeOfBirth": "Nairobi"
}SUCCESS: example request for DL0000001 (drivers_license)
curl -X POST https://api.uselira.com/api/v1/verify/identity \
-H "X-API-Key: YOUR_SANDBOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"country": "KE",
"idType": "drivers_license",
"idNumber": "DL0000001",
"validation": { "firstName": "John", "lastName": "Omondi" }
}'IDENTIFIER_NOT_FOUND: example response for 30000002
{
"id": "…",
"status": "failed",
"verificationType": "KE_NATIONAL_ID",
"idType": "national_id",
"country": "KE",
"identifier": "30000002",
"verifiedAt": "…",
"error": { "code": "IDENTIFIER_NOT_FOUND", "message": "No identity record found" }
}Ghana Card Facial Verification (POST /verify/identity/facial, GH)
Facial verification matches a live selfie against the Ghana Card holder. In sandbox the selfie content is ignored — send any non-empty images.selfie and the Ghana Card number alone selects the outcome. The example below embeds a ready-to-use dummy selfie (a small base64 PNG) you can copy verbatim.
| idNumber | Scenario | error.code |
|---|---|---|
GHA-000000001-1 | SUCCESS (facialMatch: true) | — |
GHA-000000002-2 | Face does not match | FACE_MATCH_FAILED |
GHA-000000003-3 | Liveness failed | FACIAL_LIVENESS_FAILED |
GHA-000000004-4 | Photo quality too low | FACE_QUALITY_LOW |
GHA-000000005-5 | Card not found | IDENTIFIER_NOT_FOUND |
A malformed request (missing images.selfie, bad card number) returns 422 before any lookup. FACE_QUALITY_LOW, FACIAL_LIVENESS_FAILED, and FACE_NOT_DETECTED are retake-able; FACE_MATCH_FAILED is a genuine non-match.
Example request
curl -X POST https://api.uselira.com/api/v1/verify/identity/facial \
-H "X-API-Key: YOUR_SANDBOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"country": "GH",
"idType": "ghana_card",
"idNumber": "GHA-000000001-1",
"images": { "selfie": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAB/klEQVR42u3cwU0kMRAFUCgRAfGQB2dSQISBSIEzeRAMp7lxJwLQAO2pb/v966KV/V+XZxfcXH+cPq+kL6UCAAAEAAABAEAAABAAAAQAAAEAQAAAEAAABAAAAQBAAAAQAAAEAAA5JjczLvr0/vrdH93ePcy1l+uJrqf/0Pu8EnMA/Kr6uRjSAf5c/SwMtXz7B/49ewEc21qsQe3QfrJBbdJ+rEHt036mQW3VfqCBb0UA6Hgwc4bABABoeiRDhsAEAACw4fmTcwqZAAAABAAAAQBAAABoSdethYTbEiYAAIA9T6GQ21omAEDHI5lzWdEEALj4gxl1VzduAka3k3ZTOvEIGtdR4D310M+AEU1lviWQ+yF8bF+x72hE/yvoqNaS35DxjhiAMQzekuyR8J6wLPQhDEAAABAAAAQAAAEAQAAAEAAABAAAAQBAAACQf2Wy357++Px2zpe9PN3PsqP0WxFnNj6vRyjAIb1PIREHMKj6WIYggAtUH8gQAXDh6qMYmgEaqw9hKO33rqRnAnKqbx+F0n7v2kr7vSss7feus7Tfu9rSfu+aS/u9Ky/t966/tN+7Cz8Ra055/Hv3Utrv3ZEjaMUjaL3Hf9y+TMByE7Dq4z9odyZgrQlY+/EfsUcTsO5/xOTSADucP4fv1AQ4ggAIAAA+gZv2awIcQXvnCw1Swru63t7pAAAAAElFTkSuQmCC" }
}'SUCCESS: example response for GHA-000000001-1
{
"id": "…",
"status": "success",
"verificationType": "GHANA_CARD_FACIAL",
"idType": "ghana_card",
"country": "GH",
"identifier": "GHA-000000001-1",
"verifiedAt": "…",
"verified": true,
"facialMatch": true,
"firstName": "Test",
"lastName": "Mensah",
"middleName": "Kofi",
"dateOfBirth": "1990-01-01",
"gender": "MALE",
"placeOfBirth": "Greater Accra",
"nationalId": "GHA-000000001-1",
"cardId": "AS0000001",
"cardValidFrom": "2021-02-10",
"cardValidTo": "2030-08-31",
"nationality": "Ghana",
"addresses": [
{
"type": "Hometown",
"town": "Konongo",
"countryName": "Ghana",
"districtName": "Asante Akim Central Municipality",
"region": "Ashanti"
},
{
"type": "Residence",
"community": "AB",
"postalCode": "AT-1000",
"town": "Abuontem",
"countryName": "Ghana",
"districtName": "Bosomtwe",
"region": "Ashanti",
"digitalAddress": "AT-1000-0000",
"gps": {
"name": "AT-1000-0000",
"region": "Ashanti",
"district": "Bosomtwe",
"area": "Abuontem",
"street": "[UNKNOWN]",
"longitude": "-1.56362405749",
"latitude": "6.5814001723572"
}
}
],
"contact": {
"email": null,
"phoneNumbers": [{ "type": "Mobile", "phoneNumber": "0200000000", "network": "MTN" }]
},
"occupations": [{ "name": "Student" }],
"image": "data:image/png;base64,iVBORw0KGgo...",
"validation": null
}FACE_MATCH_FAILED: example response for GHA-000000002-2
{
"id": "…",
"status": "failed",
"verificationType": "GHANA_CARD_FACIAL",
"idType": "ghana_card",
"country": "GH",
"identifier": "GHA-000000002-2",
"verifiedAt": "…",
"facialMatch": false,
"error": { "code": "FACE_MATCH_FAILED", "message": "Facial verification did not match" }
}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 | — |
Bank Routing
In sandbox, the bank routing endpoints return seeded fixture data for the identifiers below only. Any other identifier returns TEST_NUMBER_NOT_FOUND (HTTP 422) — sandbox never validates or looks up arbitrary values, so a sandbox key can never return real correspondent data. Sandbox requests are free (priceUsdAtCall: null) and are not billed.
BIC validation (POST /verifications/bic)
| bic | Scenario | Result |
|---|---|---|
TESTUS33XXX | VALID (11-char) | valid: true, country_code: US, branch_code: XXX |
TESTGB2L | VALID (8-char) | valid: true, country_code: GB, branch_code: null |
TESTDE20 | VALID, test BIC | valid: true, is_test: true |
TEST | INVALID_LENGTH | valid: false, reason_code: INVALID_LENGTH |
TEST$$33 | INVALID_CHARSET | valid: false, reason_code: INVALID_CHARSET |
1234US33XXX | INVALID_STRUCTURE | valid: false, reason_code: INVALID_STRUCTURE |
Routing-number validation (POST /verifications/routing-codes)
| routing_number | Scenario | Result |
|---|---|---|
123456780 | VALID | valid: true, checksum_ok: true |
123456789 | CHECKSUM_FAILED | valid: false, reason_code: CHECKSUM_FAILED |
12345 | INVALID_LENGTH | valid: false, reason_code: INVALID_LENGTH |
Correspondent lookup (POST /verifications/correspondents)
| bic | Scenario | Result |
|---|---|---|
AAAADE33XXX | FOUND (HTTP 200) | Two seeded correspondents (SANDBOX CORRESPONDENT BANK, SANDBOX INTERMEDIARY BANK) |
BBBBDE33XXX | NO_ROUTE (HTTP 404) | reason_code: NO_ROUTE_FOUND, empty correspondents |
NOPE | INVALID (HTTP 422) | valid: false, reason_code: INVALID_LENGTH |
Batch (POST /verifications/batch)
Each item is resolved from the fixtures above by its type (bic, routing, or route). If any item uses an identifier not listed here, the whole batch returns TEST_NUMBER_NOT_FOUND (HTTP 422).
Sandbox-valid bank & operator codes
Any bank/operator code outside this list returns INVALID_BANK_CODE.
- NG:
000014(Access),000013(GTBank),000015(Zenith),000004(UBA),000016(First Bank) - GH:
GCB(GCB 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 - TZ:
003(CRDB Bank),004(NMB Bank),013(Exim Bank),015(NBC Bank),006(Stanbic Bank),011(Diamond Trust Bank),009(Bank of Africa),020(ABSA Bank),021(I&M Bank),040(Ecobank Tanzania),046(Amana Bank),031(Azania Bank),024(DCB Commercial Bank),034(BancABC),039(Mkombozi Bank),048(TPB Bank); phone operator codes:503(Vodacom M-Pesa),504(Airtel Money),501(Tigo Pesa / Zantel),506(Halotel HaloPesa),507(Azam Mobile Money) - ET:
231402(Commercial Bank of Ethiopia). Live calls accept all 43 ET institution codes, see supported banks; sandbox is a single bank to keep test surface focused. - GB:
200000(sandbox sort-code). - CN:
CN-INDIV(individual accounts). Business account verification is not currently supported. - UY/CL/CO/EC:
BROUUYMM(UY),BCHICLRM(CL),COLOCOBM(CO),PICHECEQ(EC). BR/MX/AR/PE need no bank code — omit it. - AE: no bank code — the IBAN carries routing; omit
bankCode. Sandbox seeds three UAE IBANs (AE…001succeeds). - AU:
062000(6-digit BSB; sandbox dummy BSB for all AU test accounts). - US:
123456789(9-digit ABA routing number; sandbox dummy ABA for all US test accounts). - Europe (SEPA): no bank code — the IBAN carries routing; omit
bankCode. Sandbox seeds Germany, France, Netherlands, and Spain (DE…01,FR…01,NL…01,ES…01succeed); all 21 SEPA countries are live (see Bank Account: Country Requirements). - IN:
HDFC0000001(11-character IFSC). - ID:
BMRIIDJA(BIC). - VN:
BFTVVNVX(BIC). - NP:
NABLNPKA(BIC). - PK:
HABBPKKA(BIC). - KR:
CZNBKRSE(BIC). - BD:
MTBLBDDH(BIC). - MY:
MBBEMYKL(BIC). - TH:
BKKBTHBK(BIC; account-existence check, no name match). - PH:
BOPIPHMM(BIC; format/syntax check, no name match). - UG:
EQBLUGKA(BIC; name-match check). - ZA:
250655(6-digit branch code; account-existence check, no name match). - KE: account verification uses the two-digit bank code (
01–42) — sandbox accepts01(KCB). The lipa-na-mpesa and mpesa-agent endpoints do not take a bank code.
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:JSON{ "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).