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

A lookup NIMC completes is charged one unit, including a no-match answer: Invalid NIN, Suspended NIN, Record not found, or a NIN restricted by its holder. NIMC bills every completed lookup, so these appear in your history as No match with the reason, and retrying the same input will not change the answer.

Everything else is not charged: timeouts, NIMC outages or “try again later”, 5xx errors, and requests we reject before calling NIMC (such as an invalid reason, which we now check against /nimc-reasons first). Retry those safely. Re-queries are always free.