API reference
UVerify API
Verify Nigerian identities and businesses with one REST call. Every check returns the same response shape, so you handle one result instead of six.
Introduction
Base URL: https://uverify.com.ng/v1. Requests and responses are JSON with snake_case fields. Money is in naira (e.g. 100.5) and timestamps are ISO 8601 in UTC.
Each ID check comes in two services with separate prices: the lookup (e.g. POST /identity/nin), and the lookup + face match (POST /identity/nin/face-match), which also compares a selfie with the photo on the record.
New here? Create an account for a free sandbox key, then try calls in the dashboard’s sandbox playground.
Authentication
Send your API key as a bearer token: Authorization: Bearer uvk_test_…. Sandbox keys start uvk_test_, and live keys start uvk_live_. The key decides the environment, so going live means swapping the key and nothing else.
Keep keys on your server. Never put them in a mobile app, browser code or a public repository. If one leaks, revoke it in the dashboard and create another.
Sandbox
Sandbox keys are free, never touch a real registry, and answer based on the last two characters of id_number:
| …00 | not_found |
| …99 | failed (simulated registry outage) |
| …98 | verified, but face_match is not_matched (face-match endpoints) |
| anything else | verified (face match: matched) |
Every found person is ADAEZE TEST OKAFOR, born 1990-01-15. Send those for all-true field_matches, or anything else to see mismatches.
Responses & errors
Every response uses the same envelope. A check that ran always returns HTTP 200, so decide on data.status, not the HTTP code.
{
"success": true,
"data": {
"…": "…"
},
"request_id": "req_6f1c…"
}{
"success": false,
"error": {
"code": "validation_error",
"message": "One or more fields are invalid.",
"details": [
"id_number must be the 11-digit BVN"
]
},
"request_id": "req_6f1c…"
}| HTTP | error.code | What to do |
|---|---|---|
| 400 | validation_error | Fix the fields listed in error.details. |
| 401 | invalid_api_key | Missing, wrong or revoked key. |
| 402 | insufficient_balance | Top up your wallet from the dashboard. |
| 403 | live_not_enabled | Live access isn’t approved for this business yet. |
| 403 | business_suspended | Your account is suspended. Contact UVerify. |
| 404 | not_found | Unknown verification id. |
| 409 | duplicate_reference | This reference was already used. Fetch the earlier result instead. |
| 429 | rate_limited | More than 120 requests a minute on one key. Back off and retry. |
| 503 | check_unavailable | That service is temporarily paused (e.g. registry outage). |
| 500 | internal_error | Retry with the same reference. You won’t be charged twice. |
Quote request_id when you contact support. You can send your own X-Request-Id header to correlate with your logs.
The verification object
- status
- verified: record found, data holds it (charged). not_found: no record (not charged). failed: registry unreachable, retry with a new reference (not charged).
- type / service
- type is the registry lookup (e.g. nin). service is what you bought: nin, or nin_face_match.
- field_matches
- true/false per field you sent (first_name, last_name, date_of_birth); null when not sent or not on the record. Names match any part of the record’s name, ignoring case and punctuation.
- face_match
- null on lookups. On face-match services: status matched · not_matched · unavailable (with reason), score 0–100, liveness "not_checked".
- data
- The normalised record. Only fields the registry returned are present.
- id_number
- Masked, e.g. 222*****678. UVerify never stores raw ID numbers or photos.
- amount_charged
- Naira, after any automatic refund.
Idempotency
Pass your own reference on every check. If a request times out, retry with the same reference: you’ll get 409 duplicate_reference rather than a second charge, and GET /verifications?reference=… returns the original result.
Rate limits
120 requests per minute per API key. Beyond that you’ll get 429 rate_limited. Back off and retry.
Billing
Live checks are paid from a prepaid NGN wallet, which you can top up online with Paystack from the dashboard. You’re charged only when a record is found. Not-found lookups and registry errors are refunded automatically, and a face-match check whose face match couldn’t run is refunded down to the lookup price. Check your prices with GET /pricing.
Identity checks
BVN lookup
POST/identity/bvn
Look up a BVN and compare the details you collected with the official record. No selfie.
Billed as bvn.
Body
id_numberstringrequired- The 11-digit Bank Verification Number.
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
Sending selfie_image here returns 400. Use the face-match endpoint below.
curl -X POST https://uverify.com.ng/v1/identity/bvn \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"22212345678","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "bvn",
"type_label": "BVN lookup",
"service": "bvn",
"service_label": "BVN lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "222*****678",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}BVN + face match
POST/identity/bvn/face-match
The BVN lookup plus a selfie compared with the photo on the record. Priced as its own service.
Billed as bvn_face_match.
Body
id_numberstringrequired- The 11-digit Bank Verification Number.
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
selfie_imagestringrequired- Base64 JPEG, PNG or WEBP of the person’s face (a data:image/…;base64, prefix is fine), up to 8MB. Matched against the photo on the ID record.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
If the face match can’t run (no photo on the record, no face in the selfie), face_match.status is "unavailable" with a reason, and you are refunded down to the plain lookup price.
Liveness is not checked yet (liveness: "not_checked"). Don’t rely on face match alone for high-risk decisions.
curl -X POST https://uverify.com.ng/v1/identity/bvn/face-match \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"22212345678","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812","selfie_image":"<base64 jpeg>"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "bvn",
"type_label": "BVN lookup",
"service": "bvn_face_match",
"service_label": "BVN + face match",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "222*****678",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": {
"status": "matched",
"score": 92,
"liveness": "not_checked"
},
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 150,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}NIN lookup
POST/identity/nin
Look up a NIN and compare the details you collected with the official record. No selfie.
Billed as nin.
Body
id_numberstringrequired- The 11-digit National Identification Number.
first_namestring- Compared with the record in field_matches.first_name.
last_namestring- Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
Sending selfie_image here returns 400. Use the face-match endpoint below.
curl -X POST https://uverify.com.ng/v1/identity/nin \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"12345678901","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "nin",
"type_label": "NIN lookup",
"service": "nin",
"service_label": "NIN lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "123*****901",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}NIN + face match
POST/identity/nin/face-match
The NIN lookup plus a selfie compared with the photo on the record. Priced as its own service.
Billed as nin_face_match.
Body
id_numberstringrequired- The 11-digit National Identification Number.
first_namestring- Compared with the record in field_matches.first_name.
last_namestring- Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
selfie_imagestringrequired- Base64 JPEG, PNG or WEBP of the person’s face (a data:image/…;base64, prefix is fine), up to 8MB. Matched against the photo on the ID record.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
If the face match can’t run (no photo on the record, no face in the selfie), face_match.status is "unavailable" with a reason, and you are refunded down to the plain lookup price.
Liveness is not checked yet (liveness: "not_checked"). Don’t rely on face match alone for high-risk decisions.
curl -X POST https://uverify.com.ng/v1/identity/nin/face-match \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"12345678901","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812","selfie_image":"<base64 jpeg>"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "nin",
"type_label": "NIN lookup",
"service": "nin_face_match",
"service_label": "NIN + face match",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "123*****901",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": {
"status": "matched",
"score": 92,
"liveness": "not_checked"
},
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 150,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Driver’s licence lookup
POST/identity/drivers-license
Look up a Driver’s licence and compare the details you collected with the official record. No selfie.
Billed as drivers_license.
Body
id_numberstringrequired- The FRSC licence number, e.g. ABC12345678DE. Spaces are ignored.
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
Sending selfie_image here returns 400. Use the face-match endpoint below.
curl -X POST https://uverify.com.ng/v1/identity/drivers-license \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"ABC12345678DE","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "drivers_license",
"type_label": "Driver’s licence lookup",
"service": "drivers_license",
"service_label": "Driver’s licence lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "ABC*******8DE",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Driver’s licence + face match
POST/identity/drivers-license/face-match
The Driver’s licence lookup plus a selfie compared with the photo on the record. Priced as its own service.
Billed as drivers_license_face_match.
Body
id_numberstringrequired- The FRSC licence number, e.g. ABC12345678DE. Spaces are ignored.
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
selfie_imagestringrequired- Base64 JPEG, PNG or WEBP of the person’s face (a data:image/…;base64, prefix is fine), up to 8MB. Matched against the photo on the ID record.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
If the face match can’t run (no photo on the record, no face in the selfie), face_match.status is "unavailable" with a reason, and you are refunded down to the plain lookup price.
Liveness is not checked yet (liveness: "not_checked"). Don’t rely on face match alone for high-risk decisions.
curl -X POST https://uverify.com.ng/v1/identity/drivers-license/face-match \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"ABC12345678DE","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812","selfie_image":"<base64 jpeg>"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "drivers_license",
"type_label": "Driver’s licence lookup",
"service": "drivers_license_face_match",
"service_label": "Driver’s licence + face match",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "ABC*******8DE",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": {
"status": "matched",
"score": 92,
"liveness": "not_checked"
},
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 150,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Voter’s card lookup
POST/identity/voters-card
Look up a Voter’s card and compare the details you collected with the official record. No selfie.
Billed as voters_card.
Body
id_numberstringrequired- The INEC voter identification number (VIN).
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
Sending selfie_image here returns 400. Use the face-match endpoint below.
curl -X POST https://uverify.com.ng/v1/identity/voters-card \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"90F5B1234567891","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "voters_card",
"type_label": "Voter’s card lookup",
"service": "voters_card",
"service_label": "Voter’s card lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "90F*********891",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Voter’s card + face match
POST/identity/voters-card/face-match
The Voter’s card lookup plus a selfie compared with the photo on the record. Priced as its own service.
Billed as voters_card_face_match.
Body
id_numberstringrequired- The INEC voter identification number (VIN).
first_namestringrequired- Required by the registry. Compared with the record in field_matches.first_name.
last_namestringrequired- Required by the registry. Compared with the record in field_matches.last_name.
dobstring- Date of birth, YYYY-MM-DD. Compared with the record in field_matches.date_of_birth.
include_photoboolean- Return the base64 photo from the ID record in data.photo. Never stored by UVerify.
selfie_imagestringrequired- Base64 JPEG, PNG or WEBP of the person’s face (a data:image/…;base64, prefix is fine), up to 8MB. Matched against the photo on the ID record.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
If the face match can’t run (no photo on the record, no face in the selfie), face_match.status is "unavailable" with a reason, and you are refunded down to the plain lookup price.
Liveness is not checked yet (liveness: "not_checked"). Don’t rely on face match alone for high-risk decisions.
curl -X POST https://uverify.com.ng/v1/identity/voters-card/face-match \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"90F5B1234567891","first_name":"Adaeze","last_name":"Okafor","dob":"1990-01-15","reference":"loan-8812","selfie_image":"<base64 jpeg>"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "voters_card",
"type_label": "Voter’s card lookup",
"service": "voters_card_face_match",
"service_label": "Voter’s card + face match",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "90F*********891",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": {
"status": "matched",
"score": 92,
"liveness": "not_checked"
},
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 150,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Tax ID (TIN) lookup
POST/identity/tin
Confirm a Tax Identification Number is valid and registered.
Billed as tin.
Body
id_numberstringrequired- The TIN, e.g. 12345678-0001.
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
curl -X POST https://uverify.com.ng/v1/identity/tin \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"12345678-0001","reference":"vendor-221"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "tin",
"type_label": "Tax ID (TIN) lookup",
"service": "tin",
"service_label": "Tax ID (TIN) lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "123*******001",
"field_matches": null,
"face_match": null,
"data": {
"id_number": "12345678-0001",
"id_type": "TIN",
"full_name": "ACME LENDING LIMITED"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Business checks
CAC business lookup
POST/business/cac
Company status, registered address, directors and beneficial owners from the Corporate Affairs Commission.
Billed as cac.
Body
id_numberstringrequired- The CAC number starting with RC, BN or IT, e.g. RC123456. Spaces are ignored.
business_typestring- Optional hint, e.g. "PRIVATE LIMITED".
referencestring- Your unique ID for this check (≤100 chars; letters, numbers, . _ : -). Reusing it returns 409 duplicate_reference instead of charging twice. Generated if omitted.
curl -X POST https://uverify.com.ng/v1/business/cac \
-H "Authorization: Bearer $UVERIFY_KEY" \
-H "Content-Type: application/json" \
-d '{"id_number":"RC123456","reference":"kyb-77"}'{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "cac",
"type_label": "CAC business lookup",
"service": "cac",
"service_label": "CAC business lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "RC1**456",
"field_matches": null,
"face_match": null,
"data": {
"legal_name": "ACME LENDING LIMITED",
"registration_number": "RC123456",
"company_type": "PRIVATE_COMPANY_LIMITED_BY_SHARES",
"status": "ACTIVE",
"registration_date": "2019-03-14",
"address": "12 Marina, Lagos",
"directors": [
{
"name": "ADA OKAFOR",
"gender": "FEMALE",
"nationality": "NIGERIAN",
"occupation": "DIRECTOR"
}
],
"beneficial_owners": [
{
"name": "ADA OKAFOR",
"shareholdings": "100%"
}
]
},
"amount_charged": 200,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Verifications
List verifications
GET/verifications
Your checks for the key’s environment, newest first. Lists never include identity data.
Query
referencestring- Exact reference. Useful after a timeout to see whether a check went through.
typestring- bvn, nin, drivers_license, voters_card, tin or cac.
servicestring- A priced service, e.g. nin_face_match.
statusstring- verified, not_found or failed.
pageinteger- Default 1.
per_pageinteger- Default 20, max 100.
curl https://uverify.com.ng/v1/verifications \
-H "Authorization: Bearer $UVERIFY_KEY"{
"success": true,
"data": {
"items": [
{
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "bvn",
"type_label": "BVN lookup",
"service": "bvn",
"service_label": "BVN lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "222*****678",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": null,
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 1,
"total_pages": 1
}
},
"request_id": "req_6f1c2a…"
}Retrieve a verification
GET/verifications/{id}
One check, including the record data.
curl https://uverify.com.ng/v1/verifications/0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77 \
-H "Authorization: Bearer $UVERIFY_KEY"{
"success": true,
"data": {
"id": "0b7c3f4e-8a61-4c1e-9f0a-6f3d2b1c9e77",
"reference": "loan-8812",
"type": "bvn",
"type_label": "BVN lookup",
"service": "bvn",
"service_label": "BVN lookup",
"environment": "live",
"status": "verified",
"message": "ID found and verified.",
"id_number": "222*****678",
"field_matches": {
"first_name": true,
"last_name": true,
"date_of_birth": true
},
"face_match": null,
"data": {
"first_name": "ADAEZE",
"middle_name": "TEST",
"last_name": "OKAFOR",
"full_name": "ADAEZE TEST OKAFOR",
"date_of_birth": "15-Jan-1990",
"gender": "Female",
"phone_number": "08000000000",
"state_of_origin": "Anambra",
"nationality": "Nigerian"
},
"amount_charged": 100,
"currency": "NGN",
"created_at": "2026-09-27T10:00:00.000Z"
},
"request_id": "req_6f1c2a…"
}Account
Wallet balance
GET/balance
Your prepaid NGN wallet balance.
curl https://uverify.com.ng/v1/balance \
-H "Authorization: Bearer $UVERIFY_KEY"{
"success": true,
"data": {
"balance": 48250,
"currency": "NGN"
},
"request_id": "req_6f1c2a…"
}Your prices
GET/pricing
The price you pay per service. custom_price is set when you have a negotiated rate.
curl https://uverify.com.ng/v1/pricing \
-H "Authorization: Bearer $UVERIFY_KEY"{
"success": true,
"data": [
{
"check_type": "nin",
"label": "NIN lookup",
"default_price": 100,
"custom_price": null,
"price": 100,
"currency": "NGN",
"is_enabled": true
},
{
"check_type": "nin_face_match",
"label": "NIN + face match",
"default_price": 150,
"custom_price": 130,
"price": 130,
"currency": "NGN",
"is_enabled": true
}
],
"request_id": "req_6f1c2a…"
}Questions? hello@elasto.ng
