Skip to main content

Overview

Warnings on the ID verification report flag every condition Didit observed while reading and validating the document. They land in the warnings[] array on each item of id_verifications[] (see ID verification report), with the shape described in Data models — Warning object: feature, risk, additional_data, log_type, short_description, long_description, node_id. Every warning has three layers:
  1. The risk code — a stable identifier you can match on in your code.
  2. The log_type — derived from the action your configuration assigns to the risk at evaluation time: Decline → error, Review → warning, anything else → information.
  3. The decision impact — set by the workflow’s configurable risk groups. The same risk code can be routed to Approve, Review, or Decline depending on how your application is configured.

Auto-decline conditions

In workflows, the following risks always force the ID report (and the session) to Declined. They cannot be configured: For the standalone OCR API, the unconditional-decline set is DOCUMENT_EXPIRED, MINIMUM_AGE_NOT_MET, PORTRAIT_IMAGE_NOT_DETECTED, SCREEN_CAPTURE_DETECTED, PRINTED_COPY_DETECTED, PORTRAIT_MANIPULATION_DETECTED, and PUBLIC_DOCUMENT_IMAGE_DETECTED. In workflows, minimum age is configurable (default Decline) and the three document-liveness risks are threshold-driven (see below). That API’s configurable risks take DECLINE or NO_ACTION rather than a Review verdict, as request parameters. The one Review outcome it can return is not configurable: when a requested document-liveness check produces no usable score, the response is In Review with a DOCUMENT_LIVENESS_NOT_COMPUTED warning (see Document liveness).

Configurable verification settings

In the Didit console, the remaining ID risks are grouped into settings you can route to Approve, Review, or Decline (per workflow, and per node in graph workflows): The Silent Capture duplicate and blocklist risks come from the Face Search on the selfie taken during document capture. The search runs while Silent Capture Face Search (document_selfie_face_search_enabled) is on, which is the default, and Face Search is not switched off on the Liveness step; otherwise none of these six risks is raised. Two ID risk families are threshold-driven instead of Approve/Review/Decline toggles:
  • Document liveness — SCREEN_CAPTURE_DETECTED, PRINTED_COPY_DETECTED, PORTRAIT_MANIPULATION_DETECTED. Each fraud type has its own decline and review thresholds: score below the decline threshold → error + Declined; below the review threshold → warning + In Review; otherwise information.
  • Cross-camera face match — LOW_FRONT_CAMERA_FACE_MATCH_SIMILARITY, governed by document_selfie_portrait_match_decline_threshold / document_selfie_portrait_match_review_threshold.

Configuring document liveness thresholds

In the workflow editor these thresholds live on the Forgery tab of the ID Verification step, one card per fraud type: Portrait replacement, Printed copy and Screen capture. Each check gives the document a score from 0 to 100 for how genuine it looks. A higher score means the document is more likely genuine. The two values on a card split that scale into three bands: Raising either value makes the check stricter: more sessions land in the band above it. Lowering a value lets more sessions through. In the editor the Decline value cannot move past the Review value. Through the API, a Decline value above the Review value removes the In Review band. Platform defaults, used when a workflow does not set a value: Start from the defaults and move one value at a time. Each card shows its default and a Reset to default button, so you can always return to it. The editor also warns you about these configurations:
  • Review at 100. Only a perfect score passes, so almost every session goes to In Review or is declined.
  • Decline at 100. Only a perfect score avoids a decline, so almost every session is declined.
  • Both values at 0. No score is ever flagged, so the check is effectively off.
Setting both values to the same number removes the In Review band: a score below it is declined and any other score passes. When both Printed copy and Screen capture would flag the same document, only SCREEN_CAPTURE_DETECTED is reported. The cross-camera face match uses the same idea with one difference at the boundary: a score equal to its review threshold still goes to In Review. Four ID risks are neither configurable nor threshold-driven. POSSIBLE_FRONT_CAMERA_FACE_IN_BLOCKLIST always routes to Review: a selfie that is close to a blocklisted face, without being a confirmed match, is for a person to judge, never an automatic decline and never ignored. BARCODE_SIGNATURE_INVALID always routes to Review. It fires only when a barcode carries an issuing-authority signature that fails cryptographic verification, so there is no configuration in which a proven forgery is ignored. DOCUMENT_BACK_SIDE_NOT_AVAILABLE is always information and never affects the decision: it reports a limitation of Didit’s document catalog, not a property of the document presented, so there is no configuration in which it can decline or review a genuine holder. FRONT_CAMERA_CAPTURED_DOCUMENT always routes to Review. It fires only when the front-camera frame taken while the document is scanned shows an identity document and no person, so a capture that says nothing about who held the document always reaches a human. It is checked whenever the document capture selfie match (is_document_selfie_portrait_match_enabled) is on.

Warnings produced

Verified against collect_ocr_logs, the document-capture flow, and process_ocr_logs_and_get_status. Short descriptions below are the exact short_description strings returned by the API.

Document recognition and quality

The capture flow can also reject an upload with the feedback codes IMAGE_RESOLUTION_TOO_LOW, DOCUMENT_NOT_FULLY_VISIBLE, IMAGE_QUALITY_TOO_LOW, and DOCUMENT_OCCLUSION_DETECTED (a finger or object is judged to be physically covering printed text). Each prompts a retake in the SDK and is recorded on the report as its own risk, routed by the Image Quality settings — DOCUMENT_OCCLUSION_DETECTED and IMAGE_QUALITY_TOO_LOW share one action. They describe the capture: a retake that succeeds clears the warning. Whether a covered field should affect the decision is the separate, integrity-side CRITICAL_FIELD_OCCLUSION_DETECTED below, which is raised at decision time and defaults to Review.
If your workflow anchors identity on Face Match rather than the document portrait, consider routing Document Without Portrait to Decline — otherwise a portrait-less document family reaches Face Match with nothing to compare against.

Field extraction

MRZ, QR, barcode

All three MRZ risks are skipped for document types with known-unreliable MRZs.
Barcode signature verification currently covers French national ID cards, whose ANTS 2D-Doc barcode is signed by the issuing authority. BARCODE_SIGNATURE_INVALID is raised only when the signature check itself rejects the payload. A barcode with no signature, one signed by an authority not yet in Didit’s trust store, or one whose signature cannot be decoded is treated as unauthenticated data and validated against the MRZ and printed text as before, without raising this risk.US and Canadian driving licence (AAMVA) barcodes are not cryptographically verified: digital signing there is optional and jurisdiction-specific, and no jurisdiction publishes verification keys, so Didit only detects and logs whether a payload carries a signature; the signature itself is never checked. AAMVA signature failures are not a risk signal today. A tampered AAMVA payload only surfaces as BARCODE_VALIDATION_FAILED, and only if the tampering also makes the barcode disagree with the MRZ or printed/OCR data - a forged signature on an otherwise internally consistent payload passes with no signal at all.The user is never asked to re-capture on BARCODE_SIGNATURE_INVALID: a signature that does not match the payload cannot be fixed by taking a better photo.

Identity matching

Document liveness (tampering)

Threshold-driven per fraud type in workflows. On the standalone OCR API these three risks unconditionally decline, and a requested check that produces no usable score returns In Review instead of approving. The scores themselves are on every V3 report as document_liveness, including when no warning fired, so an approved document can still be audited.

Capture channel integrity

The log_type mirrors the configured action: error for Decline, warning for Review, information for No action. Recommended action: treat a declined session as an injected capture and ask the person to retry on a physical device with its built-in camera. Signals a genuine person can produce never raise INJECTION_ATTACK_DETECTED. They raise FRAME_INJECTION_SUSPECTED, which is informational until you set id_verification_frame_injection_action to Review or Decline. Setting that action to Decline declines every capture with any sign of injection on the ID verification step, including the signs a genuine person can produce, so expect some genuine captures to be declined with it. Apps that relay a real camera, such as a phone used as a webcam or an effects layer over a real webcam, are not reported as injection attacks. This is injection attack detection, which is separate from presentation attack detection (a fake presented to a real camera).

Known public document images

Expected-details mismatches

When you pass expected_details to a session, Didit raises a mismatch warning per field that does not match. One grouping (expected_details_mismatch_action, default Review) controls routing for all of these: Each mismatch warning carries the expected and extracted values in additional_data.

Age

Address

Cross-session document matches

In addition to the warnings above, the V3 ID report ships a matches[] array — up to 5 other documents in your application with the same date of birth, the same issuing country, and a highly similar full name (blocklisted documents additionally require an exact document-number match), excluding sessions that belong to the same user. Documents added to your blocklist appear with is_blocklisted: true. Documents on your allowlist still appear in matches, but their duplicate-user action is skipped. Each match includes session_id, session_number, vendor_data, verification_date, user_details (name, document_type, document_number), status, is_blocklisted, api_service, and a signed front_image_url.

Examples

Configurable warning at its default routing (information)

Auto-decline on expired document

Expected-details mismatch with payload

Warning types

Each risk is assigned a severity based on your application’s configuration. The three severities are:
Last modified on November 12, 2026