> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Rapport Document AI : champs extraits

> Référence de Didit Document AI : endpoint d'envoi, JSON des champs extraits, statuts et entrée features[] pour les décisions.

## Vue d'ensemble

Document AI accepte jusqu'à 3 documents par étape (PDF ou image — PDF, JPG, JPEG, PNG, TIFF, WebP). Chaque document est classé selon son `document_key` configuré, lu par un modèle vision-langage à l'aide d'un schéma élaboré à partir de vos définitions de champs, et soumis à une analyse forensique PDF/EXIF. Pour chaque document, il conserve :

* Les **champs extraits** — une structure indexée par votre `key` de champ configurée, avec des valeurs typées selon votre déclaration (`text` → chaîne, `number` → nombre, `date` → `YYYY-MM-DD`). Les champs qui n'ont pas pu être lus ont pour valeur `null`.
* Les **codes QR et codes-barres détectés** - les payloads décodés et les coordonnées en pixels pour chaque page rendue. Un code QR qui peut être localisé mais pas décodé est tout de même renvoyé avec `parsed_payload: null`.
* Le **statut du document** — `Approved`, `In Review`, `Declined` ou `Not Finished`.
* Les **métadonnées du document** — les éléments forensiques du fichier, y compris toute preuve d'incrustation ou de manipulation.
* Les **résultats des vérifications croisées** — le résultat de la correspondance du nom avec l'identité vérifiée ainsi que de tout recoupement de champs personnalisés.

## Téléversement de documents

Les documents sont téléversés un par un vers l'endpoint Document AI. Dans une session hébergée ou un flux SDK, cela est géré pour vous ; le contrat est :

```text theme={null}
POST https://verification.didit.me/v3/document-ai/documents/
multipart/form-data — Session-Token: <session token>
```

| Champ | Obligatoire | Description |
| - | - | - |
| `document_key` | oui | Le document configuré auquel correspond ce fichier |
| `document` | oui | Le fichier à téléverser |
| `locale` | non | La locale utilisée pour résoudre le titre et la description à l'écran |

La réponse fait progresser le flux :

```json theme={null}
{
  "valid": true,
  "next_step": "DOCUMENT_AI",
  "document_ai_status": "In Progress",
  "uploaded_document_keys": ["proof_of_funds"],
  "required_document_keys": ["proof_of_funds", "payslip"]
}
```

L'étape se termine (`next_step` passe après `DOCUMENT_AI`) dès que chaque entrée de `required_document_keys` apparaît dans `uploaded_document_keys` et qu'aucun document n'est laissé inachevé.

## Où cela apparaît dans les réponses de l'API

`GET /v3/session/{sessionId}/decision/` fait apparaître Document AI à deux endroits, aussi bien pour les sessions de Vérification des utilisateurs (KYC) que de Vérification d'entreprise (KYB) — le tableau `document_ai_documents[]` et le rapport PDF sont identiques quel que soit `session_kind` :

* **`features[]`** — une entrée récapitulative par nœud Document AI, utilisée pour énumérer les fonctionnalités exécutées :

  ```json theme={null}
  { "features": [ { "feature": "DOCUMENT_AI", "node_id": "feature_document_ai_1" } ] }
  ```

* **`document_ai_documents[]`** — le résultat complet, un groupe par nœud Document AI. Chaque groupe contient le `status` combiné du nœud, la liste des `items` téléversés et les éventuels `warnings`. Chaque document téléversé est un élément comprenant les champs que vous avez configurés (sous `extracted_data`), les codes détectés (sous `detected_codes`), son propre `status`, les définitions des champs, les éléments forensiques `document_metadata` et `cross_check_result`.

Les statuts individuels des documents de chaque nœud se combinent pour former le statut du nœud selon l'ordre de priorité **Declined > In Review > Approved**.

## Exemple de décision

Pour un document de type **Justificatif de fonds** configuré avec `account_holder` (text), `balance` (number), `currency` (text) et `statement_date` (date) :

```json theme={null}
{
  "document_ai_documents": [
    {
      "node_id": "feature_document_ai_1",
      "status": "Approved",
      "items": [
        {
          "uuid": "5c1f0a2e-9b3d-4c7a-8f21-0a4e8e7d6c12",
          "document_key": "proof_of_funds",
          "status": "Approved",
          "original_filename": "statement.pdf",
          "extracted_data": {
            "account_holder": "Sophia Martinez",
            "balance": 18450.75,
            "currency": "EUR",
            "statement_date": "2026-05-31"
          },
          "detected_codes": [
            {
              "type": "QR_CODE",
              "page_number": 2,
              "position": [[124, 86], [306, 86], [306, 268], [124, 268]],
              "x": 124,
              "y": 86,
              "width": 182,
              "height": 182,
              "page_width": 1190,
              "page_height": 1684,
              "raw_payload": "SU5WLTIwMjYtMDA0Mg==",
              "parsed_payload": "INV-2026-0042"
            }
          ],
          "fields": [
            { "key": "account_holder", "name": "Account holder", "type": "text", "required": true },
            { "key": "balance", "name": "Balance", "type": "number", "required": false },
            { "key": "currency", "name": "Currency", "type": "text", "required": false },
            { "key": "statement_date", "name": "Statement date", "type": "date", "required": false }
          ],
          "document_metadata": { "is_tampered": false },
          "cross_check_result": null,
          "created_at": "2026-05-31T10:12:00Z"
        }
      ],
      "warnings": []
    }
  ]
}
```

`page_number` commence à 1. `position` contient le polygone détecté, tandis que `x`, `y`, `width` et `height` fournissent sa boîte englobante. Toutes les coordonnées utilisent l'espace en pixels de la page rendue, dont les dimensions sont `page_width` et `page_height`. `detected_codes` est un tableau vide si aucun code pris en charge n'est trouvé. Considérez un élément avec `parsed_payload: null` comme une simple présence et localisation, et non comme une valeur décodée.

Comme chaque champ est accessible sous la forme `document_ai.<field_key>`, vous pouvez piloter les branchements et les [règles de statut personnalisées](https://docs.didit.me/fr/core-technology/document-ai/warnings-document-ai.md) directement à partir des valeurs de `extracted_data` — y compris des recoupements avec d'autres étapes comme `kyc.full_name` ou des réponses à des questionnaires.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.