Skip to content
Lira APILira API

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)

CountryaccountNumberbankCodeScenarioSuccess name
NG0000000017000014SUCCESSTest Okoye
NG0000000024000014NOT_FOUND
NG0000000031000014PROVIDER_ERROR
GH1000000001GCBSUCCESSSandbox Mensah
GH1000000002GCBNOT_FOUND
GH1000000003GCBPROVIDER_ERROR
ZM3000000001023SUCCESSTest Banda
ZM3000000002023NOT_FOUND
ZM3000000003023PROVIDER_ERROR
CI4000000001ORANGESUCCESSAlpha Kouamé
CI4000000002ORANGENOT_FOUND
CI4000000003ORANGEPROVIDER_ERROR
SN5000000001ORANGESUCCESSSandbox Diop
SN5000000002ORANGENOT_FOUND
SN5000000003ORANGEPROVIDER_ERROR
CM6000000001MTNSUCCESSTest Nkomo
CM6000000002MTNNOT_FOUND
CM6000000003MTNPROVIDER_ERROR
BF7000000001ORANGESUCCESSAlpha Ouedraogo
BF7000000002ORANGENOT_FOUND
BF7000000003ORANGEPROVIDER_ERROR
ML8000000001ORANGESUCCESSSandbox Traoré
ML8000000002ORANGENOT_FOUND
ML8000000003ORANGEPROVIDER_ERROR
BJ9000000001ORANGESUCCESSTest Hounsou
BJ9000000002ORANGENOT_FOUND
BJ9000000003ORANGEPROVIDER_ERROR
TG0100000001ORANGESUCCESSAlpha Agbeko
TG0100000002ORANGENOT_FOUND
TG0100000003ORANGEPROVIDER_ERROR
TZ2000000001003SUCCESSTest Shekimweri
TZ2000000002003NOT_FOUND
TZ2000000003003PROVIDER_ERROR
ET1000000000001231402SUCCESSSandbox Bekele
ET1000000000002231402NOT_FOUND
ET1000000000003231402PROVIDER_ERROR
KE100000001101SUCCESSSandbox Wambui
KE100000001201NOT_FOUND
KE100000001301PROVIDER_ERROR
UG1400000001EQBLUGKASUCCESS: strong name matchSandbox Nakato
UG1400000002EQBLUGKAIDENTITY_MISMATCH: name did not match (verified: false)Sandbox Mismatch
UG1400000003EQBLUGKANOT_FOUND
ZA2500000001250655SUCCESS: account exists (existence only, no name score)Sandbox van der Merwe
ZA2500000002250655NOT_FOUND
GBGB-VERIFIED-001200000SUCCESS: no major risk identifiedSANDBOX TEST ACCOUNT
GBGB-SOMERISK-002200000RISK_IDENTIFIED: some risks identified (verified: false)SANDBOX SOME RISK
GBGB-NOTFOUND-003200000NOT_FOUND
GBGB-RISK-004200000RISK_IDENTIFIED: significant risk identified (verified: false)SANDBOX SIGNIFICANT RISK
CN6228480402564890018CN-INDIVSUCCESS: individual strong matchSANDBOX TEST
CN6228480402564890026CN-INDIVIDENTITY_MISMATCH: name did not matchSANDBOX MISMATCH
DEDE09000000000000000001(none)SUCCESS: strong name matchSANDBOX DE ACCOUNT
DEDE79000000000000000002(none)IDENTITY_MISMATCH: name did not matchSANDBOX DE MISMATCH
DEDE52000000000000000003(none)NOT_FOUND
FRFR4900000000000000000000001(none)SUCCESS: strong name matchSANDBOX FR ACCOUNT
FRFR2200000000000000000000002(none)IDENTITY_MISMATCH: name did not matchSANDBOX FR MISMATCH
FRFR9200000000000000000000003(none)NOT_FOUND
NLNL9200000000000001(none)SUCCESS: strong name matchSANDBOX NL ACCOUNT
NLNL6500000000000002(none)IDENTITY_MISMATCH: name did not matchSANDBOX NL MISMATCH
NLNL3800000000000003(none)NOT_FOUND
ESES5500000000000000000001(none)SUCCESS: strong name matchSANDBOX ES ACCOUNT
ESES2800000000000000000002(none)IDENTITY_MISMATCH: name did not matchSANDBOX ES MISMATCH
ESES9800000000000000000003(none)NOT_FOUND
AEAE360000000000000000001(none)SUCCESS: strong name matchSANDBOX AE ACCOUNT
AEAE090000000000000000002(none)IDENTITY_MISMATCH: name did not matchSANDBOX AE MISMATCH
AEAE790000000000000000003(none)NOT_FOUND
AU10000001062000SUCCESS: strong name matchSANDBOX AU ACCOUNT
AU10000002062000IDENTITY_MISMATCH: name did not matchSANDBOX AU MISMATCH
AU10000003062000NOT_FOUND
US20000001123456789SUCCESS: strong name matchSANDBOX US ACCOUNT
US20000002123456789IDENTITY_MISMATCH: name did not match (verified: false)SANDBOX US MISMATCH
US20000003123456789NOT_FOUND
IN1001000001HDFC0000001SUCCESS: strong matchArjun Kumar
IN1001000099HDFC0000001NOT_FOUND
ID2002000001BMRIIDJASUCCESS: strong matchBudi Santoso
ID2002000099BMRIIDJANOT_FOUND
VN3003000001BFTVVNVXSUCCESS: strong matchNguyen Van A
VN3003000099BFTVVNVXNOT_FOUND
NP4004000001NABLNPKASUCCESS: strong matchRam Bahadur
NP4004000099NABLNPKANOT_FOUND
PK5005000001HABBPKKASUCCESS: strong matchAli Raza
PK5005000099HABBPKKANOT_FOUND
KR6006000001CZNBKRSESUCCESS: strong matchKim Min Jun
KR6006000099CZNBKRSENOT_FOUND
BD7007000001MTBLBDDHSUCCESS: strong matchRahim Uddin
BD7007000099MTBLBDDHNOT_FOUND
MY8008000001MBBEMYKLSUCCESS: strong matchTan Wei Ming
MY8008000099MBBEMYKLNOT_FOUND
TH9009000001BKKBTHBKSUCCESS: account existsSomchai P
TH9009000099BKKBTHBKNOT_FOUND
PH1010000001BOPIPHMMSUCCESS: format validJose Cruz
PH1010000099BOPIPHMMNOT_FOUND
BRBR850000000000000000000000001(none)SUCCESS: strong matchMaria Silva
BRBR580000000000000000000000002(none)NOT_FOUND
MX000000000000000013(none)SUCCESS: strong matchJuan Perez
MX000000000000000026(none)NOT_FOUND
AR0000000000000000000000(none)SUCCESS: strong matchAna Gomez
AR0000000000000000000017(none)NOT_FOUND
PE00000000000000000020(none)SUCCESS: strong matchLuis Diaz
PE00000000000000000038(none)NOT_FOUND
UYUY0000000001BROUUYMMSUCCESS: strong matchSofia Sosa
UYUY0000000002BROUUYMMNOT_FOUND
CLCL0000000001BCHICLRMSUCCESS: strong matchMaria Soto
CLCL0000000002BCHICLRMNOT_FOUND
COCO0000000001COLOCOBMSUCCESS: strong matchCarlos Ruiz
COCO0000000002COLOCOBMNOT_FOUND
ECEC0000000001PICHECEQSUCCESS: strong matchPedro Mora
ECEC0000000002PICHECEQNOT_FOUND

Phone Verification (POST /verify/phone)

CountryphoneNumberScenarioSuccess subscriber name
NG+2348000000001SUCCESSTest Okoye
NG+2348000000002NOT_FOUND
NG+2348000000003PROVIDER_ERROR
GH (needs networkCode: "MTN")+2330000000001SUCCESSSandbox Mensah
GH+2330000000002NOT_FOUND
GH+2330000000003PROVIDER_ERROR
UG+2560000000001SUCCESSSandbox Nakato
UG+2560000000002NOT_FOUND
UG+2560000000003PROVIDER_ERROR
ZM+2600000000001SUCCESSTest Banda
ZM+2600000000002NOT_FOUND
ZM+2600000000003PROVIDER_ERROR
CI+2250000000001SUCCESSAlpha Kouamé
CI+2250000000002NOT_FOUND
CI+2250000000003PROVIDER_ERROR
SN+2210000000001SUCCESSSandbox Diop
SN+2210000000002NOT_FOUND
SN+2210000000003PROVIDER_ERROR
CM+2370000000001SUCCESSTest Nkomo
CM+2370000000002NOT_FOUND
CM+2370000000003PROVIDER_ERROR
BF+2260000000001SUCCESSAlpha Ouedraogo
BF+2260000000002NOT_FOUND
BF+2260000000003PROVIDER_ERROR
ML+2230000000001SUCCESSSandbox Traoré
ML+2230000000002NOT_FOUND
ML+2230000000003PROVIDER_ERROR
BJ+2290000000001SUCCESSTest Hounsou
BJ+2290000000002NOT_FOUND
BJ+2290000000003PROVIDER_ERROR
TG+2280000000001SUCCESSAlpha Agbeko
TG+2280000000002NOT_FOUND
TG+2280000000003PROVIDER_ERROR
TZ (needs networkCode: "503")+2550000000001SUCCESSTest Shekimweri
TZ+2550000000002NOT_FOUND
TZ+2550000000003PROVIDER_ERROR
ET (needs networkCode: "TELEBIRR")+251911000001SUCCESSSandbox Tadesse
ET+251911000002NOT_FOUND
ET+251911000003PROVIDER_ERROR
ET (needs networkCode: "MPESA")+251911000011SUCCESSSandbox Lemma
ET+251911000012NOT_FOUND
ET+251911000013PROVIDER_ERROR

BVN Identity Verification (POST /verify/identity, NG)

idNumberScenario
22222222201SUCCESS
22222222202NOT_FOUND
22222222203PROVIDER_ERROR

SUCCESS: example response for 22222222201

JSON
{
  "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

JSON
{
  "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

JSON
{
  "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)

identifierScenarioSuccess name
11111111111111111101SUCCESSTest Mwangi
11111111111111111102NIN_NOT_FOUND
11111111111111111103IDENTITY_MISMATCH
11111111111111111104PROVIDER_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

JSON
{
  "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

JSON
{
  "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

JSON
{
  "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

JSON
{
  "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.

idTypeidNumberScenarioSuccess name
ghana_cardGHA-100000001-1SUCCESSKwame Mensah
ghana_cardGHA-100000002-2IDENTIFIER_NOT_FOUND
ghana_cardGHA-100000003-3PROVIDER_ERROR
voter_id1100000001SUCCESSAma Owusu
voter_id1100000002IDENTIFIER_NOT_FOUND
voter_id1100000003PROVIDER_ERROR
passportG1000001SUCCESSYaw Asante
passportG1000002IDENTIFIER_NOT_FOUND
passportG1000003PROVIDER_ERROR

Passport SUCCESS returns dateOfBirth: null (passport records often omit it) — treat DOB as optional downstream.

SUCCESS: example response for GHA-100000001-1

JSON
{
  "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

JSON
{
  "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.

idTypeidNumberScenarioSuccess name
national_id30000001SUCCESSWanjiru Kamau
national_id30000002IDENTIFIER_NOT_FOUND
national_id30000003PROVIDER_ERROR
drivers_licenseDL0000001SUCCESSJohn Otieno Omondi
drivers_licenseDL0000002IDENTIFIER_NOT_FOUND
drivers_licenseDL0000003PROVIDER_ERROR
passportKE0000001SUCCESSGrace Achieng Akinyi
passportKE0000002IDENTIFIER_NOT_FOUND
passportKE0000003PROVIDER_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

JSON
{
  "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)

Terminal
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

JSON
{
  "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.

idNumberScenarioerror.code
GHA-000000001-1SUCCESS (facialMatch: true)
GHA-000000002-2Face does not matchFACE_MATCH_FAILED
GHA-000000003-3Liveness failedFACIAL_LIVENESS_FAILED
GHA-000000004-4Photo quality too lowFACE_QUALITY_LOW
GHA-000000005-5Card not foundIDENTIFIER_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

Terminal
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

JSON
{
  "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

JSON
{
  "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)

identifieridentifierTypeScenarioSuccess name
500001paybillSUCCESSTest Paybill Org
500002paybillNOT_FOUND
500003paybillPROVIDER_ERROR
600001tillSUCCESSTest Till Merchant
600002tillNOT_FOUND
600003tillPROVIDER_ERROR

M-Pesa Agent (POST /verify/mpesa-agent, KE)

agentCodeScenarioSuccess name
700001SUCCESSTest Njoroge Agent
700002NOT_FOUND
700003PROVIDER_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)

bicScenarioResult
TESTUS33XXXVALID (11-char)valid: true, country_code: US, branch_code: XXX
TESTGB2LVALID (8-char)valid: true, country_code: GB, branch_code: null
TESTDE20VALID, test BICvalid: true, is_test: true
TESTINVALID_LENGTHvalid: false, reason_code: INVALID_LENGTH
TEST$$33INVALID_CHARSETvalid: false, reason_code: INVALID_CHARSET
1234US33XXXINVALID_STRUCTUREvalid: false, reason_code: INVALID_STRUCTURE

Routing-number validation (POST /verifications/routing-codes)

routing_numberScenarioResult
123456780VALIDvalid: true, checksum_ok: true
123456789CHECKSUM_FAILEDvalid: false, reason_code: CHECKSUM_FAILED
12345INVALID_LENGTHvalid: false, reason_code: INVALID_LENGTH

Correspondent lookup (POST /verifications/correspondents)

bicScenarioResult
AAAADE33XXXFOUND (HTTP 200)Two seeded correspondents (SANDBOX CORRESPONDENT BANK, SANDBOX INTERMEDIARY BANK)
BBBBDE33XXXNO_ROUTE (HTTP 404)reason_code: NO_ROUTE_FOUND, empty correspondents
NOPEINVALID (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…001 succeeds).
  • 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…01 succeed); 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 (0142) — sandbox accepts 01 (KCB). The lipa-na-mpesa and mpesa-agent endpoints do not take a bank code.

Testing Async Webhooks

  1. Register a webhook URL in your dashboard and subscribe to verification.completed.

  2. POST a verification request with "mode": "async". You will receive a pending response immediately.

  3. After about 3 seconds, your webhook URL receives a verification.completed event:

    JSON
    {
      "event": "verification.completed",
      "data": {
        "id": "verif_abc123",
        "status": "success",
        "type": "ACCOUNT_NUMBER",
        "accountName": "Test Okoye"
      }
    }
  4. If your process crashes before delivery, the verification stays pending. This is intentional (lets you test crash recovery in your own code).