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 configureddocument_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,date→YYYY-MM-DD). Fields that could not be read arenull. - 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 status —
Approved,In Review,Declined, orNot 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:
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 combinedstatus, the list of uploadeditems, and anywarnings. Every uploaded document is an item with the fields you configured (underextracted_data), detected codes (underdetected_codes), its ownstatus, the field definitions, forensicdocument_metadata, andcross_check_result.
Decision example
For a Proof of Funds document configured withaccount_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.