> ## 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.

# Informe de Document AI: campos extraídos

> Referencia de Document AI de Didit: endpoint de carga, JSON de campos extraídos por documento, estado y entrada features[] de la decisión.

## Descripción general

Document AI acepta hasta 3 documentos por paso (PDF o imagen: PDF, JPG, JPEG, PNG, TIFF, WebP). Cada documento se clasifica según su `document_key` configurado, lo lee un modelo de visión y lenguaje con un esquema construido a partir de tus definiciones de campos y se somete a un análisis forense de PDF/EXIF. Para cada documento se almacena:

* Los **campos extraídos**: un mapa cuyas claves son los `key` de campo que configuraste, con valores tipados según los declaraste (`text` → string, `number` → number, `date` → `YYYY-MM-DD`). Los campos que no se pudieron leer son `null`.
* **Códigos QR y códigos de barras detectados**: payloads decodificados y coordenadas en píxeles para cada página renderizada. Un código QR que se puede localizar pero no decodificar se devuelve igualmente con `parsed_payload: null`.
* El **estado del documento**: `Approved`, `In Review`, `Declined` o `Not Finished`.
* **Metadatos del documento**: análisis forense del archivo, incluida cualquier evidencia de superposición o manipulación.
* **Resultados de la verificación cruzada**: el resultado de la comparación del nombre con la identidad verificada y de cualquier referencia cruzada de campos personalizados.

## Subida de documentos

Los documentos se suben de uno en uno al endpoint de Document AI. En una sesión alojada o en un flujo con SDK, esto se gestiona automáticamente; el contrato es:

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

| Campo | Obligatorio | Descripción |
| - | - | - |
| `document_key` | sí | El documento configurado al que corresponde este archivo |
| `document` | sí | El archivo que se va a subir |
| `locale` | no | Configuración regional usada para resolver el título y la descripción que se muestran en pantalla |

La respuesta hace avanzar el flujo:

```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"]
}
```

El paso se completa (`next_step` pasa más allá de `DOCUMENT_AI`) cuando todas las entradas de `required_document_keys` aparecen en `uploaded_document_keys` y no queda ningún documento sin terminar.

## Dónde aparece en las respuestas de la API

`GET /v3/session/{sessionId}/decision/` muestra Document AI en dos lugares, tanto en sesiones de Verificación de usuarios (KYC) como de Verificación de empresas (KYB). El array `document_ai_documents[]` y el informe en PDF son idénticos independientemente de `session_kind`:

* **`features[]`**: una entrada de resumen por cada nodo de Document AI, que se usa para enumerar qué funciones se ejecutaron:

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

* **`document_ai_documents[]`**: el resultado completo, con un grupo por cada nodo de Document AI. Cada grupo incluye el `status` combinado del nodo, la lista de `items` subidos y cualquier `warnings`. Cada documento subido es un elemento con los campos que configuraste (en `extracted_data`), los códigos detectados (en `detected_codes`), su propio `status`, las definiciones de campos, los `document_metadata` forenses y `cross_check_result`.

Los estados de cada documento de un nodo se combinan en el estado del nodo según la precedencia **Declined > In Review > Approved**.

## Ejemplo de decisión

Para un documento de **Prueba de fondos** configurado con `account_holder` (texto), `balance` (número), `currency` (texto) y `statement_date` (fecha):

```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` empieza en 1. `position` contiene el polígono detectado, mientras que `x`, `y`, `width` y `height` indican su rectángulo delimitador. Todas las coordenadas usan el espacio de píxeles de la página renderizada, cuyas dimensiones son `page_width` y `page_height`. `detected_codes` es un array vacío cuando no se encuentra ningún código compatible. Trata un elemento con `parsed_payload: null` solo como indicación de presencia y ubicación, no como un valor decodificado.

Como se puede hacer referencia a cada campo mediante `document_ai.<field_key>`, puedes controlar las bifurcaciones y las [reglas de estado personalizadas](https://docs.didit.me/es/core-technology/document-ai/warnings-document-ai.md) directamente a partir de los valores de `extracted_data`, incluidas las referencias cruzadas con otros pasos, como `kyc.full_name` o las respuestas de cuestionarios.


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