Overview
The ID verification report captures everything Didit extracted and validated from a government-issued identity document — passports, ID cards, driver’s licenses, and residence permits. It bundles the OCR’d biographical and document fields, signed URLs to the captured media, parsed and geolocated address data, per-side image quality scores, MRZ contents, multi-script (Latin / non-Latin) breakdowns, and cross-session document matches. The report is produced after the user completes the document-capture step in a workflow (or hits the standalone OCR endpoint). Didit identifies the document type, runs OCR, validates the MRZ / barcode / QR code, parses the address, screens for tampering (screen capture, printed copy, portrait manipulation), and compares the document against every other document captured in your application. Each report carries its ownstatus — independent of the overall session status — that reflects how the ID step alone resolved:
- Approved — document recognized, all required fields extracted, no decline-routed warning fired.
- In Review — one or more warnings fired and your workflow routes them to review.
- Declined — an auto-decline condition fired (unsupported document, expired document, portrait missing, blocklist hit, adaptive-age failure) or a warning whose configured action is Decline fired (minimum/maximum age default to Decline).
- Expired — the document’s
expiration_datepassed after the verification. Didit’s ongoing expiration monitoring flips the report fromApprovedtoExpired, appends aDOCUMENT_EXPIREDwarning, and moves an approved session to theKyc Expiredsession status. - Not Finished — the user never completed the capture step.
Where it appears in API responses
The ID report ships inside theid_verifications[] array — always a JSON array, never a singular id_verification object. Multiple entries appear when a workflow runs more than one document step (for example a primary ID plus a step-up).
- Session decision API —
GET /v3/session/{sessionId}/decision/returnsid_verifications[]at the top level. See Retrieve session decision. - Webhooks —
session.status.updatedpayloads include the sameid_verifications[]array once the step has produced data. See Webhooks. - Standalone OCR API — direct document submission returns a singular
id_verificationobject with the same fields. See OCR standalone API.
Read
response.id_verifications[0] and iterate the array. The singular id_verification shape only exists on the standalone OCR API — it does not exist on the v3 decision endpoint.Schema
The canonical field-by-field schema lives on the Data models reference page. The fields below come straight fromIDVerificationV3Serializer, which extends IDVerificationV2Serializer and adds node_id plus the cross-session matches[] array — 40 fields in total.
Top-level fields
| Field | Type | Description |
|---|---|---|
status | "Approved" | "Declined" | "In Review" | "Expired" | "Not Finished" | ID-step status. |
node_id | string | null | Workflow graph node that produced this report. |
document_type | "Passport" | "Identity Card" | "Driver's License" | "Residence Permit" | "Health Insurance Card" | "Tax Card" | null | Recognized top-level document family (human-readable). |
document_subtype | string | null | Accepted document subtype code from the workflow document settings. Region-specific documents include the region, for example QUEENSLAND_DRIVER_LICENSE_GENERIC. |
document_number | string | OCR’d document number. |
personal_number | string | OCR’d personal / national identification number, when distinct from the document number. |
portrait_image, front_image, front_video, back_image, back_video, full_front_image, full_back_image | string (signed URL) | Captured media. URLs are signed and time-limited — download promptly, never persist the URL. |
front_image_camera_front, back_image_camera_front | string (signed URL) | null | Frames captured by the user’s front-facing camera during document capture (used for the cross-camera face check). |
front_image_camera_front_face_match_score, back_image_camera_front_face_match_score | float (0–100) | null | Similarity score between the front-camera frame and the document portrait. |
front_image_quality_score, back_image_quality_score | object | null | Quality assessment per side (see Image quality scores). |
date_of_birth, expiration_date, date_of_issue | string (YYYY-MM-DD) | Document dates. |
age | number | Holder age in years computed from date_of_birth. |
issuing_state | string (ISO 3166-1 alpha-3) | Issuing country code. |
issuing_state_name | string | Localized country name. |
first_name, last_name, full_name | string | Holder name in the script chosen by preferred_characters (see below). |
gender | "M" | "F" | "U" | Gender, when present on the document (U = unknown). |
address, formatted_address | string | Raw and geocoded/formatted address strings. |
place_of_birth | string | OCR’d place of birth. |
marital_status | "SINGLE" | "MARRIED" | "DIVORCED" | "WIDOWED" | "UNKNOWN" | Marital status, when present on the document. |
nationality | string (ISO 3166-1 alpha-3) | Holder nationality, when distinct from issuing state. |
extra_fields | object | Document-specific extras (DL categories, blood group, alternate-script names, …). |
mrz | object | null | Parsed MRZ key/value fields. |
parsed_address | object | null | Structured, geocoded address (street_1, street_2, city, region, country, postal_code, address_type, formatted_address, document_location, raw_results, is_best_match). |
extra_files[] | array of signed URLs | Additional images attached to this document. |
matches[] | array | Cross-session document matches (see Cross-session matches). |
warnings[] | array | Module-level warnings — see ID verification warnings. |
Image quality scores
front_image_quality_score and back_image_quality_score each return:
| Field | Type | What it measures |
|---|---|---|
focus_score | number 0–100 | Sharpness — top-10% local Laplacian variance, robust to uniform backgrounds. Weight 45%. |
brightness_score | number 0–100 | Penalizes too-dark or overexposed images. Weight 30%. |
brightness_issue | "ok" | "too_dark" | "too_bright" | Direction of the brightness problem, when brightness_score is low. |
resolution_score | number 0–100 | Based on total pixel count of the capture. Weight 25%. |
is_document_fully_visible | boolean | null | true when all four document corners are visible, false when any corner is cut off, null when corner detection was unavailable. |
overall_score | number 0–100 | Weighted composite (focus 45%, brightness 30%, resolution 25%). |
Cross-session matches
matches[] lists up to 5 other documents in your application that match this one — same date of birth, same issuing country, and a highly similar full name. Blocklisted documents additionally require an exact document-number match. Sessions belonging to the same user (same vendor_data) are excluded.
Each entry includes session_id, session_number, vendor_data, verification_date, user_details (name, document_type, document_number), status, is_blocklisted (true when the document was added to your blocklist), api_service, and a signed front_image_url.
Status values
| Status | Meaning | Downstream effect |
|---|---|---|
Approved | Document recognized, required fields extracted, all checks passed at the configured thresholds. | Counts as a successful ID check. |
In Review | One or more warnings fired and the workflow routes them to review. | Session also moves to In Review until a reviewer acts. |
Declined | Auto-decline condition fired (unsupported document, expired document, portrait missing, blocklist hit, adaptive-age failure) or a warning configured to Decline fired. | Session is declined unless another approved branch satisfies the workflow. |
Expired | The document’s expiration date passed after approval. Set by Didit’s ongoing expiration monitoring (respecting per-country expiration_check_mode exemptions), together with a DOCUMENT_EXPIRED warning. | An approved session moves to Kyc Expired. |
Not Finished | User abandoned the capture step. | The ID branch did not produce a result. |
Multi-script documents (Latin / non-Latin)
Some documents — Kyrgyz, Kazakh, Russian, Japanese, Korean, Chinese, Arabic, Thai, and others — print the holder’s name, address, or place of birth in both a Latin transliteration and the local script. You choose which script powers the top-level response with the workflow (or standalone-API) settingpreferred_characters:
| Value | Populates top-level fields with | Opposite script goes to |
|---|---|---|
latin (default) | The Latin transliteration printed on the document | extra_fields.*_non_latin |
non_latin | The local-script values printed on the document | extra_fields.*_latin |
extra_fields under suffixed keys: first_name_non_latin, last_name_non_latin, middle_name_non_latin, full_name_non_latin, address_non_latin, place_of_birth_non_latin (or the matching _latin variants).
When alternate-script fields appear
- Only when both scripts are actually present on the document. If an OCR field nominally labelled “Surname-Kyrgyz (Cyrillic)” is extracted as Latin-script text (homoglyphs or a Latin transliteration), it does not qualify as a non-Latin alternate and that key is omitted.
full_name_non_latin(andfull_name_latin) are always reconstructed from the individual first-, middle-, and last-name components when both are available — the raw “Full Name” field from OCR is ignored for consistency.- When
preferred_characters=latinbut the document carries only non-Latin text (so the top-level fields end up non-Latin), Didit runs a transliteration pass and exposesfirst_name_latin,last_name_latin,middle_name_latin,full_name_latin,place_of_birth_latin, andaddress_latinas a Latin fallback.
last_name_non_latin is absent because the document’s “Surname (Cyrillic)” field came back as Latin characters on this sample — there was no genuine non-Latin surname to extract.
Examples
Approved — clean Spanish identity card (all fields)
In Review — QR not detected on a document that should have one
Abridged — a real response always carries the full field set shown above.Security note
The signed URLs returned for document images and videos are temporary — they expire after a limited validity window. Treat them as short-lived: download what you need promptly and do not cache or surface them publicly. Typically your application only needsstatus, a handful of biographical fields, and the warnings — store as little as possible to minimize the surface for any future breach.
Related
- ID verification warnings — full warning enum, causes, and remediation.
- Document monitoring — how Didit screens for tampering and cross-session duplicates.
- Supported documents — which document types and countries are covered.
- Webhooks — listen for
session.status.updatedto receive the report. - Data models — ID verification — canonical schema with every field.