BVN, NIN, driver’s licence, voter’s card, TIN and CAC lookups, with name and date-of-birth matching and selfie face match. One consistent response for every check.
{ "status": "verified", "id_number": "222*****678", "field_matches": { "first_name": true, "last_name": true, "date_of_birth": true }, "face_match": { "status": "matched", "score": 92 }, "data": { "full_name": "ADAEZE TEST OKAFOR", "date_of_birth": "1990-01-15", … }, "amount_charged": 150, "currency": "NGN"}Coverage
Each check returns the same shape: a status, the matched fields and the record. Handle one response instead of six.
Bank Verification Number: name, date of birth, phone, enrolment bank, photo.
POST /identity/bvnNational Identity Number from NIMC: demographics, address and photo.
POST /identity/ninFRSC licence details, issue and expiry dates, photo.
POST /identity/drivers-licenseINEC voter identification number and holder details.
POST /identity/voters-cardConfirm a taxpayer identification number is valid and registered.
POST /identity/tinCompany status, registered address, directors and beneficial owners.
POST /business/cacHow it works
Create an account and your sandbox key is ready immediately. Test calls are free and never touch a real registry.
Send the ID number and the details you collected. Decide on status and field_matches. Reuse the same code for every check.
Submit your CAC number for a quick review, fund your wallet, and swap uvk_test_ for uvk_live_. Nothing else changes.
For developers
The details that save you a week of edge cases, built in from the start.
const res = await fetch(`${BASE}/identity/nin`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.ELASTO_VERIFY_KEY}` },
body: JSON.stringify({ id_number, selfie_image, reference: order.id }),
});
const { success, data, error } = await res.json();
if (!success) {
// error.code: insufficient_balance, duplicate_reference, …
throw new Error(error.message);
}
if (data.status === 'verified' && data.face_match?.status === 'matched') {
approve(customer);
}Identity records sealed with AES-256-GCM.
ID numbers masked and hashed. ID photos never stored.
Every view of identity data is logged with who, when and where.
Charged only for records found. Everything else is refunded automatically.
Pricing
Prepaid NGN wallet. No subscriptions, no minimums, no charge for not-found lookups or registry errors.
Checks from ₦100.00
Running high volumes? Custom rates are available. Talk to us after you sign up.
Create a free account| Check | Lookup | With face match |
|---|---|---|
| BVN | ₦100.00 | ₦150.00 |
| NIN | ₦100.00 | ₦150.00 |
| Driver's licence | ₦150.00 | ₦200.00 |
| Voter's card | ₦150.00 | ₦200.00 |
| Tax ID (TIN) | ₦100.00 | — |
| CAC business | ₦200.00 | — |
Sandbox checks are always free. Prices in Nigerian naira.
FAQ
Only when a record is found. Not-found lookups, registry outages and face matches that could not run are refunded to your wallet automatically, and every refund shows in your wallet history.
Yes. Every account gets a free sandbox key at sign-up. It returns realistic, deterministic results so you can test every outcome (found, not found, registry errors, face mismatch) before going live.
Verify your email, submit your CAC number and use case from the dashboard, and our team reviews it, usually within one business day. Then create a live key and fund your wallet. Your code stays the same.
Not yet. Face match compares a selfie against the photo on the ID record. Liveness detection is on our roadmap, and until it ships every response says liveness: "not_checked" so you can decide how much weight to give it.
Identity records are encrypted at rest with AES-256-GCM, ID numbers are stored masked and hashed, ID photos are never stored, and every view of identity data in the dashboard is written to an audit log.
Sign up, copy your sandbox key, send one request.