Skip to main content

Overview

Document AI accepts up to 3 documents per step (PDF or image — PDF, JPG, JPEG, PNG, TIFF, WebP). Each document is classified by its configured document_key, read by a vision-language model using a schema built from your field definitions, and run through PDF/EXIF forensics. For every document it stores:
  • The extracted fields — a map keyed by your configured field key, with values typed as you declared them (text → string, number → number, dateYYYY-MM-DD). Fields that could not be read are null.
  • Detected QR codes and barcodes - decoded payloads and pixel coordinates for every rendered page. A QR code that can be located but not decoded is still returned with parsed_payload: null.
  • The document statusApproved, In Review, Declined, or Not Finished.
  • Document metadata — file forensics including any overlay/manipulation evidence.
  • Cross-check results — the outcome of name matching against the verified identity and of any custom field cross-references.

Uploading documents

Documents are uploaded one at a time to the Document AI endpoint. In a hosted session or SDK flow this is handled for you; the contract is:
The response advances the flow:
The step completes (next_step moves past DOCUMENT_AI) once every entry in required_document_keys appears in uploaded_document_keys and no document is left unfinished.

Where it appears in API responses

GET /v3/session/{sessionId}/decision/ surfaces Document AI in two places, for both User Verification (KYC) and Business Verification (KYB) sessions — the document_ai_documents[] array and PDF report are identical regardless of session_kind:
  • features[] — a summary entry per Document AI node, used to enumerate which features ran:
  • document_ai_documents[] — the full result, one group per Document AI node. Each group carries the node’s combined status, the list of uploaded items, and any warnings. Every uploaded document is an item with the fields you configured (under extracted_data), detected codes (under detected_codes), its own status, the field definitions, forensic document_metadata, and cross_check_result.
Each node’s per-document statuses combine into the node status using the precedence Declined > In Review > Approved.

Decision example

For a Proof of Funds document configured with account_holder (text), balance (number), currency (text), and statement_date (date):
page_number is 1-based. position contains the detected polygon, while x, y, width, and height provide its bounding box. All coordinates use the rendered page’s pixel space, whose dimensions are page_width and page_height. detected_codes is an empty array when no supported code is found. Treat an item with parsed_payload: null as presence and location only, not as a decoded value. Because every field is addressable as document_ai.<field_key>, you can drive branching and custom status rules directly from the extracted_data values — including cross-references against other steps such as kyc.full_name or questionnaire answers.