API reference · v1
Globba Verify API
One REST endpoint checks what your customer tells you against national identity records and returns match results. Requests and responses are JSON over HTTPS. The base URL is https://verify.globbahq.com/v1.
Overview
- You send an identity number (NIN or BVN), the details your customer gave you, the purpose, and their consent.
- We compare those details with the record and return
exact,partialornonefor each name, andtrue/falsefor the date of birth. - The record itself is never returned or stored. Identity numbers are kept only as a keyed hash plus their last two digits.
Authentication
Send your secret key as a bearer token: Authorization: Bearer gv_test_…. Create and revoke keys in the dashboard. A key is shown once, when you create it. Keep keys on your server, never in an app or a browser.
Test and live
Keys starting gv_test_ run in test mode: free, answered from the test identities, never touching real records. Keys starting gv_live_ check real records and are charged. Live keys work once your business is approved and the check type is enabled on your account. Each mode only sees its own verifications.
Create a verification
POST /v1/identity/verifications
curl https://verify.globbahq.com/v1/identity/verifications \
-H "Authorization: Bearer gv_test_…" \
-H "Idempotency-Key: onboarding-8841-nin" \
-H "Content-Type: application/json" \
-d '{
"type": "NIN",
"identifier": "70000000001",
"subject": {
"first_name": "Ada",
"last_name": "Obi",
"date_of_birth": "1994-02-11"
},
"purpose": "customer_onboarding",
"consent": {
"reference": "consent-8841",
"method": "in_app",
"obtained_at": "2026-11-04T09:40:12+01:00"
},
"customer_reference": "customer-8841"
}'| Field | Rules |
|---|---|
type | NIN or BVN. |
identifier | The 11-digit number. |
subject | first_name, last_name (at least one), and optionally date_of_birth as YYYY-MM-DD. |
purpose | One of customer_onboarding, account_recovery, transaction_review, employee_screening, tenant_screening. It must be a purpose your account is approved for. |
consent | reference (your record of the consent), method (in_app, web, paper, recorded_call, other) and obtained_at (ISO 8601 with offset, within the last 90 days). |
customer_reference | Optional. Your own id for the customer, returned with the result. |
Reading the result
{
"id": "ver_MHK3Q2A1x9Lm4TqR",
"object": "verification",
"mode": "test",
"type": "NIN",
"status": "completed",
"outcome": "verified",
"result": {
"record_found": true,
"first_name": "exact",
"last_name": "exact",
"date_of_birth": true
},
"identifier_last2": "01",
"purpose": "customer_onboarding",
"consent": { "reference": "consent-8841", "method": "in_app", "obtained_at": "2026-11-04T08:40:12.000Z" },
"customer_reference": "customer-8841",
"billable": false,
"price": { "amount_kobo": 0, "currency": "NGN" },
"error": null,
"created_at": "2026-11-04T08:40:13.204Z"
}| outcome | Meaning |
|---|---|
verified | A record exists and every detail you supplied matched (names exactly or closely, date of birth exactly). |
not_verified | A record exists, but at least one supplied detail did not match. Look at result to see which. |
not_found | No record exists for that number. |
provider_error | The identity source couldn’t answer. status is failed, nothing is charged, and you can retry with a new Idempotency-Key. |
A partial name is a close spelling (for example a missing letter). Decide in your own flow whether partial is enough. date_of_birth is null when you didn’t send one, or when the source didn’t check it.
Retrieve and list
GET /v1/identity/verifications/{id} returns one verification.
GET /v1/identity/verifications?limit=20&starting_after=ver_… lists them newest first. limit is 1–100; pass the last id you received as starting_after for the next page while has_more is true.
Consent and purpose
You must have your customer’s consent for each check, for the purpose you send, and keep your own record of it. The consent object tells us which record that is. We refuse requests whose consent is missing, dated in the future, or older than 90 days, and requests for a purpose your account isn’t approved for. Never check someone who hasn’t agreed to it.
Idempotency
Every POST needs an Idempotency-Key header, unique per check (8–128 letters, digits, . _ : -). Sending the same key with the same body returns the first result again, with Idempotent-Replayed: true, and is never charged twice. The same key with a different body is refused with 409 idempotency_conflict.
Billing
Live checks are paid from your prepaid balance at your agreed price per check. found and not_found answers are charged; provider_error answers are not, and any amount held for them is returned at once. With too little balance the API answers 402 insufficient_balance; top up and retry with the same Idempotency-Key.
Errors
{
"error": {
"code": "invalid_request",
"message": "The request body is not valid.",
"details": [{ "param": "identifier", "message": "Must be 11 digits" }],
"request_id": "req_4k2PZr0aQe9mT1xY"
}
}| Status | code | When |
|---|---|---|
| 400 | invalid_request, invalid_json, idempotency_key_required, consent_expired, consent_in_future | The request needs fixing; details names the fields. |
| 401 | unauthorized | Missing, wrong or revoked key. |
| 402 | insufficient_balance | Live balance too low for the check. |
| 403 | live_access_not_approved, check_not_enabled, check_not_available, purpose_not_allowed, account_suspended | Your account isn’t allowed to make this check yet. |
| 404 | not_found | No verification with that id in this key’s mode. |
| 409 | idempotency_conflict, request_in_progress | Key reused with a different body, or the first request is still running. |
| 415 | unsupported_media_type | Send Content-Type: application/json. |
| 429 | rate_limited | Too many requests; wait Retry-After seconds. |
Every response carries a Request-Id header. Quote it when you contact us.
Rate limits
Each key may make a set number of requests a minute. Responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset. Ask us if you need more.
Test identities
With a gv_test_ key, these numbers give fixed answers. Any other number is not_found.
| Type | Number | Record | Answer |
|---|---|---|---|
| NIN | 70000000001 | Ada Chiamaka Obi, 1994-02-11 | Found |
| NIN | 70000000002 | — | not_found |
| NIN | 70000000003 | — | provider_error |
| BVN | 22200000001 | Tunde Bakare, 1988-09-30 | Found |
| BVN | 22200000002 | — | not_found |
| BVN | 22200000003 | — | provider_error |
Send a different name or date of birth with a found number to see partial, none and not_verified.