In-Person
The strongest verification mode. Combines a NIN lookup with a biometric face match against a freshly-captured selfie of the holder.
POST/verify-nin/in-person
Request
Section titled “Request”| Field | Type | Required | Notes |
|---|---|---|---|
nin | string | ✅ | Exactly 11 digits |
selfie_image | string | ✅ | Base64-encoded JPEG of a live selfie (no data:image/jpeg;base64, prefix) |
reason | string | ✅ | A key from /nimc-reasons |
# Base64-encode the JPEG without newlinesSELFIE_B64=$(base64 < selfie.jpg | tr -d '\n')
curl -X POST https://api.randaverify.com/verify-nin/in-person \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg nin '12345678901' --arg img "$SELFIE_B64" --arg reason 'corporate' \ '{nin:$nin, selfie_image:$img, reason:$reason}')"import base64, requests
with open("selfie.jpg", "rb") as f: selfie_b64 = base64.b64encode(f.read()).decode()
resp = requests.post( "https://api.randaverify.com/verify-nin/in-person", headers={"Authorization": f"Bearer {token}"}, json={ "nin": "12345678901", "selfie_image": selfie_b64, "reason": "corporate", }, timeout=45, # face match adds latency)Response (200)
Section titled “Response (200)”Returns the standard normalised record. NIMC’s match score is reflected in the underlying response and surfaced via the data.status / data.message fields when relevant — a 200 from this endpoint already implies the match succeeded above NIMC’s threshold.
Failure modes
Section titled “Failure modes”| Status | When | Recover by |
|---|---|---|
400 | NIN invalid, selfie unreadable, or match score below threshold | Re-capture the selfie in better lighting; ensure the NIN matches the person in the photo. |
402 | Org wallet empty | Top up. |
500 | Upstream face-match service unreachable | Retry with backoff. |
Cost & idempotency
Section titled “Cost & idempotency”Charged 1 unit on success, same as standard verification. A failed match (below threshold) still costs 1 unit because NIMC ran the comparison — see Wallet & units.