Skip to content

Error reference

All errors follow the same shape:

{ "detail": "Human-readable description of what went wrong" }

The HTTP status code is the primary signal; the detail string is for human diagnostics.

The request failed validation, either at our boundary or upstream at NIMC.

detail substringLikely causeAction
requestReason / Invalid requestReasonYou passed the human label instead of the key, or the reason is not allowed for this endpointFetch fresh keys from /nimc-reasons and pass key. For demography, use nyscCheck.
must be 11 digitsNIN or phone number is malformedStrip non-digits, confirm length.
must be in dd-mm-yyyyDOB format wrong on demographyConvert to dd-mm-yyyy (e.g. 03-09-1999).
Verification failedNIMC rejected the lookup (most often “no record found”)Try a different mode or confirm the data with the holder.

Token is missing, expired (>60 min old), or revoked. Re-login.

Your wallet has no units. Top up before retrying. See Wallet & units.

The platform may also return 402 Active subscription required for verification if your org’s yearly subscription has expired. Contact support to renew.

The token is valid but the user lacks permission for this action. The most common cause: the user does not have the IDENTITY role. Have a platform admin enable it on the user.

Returned by /verify-nin/requery when no matching record exists. Confirm the reference_id is correct and was generated against this org.

Pydantic-level validation failure — your JSON body is structurally wrong (missing required field, wrong type). The detail array names each offending field.

{
"detail": [
{ "loc": ["body", "nin"], "msg": "field required", "type": "value_error.missing" }
]
}

You hit the rate limit. Back off and retry. See Rate limits.

A server-side or upstream problem. Retry with exponential backoff (start at 1s, double up to 30s, cap at 5 retries). If it persists after a few minutes, contact support with:

  1. The request’s reference_id (if a verification call was attempted)
  2. The exact request body (with the NIN/phone redacted)
  3. The exact response body and HTTP status

Failed verifications never debit your wallet. You can retry safely without losing units. Re-queries are similarly free.

The only edge case: in-person verifications where NIMC’s face match returns “below threshold” technically completed an upstream lookup — RandaVerify still records the call in your audit log but does not debit the wallet.