International PassportPreview
Verify a international passport against the Nigeria Immigration Service record. Sandbox only until the Nigeria Immigration Service data agreement is live.
Verifies the document against the Nigeria Immigration Service record and reports whether it has expired. This product is in preview: it works with sandbox keys while the Nigeria Immigration Service data agreement is finalized.
- Availability
- Preview (sandbox only)
- Indicative price
- ₦200.00 per completed check
- Consent
- Your attestation (
client_attested).
Preview
International Passport answers with sandbox keys only. Live keys receive 403 product_not_live until the provider agreement is live.
Body parameters
passport_numberstringrequiredFormat: a letter followed by 8 digits, e.g.
A12345678.reasonstringrequiredPurpose of the check. One of the 38 NIMC purpose codes. See the purpose code list.
consentobjectrequiredYour attestation that you obtained the data subject's consent for this purpose.
consent.obtainedbooleanrequiredAlways
true.matchobjectOptional values to compare against the record. Each comparison is returned in field_matches; match is true only if all of them agree.
match.first_namestringMust not be empty.
match.middle_namestringMust not be empty.
match.last_namestringMust not be empty.
match.date_of_birthstringFormat: date,
YYYY-MM-DD.
matchisfalsewhen the document has expired.
Send an Idempotency-Key header so a retried request is never billed twice. See Idempotency.
curl -X POST http://localhost:4000/v1/verify/passport \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"passport_number": "A12345678",
"reason": "financialProducts",
"consent": {
"obtained": true
}
}'A completed check returns 200 with a verification object. status is verified or not_found. If the provider has not answered in time you get 202 with status: "pending"; retrieve it later or wait for the verification.completed webhook.
{
"reference_id": "spm_8171f3a87cbe221341f7185f",
"object": "verification",
"product": "passport",
"method": "passport",
"status": "verified",
"match": true,
"field_matches": null,
"field_confidence": null,
"mode": "sandbox",
"reason": "financialProducts",
"subject": "*****5678",
"summary": {
"first_name": "A*****",
"last_name": "O*****",
"document_type": "passport",
"expired": false,
"expires_at": "2031-06-09"
},
"consent": {
"mechanism": "client_attested",
"consent_id": null,
"timestamp": "2026-10-19T09:41:07.512Z"
},
"source": "api",
"error": null,
"billing": {
"amount_kobo": 0,
"currency": "NGN"
},
"latency_ms": 350,
"created_at": "2026-10-19T09:41:07.512Z",
"updated_at": "2026-10-19T09:41:07.874Z"
}summary
first_namestringFirst name on the record, masked to its first letter:
A*****.last_namestringLast name on the record, masked to its first letter.
document_typestringDocument type.
expiredbooleanWhether the expiry date has passed.
expires_atstring | nullExpiry date,
YYYY-MM-DD;nullfor documents without expiry.
Full-tier accounts calling the REST API also receive provider, provider_reference and data, the normalized record. MCP, webhooks, lists and bulk results never include it. See Response shaping.
{
"provider": "sandbox",
"provider_reference": "SBX6CB753DB2C",
"data": {
"document_type": "passport",
"document_number": "A12345678",
"first_name": "CLARKE",
"middle_name": "ELIZA",
"last_name": "GRIFFIN",
"date_of_birth": "1992-04-18",
"gender": "female",
"issued_at": "2021-06-10",
"expires_at": "2031-06-09",
"expired": false,
"issuing_authority": "Nigeria Immigration Service",
"passport_type": "Standard ePassport",
"place_of_issue": "Ikoyi",
"photo": "/9j/4AAQSkZJRgABAQEASABIAAD…"
}
}Send these bodies with a sandbox key. More outcome triggers are on the Sandbox page.
{
"passport_number": "A12345678",
"reason": "financialProducts",
"consent": {
"obtained": true
}
}{
"passport_number": "A00000000",
"reason": "financialProducts",
"consent": {
"obtained": true
}
}| Status | Code | Meaning |
|---|---|---|
400 | invalid_request | The body failed validation. details lists each field. |
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Live only: wallet balance is below the check price. |
403 | not_entitled | Your workspace is not enabled for this product or method. |
403 | product_not_live | Live keys: this product is sandbox only for now. |
409 | idempotency_key_reused | The Idempotency-Key was used with a different body. |
422 | provider_rejected_request | The upstream registry rejected the request. |
503 | verification_unavailable | Temporary failure. Retry, with the same or a new Idempotency-Key. |
All errors share one shape. See Errors for the full list.
Questions? Email developers@speedmap.ng. This page is also available as Markdown.