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.
  • 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:
  • 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), 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):
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.