Skip to content

Sandbox and test data

Sandbox keys return deterministic test data for every product, including not-found, timeout and provider-failure outcomes.

View as Markdown

Requests made with an sk_test_ key never leave Speedmap. They run through the same validation, entitlement, consent and idempotency checks as live requests, then a simulator answers with fixed test identities. Sandbox calls are free and billing.amount_kobo is always 0.

Use the values below as request bodies. Each one is copyable and produces the outcome in its title.

Test identities

The simulator knows six people. Their NIN, BVN and phone number are linked, so the same person can be found through any product.

NameNINBVNPhoneDate of birthNotes
Clarke Eliza Griffin9876543210922222222221080312345671992-04-18Share code SPM001
Bellamy Augustus Blake0987654321022222222222080298765431988-11-02SIM swapped 210 days ago
Octavia Aurora Blake4561237890322222222223080511122331999-07-25
Monty Green1111111111122222222224080612345001985-01-30SIM swapped 400 days ago
John Paxton Murphy2222222222222222222225080999900001990-03-12Watchlisted, SIM swapped 2 days ago
Raven Marie Reyes3333333333322222222226081876543211995-12-05SIM swapped 20 days ago

Outcome triggers

These identifiers work on any product that takes an NIN, BVN or other identifier:

IdentifierOutcome
All zeros, e.g. 00000000000200 with status: "not_found" and match: false
All nines, e.g. 99999999999202 with status: "pending" (provider timeout). The next GET /v1/verifications/{reference_id} resolves it.
51515151515The provider fails. The request returns 503 verification_unavailable. Retrying is safe.

For face checks, the image value controls the outcome: a value containing SPOOF fails liveness, and a value containing MISMATCH with a bvn fails the face comparison. Any other value of at least 20 characters passes.

Raw NIN access

Test values with method: "nin" need the raw-NIN entitlement, which NIMC restricts to financial institutions and government agencies. Without it they return 403 not_entitled. The same NINs work with method: "in_person" and any selfie_image of at least 100 characters.

Consent requests behave like live ones, but you can play the data subject:

  • On the hosted consent page (authorization_url), the one-time code is always 123456. Five wrong codes lock the request.
  • Or skip the page and decide through the API with your sandbox key:
curl -X POST "http://localhost:4000/v1/sandbox/consents/cns_.../approve" \
  -H "Authorization: Bearer sk_test_..."

Use /deny instead of /approve to simulate a refusal. Both return the updated consent and fire consent.updated to your webhook endpoints. With a live key these endpoints return 403 sandbox_only.

A full BVN record check in the sandbox: create a consent for BVN 22222222221, approve it, then call POST /v1/verify/bvn with method: "core" and the consent_id.

Test values by product

Generated from the live product catalog.

NIN Verification

POST /v1/verify/nin · Product reference

Verified (Clarke Griffin)
{
  "method": "nin",
  "nin": "98765432109",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Verified (Bellamy Blake)
{
  "method": "nin",
  "nin": "09876543210",
  "reason": "employmentRecruitment",
  "consent": {
    "obtained": true
  }
}
Share code
{
  "method": "share_code",
  "share_code": "SPM001",
  "reason": "financialProducts"
}
Not found
{
  "method": "nin",
  "nin": "00000000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Provider timeout (resolves on requery)
{
  "method": "nin",
  "nin": "99999999999",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

BVN Verification

POST /v1/verify/bvn · Product reference

Boolean match
{
  "method": "boolean",
  "bvn": "22222222221",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  },
  "match": {
    "first_name": "Clarke",
    "last_name": "Griffin"
  }
}
Boolean no-match
{
  "method": "boolean",
  "bvn": "22222222222",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  },
  "match": {
    "last_name": "Smith"
  }
}
Watchlisted BVN (boolean)
{
  "method": "boolean",
  "bvn": "22222222225",
  "reason": "creditBackgroundCheck",
  "consent": {
    "obtained": true
  },
  "match": {
    "last_name": "Murphy"
  }
}

Face Liveness & Match

POST /v1/verify/face · Product reference

Live and matching
{
  "image": "data-LIVE-selfie-0001",
  "bvn": "22222222221",
  "reason": "financialProducts"
}
Spoof (fails liveness)
{
  "image": "data-SPOOF-photo-of-photo",
  "reason": "financialProducts"
}
Different person
{
  "image": "data-MISMATCH-selfie",
  "bvn": "22222222221",
  "reason": "financialProducts"
}

Phone Identity Lookup

POST /v1/verify/phone · Product reference

Linked number
{
  "phone": "08031234567",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Unlinked number
{
  "phone": "08000000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

Business Verification (KYB)

POST /v1/verify/business · Product reference

Active company
{
  "rc_number": "RC1234567"
}
Wound-up company
{
  "rc_number": "RC1111111",
  "include": [
    "directors",
    "winding_up"
  ]
}
Business name
{
  "rc_number": "BN2345678"
}
By TIN
{
  "tin": "23456789-0001"
}

Bank Account Verification

POST /v1/verify/account · Product reference

Name matches
{
  "account_number": "0123456789",
  "bank_code": "058",
  "match": {
    "name": "Clarke Griffin"
  }
}
Name mismatch
{
  "account_number": "1234567890",
  "bank_code": "044",
  "match": {
    "name": "John Doe"
  }
}
Corporate account
{
  "account_number": "4567890123",
  "bank_code": "011"
}

Fraud Signals

POST /v1/signals · Product reference

High risk
{
  "phone": "08099990000",
  "bvn": "22222222225",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Medium risk (recent SIM swap)
{
  "phone": "08187654321",
  "bvn": "22222222226",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Low risk
{
  "phone": "08031234567",
  "bvn": "22222222221",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

International Passport

POST /v1/verify/passport · Preview: sandbox only · Product reference

Valid document
{
  "passport_number": "A12345678",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Not found
{
  "passport_number": "A00000000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

Driver's Licence

POST /v1/verify/drivers-license · Preview: sandbox only · Product reference

Valid document
{
  "license_number": "LAG12345AA01",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Not found
{
  "license_number": "LAG00000AA00",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

Voter's Card

POST /v1/verify/voters-card · Preview: sandbox only · Product reference

Valid document
{
  "vin": "90F5B1A2C3D4E5F6071",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}
Not found
{
  "vin": "00F0B0A0C0D0E0F0000",
  "reason": "financialProducts",
  "consent": {
    "obtained": true
  }
}

Questions? Email developers@speedmap.ng. This page is also available as Markdown.