> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/api-rest/midapi-v2/daf/respuesta-de-resultado.md).

# Respuesta de resultado

Cuando la transacción está en estado `COMPLETED`, la respuesta de `GET /v2/daf/{transactionId}` incluye el diagnóstico completo:

#### Ejemplo de respuesta

```json
{
  "transactionId": "1c7d...e9",
  "status": "COMPLETED",
  "diagnostic": "DECLINED",
  "rejectionReason": 160,
  "diagnostics": [
    {
      "code": "160",
      "result": "fail",
      "reason": "Presentation attack detected",
      "category": "attack_detection"
    },
    {
      "code": "500",
      "result": "pass",
      "reason": "Poor front image quality",
      "category": "integrity"
    },
    {
      "code": "501",
      "result": "pass",
      "reason": "Poor back image quality",
      "category": "integrity"
    },
    {
      "code": "502",
      "result": "pass",
      "reason": "Identity mismatch between portrait and ghost image",
      "category": "biometric"
    },
    {
      "code": "503",
      "result": "pass",
      "reason": "Mismatch estimated age selfie vs portrait",
      "category": "logical"
    },
    {
      "code": "504",
      "result": "pass",
      "reason": "Mismatch estimated sex selfie vs portrait",
      "category": "logical"
    }
  ],
  "ocr": {
    "mrz": {
      "documentType": "ID",
      "issuingState": "NIC",
      "documentNumber": "6191000E",
      "nationality": "NIC",
      "dateOfBirth": "2003-02-14",
      "expiryDate": "2029-11-20",
      "sex": "M",
      "surname": "ROMERO LOPEZ",
      "givenNames": "ELVIN ANTONIO",
      "mrzValid": true
    },
    "viz": {
      "documentClassification": ["NIC-00-IDC-2017-001-01-01"],
      "vizType": "VIZ_similar_to_ID_document"
    }
  },
  "timestamp": "2026-06-26T12:00:05.000Z"
}
```

{% hint style="info" %}
Los campos opcionales (`diagnostic`, `rejectionReason`, `diagnostics`, `ocr`, `failureReason`) se omiten de la respuesta cuando no aplican, en lugar de enviarse con valor `null`. Por ejemplo, un `diagnostic = APPROVED` nunca incluye `rejectionReason`. Las filas de `diagnostics[]` son resultados independientes por cada verificación (`result = pass` o `fail`): puede haber filas con `result = fail` incluso cuando el diagnóstico global es `APPROVED`, si esa verificación concreta no fue determinante para el resultado final. Cuando `status = FAILED`, la respuesta incluye únicamente `transactionId`, `status`, `failureReason` y `timestamp`.
{% endhint %}

### Campos principales

| Campo             | Descripción                                                                                   |
| ----------------- | --------------------------------------------------------------------------------------------- |
| `diagnostic`      | `APPROVED` \| `DECLINED`. Solo se incluye cuando `status = COMPLETED`.                        |
| `rejectionReason` | Código de razón del catálogo de DAF, poblado solo si `diagnostic = DECLINED`.                 |
| `diagnostics[]`   | Detalle de las validaciones individuales ejecutadas (`code`, `result`, `reason`, `category`). |
| `ocr.mrz`         | Datos extraídos de la zona de lectura mecánica (MRZ) del documento.                           |
| `ocr.viz`         | Clasificación del documento a partir de su zona visual (VIZ).                                 |

### diagnostics

| Campo      | Tipo   | Descripción                                                                                                                                                                        |
| ---------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `code`     | string | Código de razón del catálogo de DAF.                                                                                                                                               |
| `result`   | string | `pass` \| `fail`. Resultado de esa validación concreta.                                                                                                                            |
| `reason`   | string | Descripción legible de la validación.                                                                                                                                              |
| `category` | string | Agrupación temática: `input`, `integrity`, `logical`, `biometric`, `attack_detection`, `unsupported`, `low_confidence`, `processing`, `block_list`, `escalated_review`, `unknown`. |

### Catálogo de códigos de razón (`rejectionReason` / `diagnostics[].code`)

Conviene distinguir dos niveles de lectura del resultado:

* **General.** El campo `diagnostic` (`APPROVED` / `DECLINED`) es el veredicto global de la transacción, y `rejectionReason` es el **código general** que resume el motivo del rechazo cuando `diagnostic = DECLINED`.
* **Granular.** Cada fila de `diagnostics[]` es una **señal individual** (`code` + `result = pass|fail`), cuyo `code` proviene de este mismo catálogo. Puede haber señales `fail` aun con un diagnóstico `APPROVED`, y señales que acompañan a cualquier resultado (ver códigos 500-506).

Estos códigos son estables. Se recomienda tratarlos como catálogo cerrado y consultar esta tabla para presentar mensajes al usuario final.

| code | reason                                              | category          |
| ---- | --------------------------------------------------- | ----------------- |
| 100  | Document front image missing                        | input             |
| 101  | Document back image missing                         | input             |
| 102  | Document front not detected                         | integrity         |
| 103  | Document back not detected                          | integrity         |
| 104  | Error loading front image                           | input             |
| 105  | Error loading back image                            | input             |
| 106  | Unsupported dimensions for front image              | integrity         |
| 107  | Unsupported dimensions for back image               | integrity         |
| 108  | Unsupported aspect ratio for front image            | integrity         |
| 109  | Unsupported aspect ratio for back image             | integrity         |
| 110  | Unsupported depth for front image                   | integrity         |
| 111  | Unsupported depth for back image                    | integrity         |
| 112  | Multiple documents detected on front image          | attack\_detection |
| 113  | Multiple documents detected on back image           | attack\_detection |
| 120  | Document annulled or damaged                        | integrity         |
| 130  | Document MRZ invalid hashes                         | logical           |
| 131  | Document expired                                    | logical           |
| 132  | Document MRZ not detected                           | logical           |
| 133  | Document MRZ dates inconsistent                     | logical           |
| 134  | Document MRZ invalid format                         | logical           |
| 150  | Document photo missing                              | biometric         |
| 160  | Presentation attack detected                        | attack\_detection |
| 161  | Manipulation attack detected                        | attack\_detection |
| 170  | Selfie face not detected                            | integrity         |
| 171  | Identity mismatch between portrait and selfie image | biometric         |
| 200  | Face matched in global block list                   | block\_list       |
| 201  | Face matched in platform block list                 | block\_list       |
| 300  | Fast-Auto-Screening document version not supported  | unsupported       |
| 310  | Fast-Auto-Screening country not supported           | unsupported       |
| 320  | Fast-Auto-Screening low confidence score            | low\_confidence   |
| 330  | Timeout whilst waiting for the OCR service          | processing        |
| 331  | Error calling OCR pipeline                          | processing        |
| 332  | Mismatch between VIZ and the MRZ fields             | logical           |
| 340  | VIZ birthdate mismatch with MRZ                     | logical           |
| 341  | VIZ country mismatch with MRZ                       | logical           |
| 342  | VIZ document type mismatch with MRZ                 | logical           |
| 343  | VIZ document number mismatch with MRZ               | logical           |
| 344  | VIZ expiry date mismatch with MRZ                   | logical           |
| 345  | VIZ given names mismatch with MRZ                   | logical           |
| 346  | VIZ nationality mismatch with MRZ                   | logical           |
| 347  | VIZ second optional data mismatch with MRZ          | logical           |
| 348  | VIZ optional data mismatch with MRZ                 | logical           |
| 349  | VIZ sex mismatch with MRZ                           | logical           |
| 350  | VIZ surname mismatch with MRZ                       | logical           |
| 500  | Poor front image quality                            | integrity         |
| 501  | Poor back image quality                             | integrity         |
| 502  | Identity mismatch between portrait and ghost image  | biometric         |
| 503  | Mismatch estimated age selfie vs portrait           | logical           |
| 504  | Mismatch estimated sex selfie vs portrait           | logical           |
| 505  | Mismatch estimated age portrait vs mrz              | logical           |
| 506  | Mismatch estimated sex portrait vs mrz              | logical           |
| 600  | Escalated validation declined                       | escalated\_review |
| 601  | Escalated validation flagged for manual review      | escalated\_review |
| 602  | Escalated validation timed out                      | escalated\_review |
| 603  | Escalated validation not completed                  | escalated\_review |
| 999  | Validation declined                                 | unknown           |

{% hint style="info" %}
**Códigos 100-171 y 300-350** acompañan a un rechazo o a un resultado no concluyente: entradas ausentes o ilegibles (`input`), problemas de integridad/calidad del documento (`integrity`), inconsistencias lógicas de MRZ y de contraste VIZ↔MRZ (`logical`), ataques de presentación o manipulación (`attack_detection`), resultados del *fast auto-screening* de versión/país y confianza (`unsupported` / `low_confidence`) y errores del propio pipeline de OCR (`processing`). **Códigos 200/201** indican una coincidencia en la blocklist de rostros, global o de la propia plataforma. **Códigos 500-506** son señales de verificación informativas (calidad de imagen y coincidencias biométricas de edad/sexo entre selfie, retrato y MRZ): aparecen como filas de `diagnostics[]` (`result = pass` o `fail`) y pueden acompañar a **cualquier** estado, incluido `APPROVED`; no se usan como `rejectionReason` por sí solas. **Códigos 600-603** corresponden a un rechazo, revisión, expiración o abandono durante una verificación adicional escalada cuando el análisis inicial no es concluyente.
{% endhint %}

### Rechazo por calidad vs detección de fraude

No todos los `DECLINED` significan lo mismo. La `category` de cada código permite distinguir tres situaciones y comunicar al usuario final el mensaje adecuado:

* **Problema de captura o calidad** (categorías `input` e `integrity`): la imagen no es utilizable o el documento no se detecta correctamente. **No es una acusación de fraude.** Incluye entradas ausentes/ilegibles (100, 101, 104, 105) y problemas de integridad/calidad (102, 103, 106-111, 120, 170, 500, 501). Acción típica: solicitar una nueva captura con mejor calidad.
* **Señal de fraude o ataque** (categorías `attack_detection` y `block_list`): rechazo genuino por indicios de fraude. Incluye múltiples documentos o ataques de presentación/manipulación (112, 113, 160, 161) y coincidencias en la blocklist de rostros (200, 201).
* **Inconsistencia de datos o biometría** (categorías `logical` y `biometric`): los datos no son coherentes entre sí, sin ser un problema puro de calidad ni un ataque explícito. Incluye inconsistencias de MRZ y de contraste VIZ↔MRZ (130-134, 332, 340-350) y comparaciones biométricas (171, 502-506).

### Datos OCR

| Campo (`ocr.mrz`)        | Descripción                                       |
| ------------------------ | ------------------------------------------------- |
| `documentType`           | Tipo de documento (p. ej. `ID`, `PASSPORT`).      |
| `issuingState`           | País emisor (código ISO).                         |
| `documentNumber`         | Número de documento.                              |
| `nationality`            | Nacionalidad del titular.                         |
| `dateOfBirth`            | Fecha de nacimiento.                              |
| `expiryDate`             | Fecha de caducidad del documento.                 |
| `sex`                    | Sexo registrado en el documento.                  |
| `surname` / `givenNames` | Apellidos y nombres.                              |
| `mrzValid`               | `true` si la MRZ es válida (checksums correctos). |

| Campo (`ocr.viz`)        | Descripción                                                           |
| ------------------------ | --------------------------------------------------------------------- |
| `documentClassification` | Identificador(es) de clasificación del modelo de documento detectado. |
| `vizType`                | Tipo de zona visual reconocida en el documento.                       |
