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:

…00not_found
…99failed (simulated registry outage)
…98verified, but face_match is not_matched (face-match endpoints)
anything elseverified (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
{
  "success": true,
  "data": {
    "…": "…"
  },
  "request_id": "req_6f1c…"
}
Error
{
  "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…"
}
HTTPerror.codeWhat to do
400validation_errorFix the fields listed in error.details.
401invalid_api_keyMissing, wrong or revoked key.
402insufficient_balanceTop up your wallet from the dashboard.
403live_not_enabledLive access isn’t approved for this business yet.
403business_suspendedYour account is suspended. Contact UVerify.
404not_foundUnknown verification id.
409duplicate_referenceThis reference was already used. Fetch the earlier result instead.
429rate_limitedMore than 120 requests a minute on one key. Back off and retry.
503check_unavailableThat service is temporarily paused (e.g. registry outage).
500internal_errorRetry 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"}'
Response · 200
{
  "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>"}'
Response · 200
{
  "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"}'
Response · 200
{
  "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>"}'
Response · 200
{
  "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"}'
Response · 200
{
  "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>"}'
Response · 200
{
  "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"}'
Response · 200
{
  "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>"}'
Response · 200
{
  "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"}'
Response · 200
{
  "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"}'
Response · 200
{
  "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"
Response · 200
{
  "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"
Response · 200
{
  "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"
Response · 200
{
  "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"
Response · 200
{
  "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