The digid.kyc/1 document
The fields of the JSON document a verification ends in, for your backend.
A verification ends in one JSON document, digid.kyc/1: who the card says the person is, the checks and the verdict, the face match and the fingerprints. The Flutter and Web SDKs build it with the same code, so it is byte-for-byte the same shape everywhere. digid sends it nowhere; your app sends it to your backend.
Example
Abbreviated, with synthetic values. A document with fingerprints is larger, because it carries the images.
{
"schema": "digid.kyc/1",
"created_at": "2026-10-29T18:40:00Z",
"sdk": { "api_version": "0.1.0", "platform": "android" },
"licence": { "state": "licensed", "evaluation": false },
"subject": {
"nin": "19900101111110000123",
"given_names": "AMINA JUMA",
"surname": "HASSAN",
"sex": "female",
"date_of_birth": "1990-01-01",
"date_of_birth_source": "nin",
"card_type": "citizen",
"expiry_date": null
},
"document": {
"type": "nida_id",
"overall": "pass",
"checks": [{ "id": "nin_format", "status": "pass", "detail": "20 digits; first 8 form a valid date" }]
},
"face": { "verdict": "match", "score": 0.0, "threshold": 0.0, "liveness": { "passed": true } },
"fingerprints": [
{ "code": "L2", "finger": "left_index", "format": "wsq", "ppi": 500, "width": 522, "height": 539,
"capture": "contactless", "image_b64": "/6D/qAB6…" }
],
"integrity": { … }
}
Top level
| Field | Type | Meaning |
|---|---|---|
schema |
string | Always digid.kyc/1. A breaking change would be digid.kyc/2. |
created_at |
string | When the capture finished, from the device clock, UTC (RFC 3339) |
sdk.api_version |
string | The engine version |
sdk.platform |
string | android, ios, web |
licence.state |
string | licensed, grace (expired, inside the grace period) or evaluation |
licence.evaluation |
boolean | true when no valid licence was applied: the result is watermarked and never better than review |
subject |
object or null |
What the card says; null for a fingerprint-only capture |
document |
object or null |
The card, its checks and the verdict |
face |
object or null |
The face match; null without a selfie step |
fingerprints |
list | Accepted fingerprints; empty without the fingerprint step |
integrity |
object | The tamper check. See Verify on your backend. |
The document also carries the fields NIDA's biometric verification needs, ready to use; they are described for customers who sign in, in NIDA fingerprint submission fields.
subject
| Field | NIDA card | Driving licence |
|---|---|---|
nin |
The 20-digit NIN | null |
given_names |
Given names, as printed | Given names (field 2) |
surname |
Surname | Surname (field 1) |
sex |
male or female |
null |
date_of_birth |
YYYY-MM-DD, from the NIN |
YYYY-MM-DD (field 3) |
date_of_birth_source |
nin: NIDA cards print no date of birth; the NIN's first 8 digits are it |
card |
card_type |
citizen, resident or refugee |
null |
expiry_date |
YYYY-MM-DD, or null when the card prints none |
YYYY-MM-DD (field 4b) |
residence |
absent | Permanent place of residence (field 8) |
Unread values are null. Names are upper case, as printed.
document
| Field | Meaning |
|---|---|
type |
nida_id or tz_driving_licence |
overall |
The verdict: pass, review or fail |
checks |
Every check: id, status (pass, fail, warn, not_applicable, unverifiable) and a readable detail. See Check codes. |
driving_licence |
Licences only: licence_number (field 5), reference_number (4d), issue_date (4a), expiry_date (4b), issuing_authority (4c), categories (9, for example ["A", "B"]) |
back |
Only when the back was read. See Back of the card. |
The verdict:
pass: every check passed and, where the flow had them, the face matched and liveness passed.review: nothing failed outright, but something is unverified or uncertain. Route it to a person.fail: a check failed.
face
| Field | Meaning |
|---|---|
verdict |
match, uncertain or no_match |
liveness.passed |
true when the liveness check passed |
score, threshold |
Numbers for your audit trail. verdict already applies them; do not apply your own cut-off. |
fingerprints
Each accepted finger: code (NIDA's finger code: R or L for the hand, then a digit from 1 to 5), finger (spelled out, for example right_middle), format (wsq), ppi (500), width, height, capture (contactless or contact) and image_b64 (the WSQ file, base64). See Fingerprints for NIDA.
Versions and compatibility
- New optional fields can appear in
digid.kyc/1at any time. The driving licence fields anddocument.backarrived this way. Ignore fields you do not know. - A NIDA document without a back is unchanged by those additions.
- A change that could break a reader becomes
digid.kyc/2.
Native Android and iOS
The native SDKs hand your app the engine result instead (finishJson() / finishJSON()). It has the same verdict (overall), checks and face match, with the card under card (NIDA), driving_licence or card_back, the licence status under licence (including licence_id and org_name), and liveness beside face. Customers who sign in can read its full field list in the full field reference.