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:
POST https://verification.didit.me/v3/document-ai/documents/
multipart/form-data — Session-Token: <session token>
FieldRequiredDescription
document_keyyesThe configured document this file fulfills
documentyesThe file to upload
localenoLocale used to resolve the on-screen title/description
The response advances the flow:
{
  "valid": true,
  "next_step": "DOCUMENT_AI",
  "document_ai_status": "In Progress",
  "uploaded_document_keys": ["proof_of_funds"],
  "required_document_keys": ["proof_of_funds", "payslip"]
}
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

Document AI is listed in the decision features[] array in GET /v3/session/{sessionId}/decision/, one entry per Document AI node:
{
  "features": [
    { "feature": "DOCUMENT_AI", "node_id": "feature_document_ai_1" }
  ]
}
Each node’s per-document statuses combine into the feature status using the precedence Declined > In Review > Approved.

Extracted fields example

For a Proof of Funds document configured with account_holder (text), balance (number), currency (text), and statement_date (date), a successful extraction stores:
{
  "account_holder": "Sophia Martinez",
  "balance": 18450.75,
  "currency": "EUR",
  "statement_date": "2026-05-31"
}
Because every field is addressable as document_ai.<field_key>, you can drive branching and custom status rules directly from these values — including cross-references against other steps such as kyc.full_name or questionnaire answers.