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

# Advertencias y códigos de error de detección de liveness

> Advertencias del módulo de liveness de Didit: ataques faciales, baja puntuación, calidad, lista de bloqueo y caras duplicadas, con causa y solución.

## Descripción general

Las advertencias del informe de prueba de vida señalan cada condición que Didit detectó al ejecutar la comprobación de prueba de vida. Aparecen en el array `warnings[]` de cada elemento de `liveness_checks[]` (consulta [Informe de prueba de vida](https://docs.didit.me/es/core-technology/liveness/report-liveness.md)), con `feature` establecido en `"LIVENESS"`. Cada entrada sigue la estructura común del [objeto de advertencia](https://docs.didit.me/es/reference/data-models.md#objeto-de-advertencia): `feature`, `risk`, `additional_data`, `log_type`, `short_description`, `long_description`, `node_id`.

Cada advertencia tiene tres capas:

1. **El código `risk`**: un identificador estable que puedes usar para comparar en tu código (los códigos que se indican más abajo).
2. **El `log_type`**: uno de `information`, `warning` o `error`. Los riesgos de rechazo automático siempre llevan `error`. En los riesgos configurables se deriva de la acción configurada: **Sin acción** → `information`, **Revisión** → `warning`, **Rechazar** → `error`. En los riesgos basados en umbrales (`LOW_LIVENESS_SCORE`, `LOW_FACE_QUALITY`) es `error` cuando el valor cruza el umbral de rechazo y `warning` cuando solo cruza el umbral de revisión.
3. **El impacto en la decisión**: el mismo enrutamiento determina el `status` del informe de prueba de vida: una acción Revisión lo pasa a `In Review`, una acción Rechazar (o cualquier riesgo de rechazo automático) a `Declined`, y Sin acción lo deja sin cambios.

Algunos riesgos solo se emiten cuando el método de prueba de vida es `PASSIVE` (comprobaciones de múltiples rostros, calidad y luminancia). Las tablas siguientes recogen el conjunto completo de códigos de riesgo de prueba de vida y su gravedad: no existe ningún otro código de riesgo de prueba de vida.

## Condiciones de rechazo automático

Los siguientes riesgos siempre hacen que el informe de prueba de vida (y la sesión) pase a `Declined`, con `log_type: "error"`:

| Riesgo | Disparador |
| - | - |
| `NO_FACE_DETECTED` | No se localizó ninguna cara durante la captura de prueba de vida, o el usuario agotó los intentos de reintento. |
| `LIVENESS_FACE_ATTACK` | El modelo detectó un ataque de presentación (máscara, reproducción en pantalla, suplantación de tipo deepfake). |
| `FACE_IN_BLOCKLIST` | La cara coincidió con una entrada de la lista de bloqueo de caras de tu aplicación. |
| `AGE_BELOW_MINIMUM` | Edad estimada inferior al mínimo configurado. Solo se emite en flujos adaptativos de verificación de edad y en nodos `AGE_ESTIMATION`. |
| `AGE_NOT_DETECTED` | No se pudo estimar la edad. Solo se emite en flujos de estimación de edad con la alternativa de verificación de identidad desactivada. |

Cuando se dispara `NO_FACE_DETECTED`, se suprime `LOW_LIVENESS_SCORE` (no hay ninguna cara que puntuar).

## Configuración de verificación personalizable

En la consola de Didit, los riesgos de prueba de vida se agrupan en las siguientes opciones de configuración del flujo:

| Grupo | Riesgos | Configuración |
| - | - | - |
| **Liveness score thresholds** | `LOW_LIVENESS_SCORE` | Umbral de revisión + umbral de rechazo sobre `score`. Igual o por debajo del de revisión → `In Review`; igual o por debajo del de rechazo → `Declined`. |
| **Duplicate face action** | `DUPLICATED_FACE`, `POSSIBLE_DUPLICATED_FACE` | Una única opción compartida: Sin acción (predeterminado) / Revisión / Rechazar. Se omite por completo cuando la cara coincidente está en tu lista de caras permitidas. |
| **Duplicate face identity mismatch** | `DUPLICATED_FACE_NAME_MISMATCH` | Opción propia (`face_liveness_duplicated_face_name_mismatch_action`): Sin acción / Revisión (predeterminado) / Rechazar. Solo se evalúa cuando también se dispara `DUPLICATED_FACE`; consulta más abajo. |
| **Liveness attack face match** | `FACE_MATCHES_LIVENESS_ATTACK` | Opción propia (`face_liveness_attack_face_match_action`): Sin acción (predeterminado) / Revisión. Si aquí se establece Rechazar, se acepta pero se aplica como Revisión. También está disponible en el nodo de Estimación de edad. |
| **Possible blocklisted face** | `POSSIBLE_FACE_IN_BLOCKLIST` | No es configurable en los flujos: siempre se envía a Revisión (`log_type: "warning"`). |
| **Multiple faces action** *(solo pasiva)* | `MULTIPLE_FACES_DETECTED` | Sin acción (predeterminado) / Revisión / Rechazar. |
| **Face quality thresholds** *(solo pasiva)* | `LOW_FACE_QUALITY` | Umbral de revisión (15 por defecto) + umbral de rechazo (0 por defecto, es decir, rechazo desactivado). |
| **Face luminance** *(solo pasiva)* | `LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE` | Umbrales mínimo / máximo (20 / 80 por defecto en la escala normalizada de 0 a 100) + una acción por dirección (Revisión por defecto). |
| **Age thresholds** *(flujos adaptativos / nodo `AGE_ESTIMATION`)* | `AGE_BELOW_MINIMUM`, `AGE_NOT_DETECTED` | Umbrales de edad mínima y de edad límite; ambos riesgos rechazan automáticamente el paso de prueba de vida. Con la alternativa de verificación de identidad activada, el flujo dirige al usuario a una comprobación de documento en lugar de finalizar la sesión. |

## Advertencias generadas

### Prueba de vida principal

| Riesgo | Causa | Severidad | ¿Afecta al estado? | Solución |
| - | - | - | - | - |
| `NO_FACE_DETECTED` | No se localizó ningún rostro durante la captura, o el usuario agotó los intentos disponibles (`MAX_ATTEMPTS_REACHED`). | `error` | **Rechazo automático** | Vuelve a capturar con mejor iluminación y asegúrate de que el rostro esté centrado. |
| `LIVENESS_FACE_ATTACK` | El modelo detectó un ataque de presentación. | `error` | **Rechazo automático** | Trátalo como fraude. La sesión se rechaza automáticamente. |
| `LOW_LIVENESS_SCORE` | `score` igual o inferior al umbral de revisión del flujo de verificación (workflow). Se omite cuando también está presente `NO_FACE_DETECTED`. | `warning`; pasa a `error` cuando la puntuación es igual o inferior al umbral de rechazo | Configurable (umbrales de revisión y rechazo) | Vuelve a capturar; ajusta los umbrales si observas falsos positivos. |

### Integridad del canal de captura

Señales de ataque de inyección que el cliente informa en el momento de la captura. A diferencia de los ataques de presentación (un artefacto que se sostiene delante de una cámara real), estas señales indican que la propia señal de la cámara se ha sustituido o interceptado.

Cada una se configura por flujo y su valor predeterminado es **ninguna acción**, de modo que activar la función no cambia ninguna decisión hasta que decidas aplicarla.

| Riesgo | Causa | Clave de configuración | Valor predeterminado |
| - | - | - | - |
| `VIRTUAL_CAMERA_DETECTED` | El dispositivo de captura se identificó como una cámara virtual por software (OBS, ManyCam, Snap Camera, DroidCam y similares) en lugar de una cámara física. | `virtual_camera_action` | `NO_ACTION` |
| `EXTERNAL_CAPTURE_DEVICE_DETECTED` | El dispositivo de captura era una cámara externa o una capturadora en lugar de una cámara integrada. | `external_capture_device_action` | `NO_ACTION` |
| `FRAME_INJECTION_SUSPECTED` | Los fotogramas capturados muestran indicios de composición por software o de inyección en la cadena de la cámara en lugar de una captura real en vivo, **o** la captura se realizó en hardware emulado o virtualizado (un emulador de Android o una máquina virtual de escritorio), donde no existe un sensor de cámara físico y el host proporciona cada fotograma. | `frame_injection_action` | `NO_ACTION` |
| `INJECTION_ATTACK_DETECTED` | La captura se inyectó en lugar de hacerse con la propia cámara del dispositivo: una cámara virtual por software, una señal de cámara generada por la página o por automatización del navegador, una cámara interceptada o una herramienta de instrumentación conectada a la aplicación. `additional_data.reasons` enumera solo los motivos que lo demuestran. Las señales que puede producir una persona real nunca la activan. En la prueba de vida y la coincidencia facial sigue a `frame_injection_action`, por lo que las decisiones sobre la selfie no cambian. | `frame_injection_action` | `NO_ACTION` |
| `SCREEN_CAPTURE_DURING_CAPTURE` | La grabación o el uso compartido de pantalla estaba activo en el dispositivo durante la captura biométrica. | `screen_capture_action` | `NO_ACTION` |

> [!NOTE]
>
> Los navegadores no ofrecen a ningún proveedor una atestación a nivel de sistema operativo del origen de la cámara, así que en la web estas señales son pruebas que corroboran, no pruebas concluyentes. En la web, un veredicto `null` significa **no determinado** (las etiquetas de los dispositivos no están disponibles hasta que se concede el permiso de cámara) y nunca activa un riesgo.

Una cámara virtual se identifica por el nombre del dispositivo, por lo que una cámara que el sistema operativo presenta con un nombre corriente no se reconoce de esa forma. Dentro de un emulador de Android, la cámara reasignada se etiqueta como cualquier cámara integrada; por eso el caso del hardware emulado se informa mediante `FRAME_INJECTION_SUSPECTED`: se detecta a partir del entorno del dispositivo (la pila de renderizado y el modelo de dispositivo indicado en el user agent) y no del nombre de la cámara. Los hallazgos generados a partir del entorno del dispositivo incluyen `additional_data.reason: "emulated_capture_device"`, lo que los distingue del análisis de fotogramas propio del modelo de prueba de vida.

> [!NOTE]
>
> Detectar la máquina desde un navegador es una prueba indicativa, no una atestación, y un atacante decidido puede interferir en ella. Los SDK móviles nativos informan de señales de integridad más sólidas, a nivel de sistema operativo, que un navegador no puede ver (emulador, dispositivo con root o jailbreak, interceptación en tiempo de ejecución, depurador conectado), cada una con su propia acción configurable en [Integridad del dispositivo y del entorno de ejecución](https://docs.didit.me/es/core-technology/ip-analysis/warnings-ip-analysis.md#integridad-del-dispositivo-y-del-entorno-de-ejecución). Estas señales encarecen considerablemente el ataque, pero por sí solas no demuestran que una captura proceda de un dispositivo genuino. Las señales de integridad del dispositivo son independientes del método de prueba de vida, por lo que se combinan con cualquiera de Passive, 3D Flash o 3D Action & Flash.

### Análisis forense de coherencia de la grabación

`LIVENESS_VIDEO_ANOMALY` se calcula **en el servidor a partir de la grabación de prueba de vida almacenada**, de forma independiente del modelo de prueba de vida. Detecta una secuencia en movimiento repetida en varios ciclos, compatible con una señal en bucle.

| Riesgo | Causa | Clave de configuración | Valor predeterminado |
| - | - | - | - |
| `LIVENESS_VIDEO_ANOMALY` | La grabación contiene una secuencia en movimiento repetida. Los bloqueos de la cámara, los fotogramas fijos repetidos, los inicios oscuros y la entrega lenta de fotogramas no activan esta señal por sí solos. | `face_liveness_video_anomaly_action` | `NO_ACTION` |

Configura la acción en tu nodo de prueba de vida o de estimación de edad: `NO_ACTION` registra un hallazgo informativo, `REVIEW` puede elevar una verificación ya decidida a En revisión y `DECLINE` puede elevarla a Rechazado. La comprobación se ejecuta de forma asíncrona, por lo que una escalada puede llegar después del resultado inicial. Una decisión existente más grave no se rebaja y las decisiones de revisión manual se conservan.

Los hallazgos de la versión 2 incluyen `forensics_version: 2`, la evidencia `repeated_sequence` y `repeated_moving_sequence` en `anomaly_reasons`. Las mediciones de entrega como `unique_frame_ratio`, `static_pair_ratio`, `decoded_fps_ratio` y `max_frame_gap_seconds` siguen siendo diagnósticos; por sí solas no pueden demostrar una reproducción. Los hallazgos anteriores describen la versión del detector utilizada en ese momento y no se reclasifican de forma retroactiva.

> [!NOTE]
>
> Se trata de una señal adicional conservadora, no de una detección completa de contenido sintético ni de vídeo inyectado. Una grabación sin anomalías no demuestra que haya prueba de vida. Las capturas cortas o ambiguas y las capturas sin evidencia de reproducción utilizable no se marcan en esta comprobación. Las grabaciones ausentes o ilegibles no generan ningún hallazgo en esta comprobación; las demás comprobaciones de la verificación siguen aplicándose.

### Coincidencia facial entre sesiones

| Riesgo | Causa | Datos adicionales | Gravedad |
| - | - | - | - |
| `FACE_IN_BLOCKLIST` | El rostro coincidió con un rostro de la lista de bloqueo. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `error` — **rechazo automático** |
| `POSSIBLE_FACE_IN_BLOCKLIST` | El rostro coincidió con un rostro de la lista de bloqueo en una franja de menor confianza. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `warning` — siempre se envía a Revisión en los flujos |
| `FACE_IN_ALLOWLIST` | El rostro coincidió con un rostro de la lista de permitidos. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — se omite la acción de rostro duplicado |
| `POSSIBLE_FACE_IN_ALLOWLIST` | El rostro coincidió con un rostro de la lista de permitidos en una franja de menor confianza. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — se omite la acción de posible rostro duplicado |
| `DUPLICATED_FACE` | El rostro coincidió con un rostro ya aprobado de otro usuario (una sesión `Approved` con un `vendor_data` distinto, o un rostro importado para uno de tus usuarios vendor). | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurable — `information` por defecto |
| `POSSIBLE_DUPLICATED_FACE` | El rostro coincidió con otro rostro aprobado o importado en una franja de menor confianza. | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurable — `information` por defecto |
| `DUPLICATED_FACE_NAME_MISMATCH` | Se emite junto con `DUPLICATED_FACE` cuando la identidad de la sesión coincidente no se corresponde con el nombre resuelto de esta sesión (documento de identidad, `expected_details` o usuario vendor vinculado), con la misma puntuación de coincidencia de nombres y el mismo umbral que la verificación de identidad. Un rostro reutilizado con un nombre distinto es una señal de fraude más fuerte que un simple duplicado, por eso tiene su propia acción configurable. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `name_match_score` | Configurable — `warning` por defecto. Nunca suaviza el resultado configurado del propio `DUPLICATED_FACE`, solo lo agrava. |
| `DUPLICATED_FACE_DOCUMENT_MISMATCH` | Se emite junto con `DUPLICATED_FACE` cuando el documento de identidad del usuario coincidente muestra una fecha de nacimiento distinta a la del documento de esta sesión. No se marca a la misma persona que presenta un documento distinto (por ejemplo, un pasaporte después de un documento de identidad) o un documento renovado, y nunca se marcan dos sesiones que comparten el mismo número de documento del mismo país. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `mismatch_dimensions` | Configurable (`face_liveness_duplicated_face_document_mismatch_action`) - `Review` por defecto. Nunca suaviza el resultado configurado del propio `DUPLICATED_FACE`, solo lo agrava. |
| `FACE_MATCHES_LIVENESS_ATTACK` | El rostro coincide con un rostro de una sesión anterior de esta aplicación, de otro usuario, cuya propia captura de prueba de vida se consideró un ataque con alta confianza. Es evidencia para la revisión, no prueba de un ataque. | `liveness_attack_session_id`, `liveness_attack_session_number`, `similarity_percentage`, `liveness_attack_sessions_count` | Configurable - `information` por defecto (sin acción) |

En las coincidencias con rostros importados o rostros de entradas de lista (que no tienen sesión), los valores `*_session_id`, `*_session_number` y `api_service` de `additional_data` son `null`.

Los rostros que pertenecen al mismo usuario (mismo `vendor_data`, o el mismo usuario vendor cuando está disponible) se excluyen de **toda** la búsqueda en el índice, tanto de la detección de duplicados como del análisis de la lista de bloqueo. El orden de prioridad de las coincidencias es: lista de bloqueo exacta → lista de permitidos exacta → duplicado exacto → lista de bloqueo posible → lista de permitidos posible → duplicado posible; solo aparece uno de estos seis códigos mutuamente excluyentes por informe. `DUPLICATED_FACE_NAME_MISMATCH` no forma parte de ese grupo de prioridad: es un código adicional que se emite **además de** `DUPLICATED_FACE` cuando también falla la comprobación de identidad, nunca en su lugar. `additional_data.name_match_score` nunca incluye los nombres comparados, solo identificadores y una puntuación, de modo que ningún dato personal (PII) llega al payload de la advertencia.

Un nombre escrito en un sistema de escritura distinto en cada documento (por ejemplo, en hebreo en uno y en caracteres latinos en el otro) puede puntuar por debajo del umbral aunque ambas sesiones pertenezcan a la misma persona. Solo en ese caso, `DUPLICATED_FACE_NAME_MISMATCH` no se emite cuando los documentos de identidad de las dos sesiones se corroboran entre sí en todos estos puntos:

* Ambos documentos tienen el mismo país emisor.
* Un identificador coincide exactamente entre los dos documentos. `document_number` y `personal_number` se consideran intercambiables, porque el mismo número nacional puede figurar en cualquiera de los dos campos según el tipo de documento.
* Cuando ambos documentos incluyen una fecha de nacimiento, es la misma fecha.

Si los nombres están en el mismo sistema de escritura, si el identificador o el país emisor difieren o faltan, o si las fechas de nacimiento se contradicen, la advertencia se sigue emitiendo como se describe arriba.

### Calidad de la prueba de vida pasiva (solo cuando `method = "PASSIVE"`)

| Riesgo | Causa | Gravedad | Solución |
| - | - | - | - |
| `MULTIPLE_FACES_DETECTED` | Se vio más de un rostro durante la captura. Siempre se usa el rostro más grande para la puntuación y la coincidencia. | Configurable — `information` por defecto | Repetir la captura sin nadie más. |
| `LOW_FACE_QUALITY` | Calidad del rostro por debajo del umbral de revisión (15 por defecto). | `warning`; `error` cuando está por debajo del umbral de rechazo (0 por defecto, rechazo desactivado) | Mejor enfoque, menos oclusión, rostro centrado. |
| `LOW_FACE_LUMINANCE` | Luminancia normalizada por debajo del umbral mínimo (20 por defecto). | Configurable — `warning` por defecto (la acción es Revisión por defecto) | Mejor iluminación. |
| `HIGH_FACE_LUMINANCE` | Luminancia normalizada por encima del umbral máximo (80 por defecto). | Configurable — `warning` por defecto (la acción es Revisión por defecto) | Reducir la iluminación; evitar el contraluz. |

`LOW_FACE_LUMINANCE` y `HIGH_FACE_LUMINANCE` son mutuamente excluyentes: la luminancia está por debajo del mínimo o por encima del máximo, nunca ambas cosas.

### Estimación de edad (flujos adaptativos y nodos `AGE_ESTIMATION`)

| Riesgo | Causa | Gravedad | Solución |
| - | - | - | - |
| `AGE_BELOW_MINIMUM` | La edad estimada está por debajo del mínimo configurado (o del umbral límite cuando la alternativa de verificación de identidad está activada). | `error` | El flujo recurre a la verificación de identidad cuando está configurado. |
| `AGE_NOT_DETECTED` | No se pudo estimar la edad y la alternativa de verificación de identidad está desactivada. | `error` | Activa la alternativa o repite la captura. |

## Cadenas de descripción exactas

La API devuelve exactamente estas cadenas `short_description` y `long_description` para cada riesgo:

| `risk` | `short_description` | `long_description` |
| - | - | - |
| `NO_FACE_DETECTED` | No se detectó ningún rostro en la prueba de vida | El sistema no pudo identificar un rostro durante la prueba de vida, lo que puede deberse a una calidad de imagen deficiente, una posición incorrecta o problemas técnicos. |
| `LIVENESS_FACE_ATTACK` | Ataque facial en la prueba de vida | El sistema detectó un posible intento de eludir la prueba de vida. |
| `LOW_LIVENESS_SCORE` | Puntuación de prueba de vida baja | La prueba de vida obtuvo una puntuación baja, lo que indica un posible uso de representaciones faciales no reales o datos biométricos de baja calidad. |
| `LIVENESS_VIDEO_ANOMALY` | Anomalía en la transmisión de vídeo de la prueba de vida | El vídeo grabado de la prueba de vida contiene una secuencia en movimiento repetida, compatible con una transmisión en bucle. Los bloqueos de la cámara, los fotogramas fijos repetidos y la entrega lenta de fotogramas no generan esta señal por sí solos. Es una comprobación independiente de la grabación, no una evaluación completa de si la captura se realizó en vivo. |
| `FACE_IN_BLOCKLIST` | Rostro en la lista de bloqueo | El sistema identificó un rostro en la lista de bloqueo, lo que significa que no se permite verificar ese rostro. |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Posible rostro en la lista de bloqueo | El sistema identificó un posible rostro en la lista de bloqueo, lo que significa que no se permite verificar ese rostro. |
| `FACE_IN_ALLOWLIST` | Rostro en la lista de permitidos | El rostro coincidió con la lista de rostros permitidos de la aplicación, por lo que se omitieron las acciones por rostro duplicado para esta señal. |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Posible rostro en la lista de permitidos | El rostro posiblemente coincidió con la lista de rostros permitidos de la aplicación, por lo que se omitieron las acciones por posible rostro duplicado para esta señal. |
| `DUPLICATED_FACE` | Rostro duplicado de otra sesión aprobada | El sistema identificó un rostro duplicado de otra sesión aprobada, lo que requiere una investigación adicional. |
| `POSSIBLE_DUPLICATED_FACE` | Posible rostro duplicado de otra sesión aprobada | El sistema identificó un posible rostro duplicado de otra sesión aprobada, lo que requiere una investigación adicional. |
| `DUPLICATED_FACE_NAME_MISMATCH` | Rostro duplicado con un nombre distinto | El mismo rostro ya se aprobó en otra sesión, pero con un nombre distinto. La identidad asociada al duplicado no coincide con la identidad declarada en esta sesión, lo que es un fuerte indicio de fraude de identidad. |
| `FACE_MATCHES_LIVENESS_ATTACK` | El rostro coincide con un ataque a la prueba de vida | El rostro de esta captura de prueba de vida coincide con un rostro de una sesión anterior de esta aplicación, perteneciente a otro usuario, cuya captura el motor de prueba de vida consideró un ataque con alta confianza. Un usuario legítimo puede ser rechazado por error, por lo que se trata de una señal para revisión, no de una prueba de ataque. |
| `MULTIPLE_FACES_DETECTED` | Se detectaron varios rostros | Se detectaron varios rostros en la imagen de la prueba de vida. El sistema usa el rostro más grande para la prueba de vida y la comparación facial, pero la presencia de varios rostros puede requerir una revisión adicional. |
| `LOW_FACE_QUALITY` | Calidad facial baja | La calidad de la imagen facial está por debajo del umbral aceptable, lo que puede afectar la fiabilidad de la prueba de vida. Puede deberse a la resolución de la cámara, el enfoque o los artefactos de compresión. |
| `LOW_FACE_LUMINANCE` | Luminancia facial baja | La imagen facial es demasiado oscura, lo que puede afectar la precisión de la prueba de vida. Se recomienda mejorar las condiciones de iluminación. |
| `HIGH_FACE_LUMINANCE` | Luminancia facial alta | La imagen facial es demasiado brillante o está sobreexpuesta, lo que puede afectar la precisión de la prueba de vida. Se recomienda reducir la iluminación o evitar la luz directa. |
| `AGE_BELOW_MINIMUM` | Edad por debajo del mínimo | La edad del rostro está por debajo del umbral de edad mínima de la aplicación. |
| `AGE_NOT_DETECTED` | Edad no detectada | El sistema no pudo identificar la edad del rostro, que es necesaria para la verificación del documento. |

## API independiente de prueba de vida pasiva

La [API de prueba de vida](https://docs.didit.me/es/standalone-apis/passive-liveness.md) independiente reutiliza los mismos códigos de riesgo, con algunas diferencias de comportamiento:

* `NO_FACE_DETECTED` y `LOW_LIVENESS_SCORE` son mutuamente excluyentes: la comprobación de la puntuación solo se ejecuta cuando se encontró un rostro. `LOW_LIVENESS_SCORE` se activa según el `face_liveness_score_decline_threshold` de la solicitud (30 por defecto) y siempre lleva `log_type: "error"`.
* `POSSIBLE_FACE_IN_BLOCKLIST` se trata como un rechazo (`log_type: "error"`) en lugar de una revisión.
* `MULTIPLE_FACES_DETECTED` lleva `log_type: "warning"`, mientras que los riesgos de rostro duplicado siguen siendo informativos. Solo las advertencias de nivel `error` cambian el `status` de la respuesta independiente a `Declined`.
* Las entradas de advertencia de la API independiente incluyen `feature`, pero no `node_id`.

## Ejemplos

### Rechazo automático ante un ataque detectado

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LIVENESS_FACE_ATTACK",
    "additional_data": null,
    "log_type": "error",
    "short_description": "Liveness Face Attack",
    "long_description": "The system detected a potential attempt to bypass the liveness check.",
    "node_id": "liveness_primary"
  }
]
```

### Advertencias configurables en una captura pasiva

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LOW_FACE_QUALITY",
    "additional_data": null,
    "log_type": "warning",
    "short_description": "Low face quality",
    "long_description": "The facial image quality is below the acceptable threshold, which may affect the reliability of liveness detection. This could be due to camera resolution, focus, or compression artifacts.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "LOW_FACE_LUMINANCE",
    "additional_data": null,
    "log_type": "warning",
    "short_description": "Low face luminance",
    "long_description": "The facial image is too dark, which may affect the accuracy of liveness detection. Better lighting conditions are recommended.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "MULTIPLE_FACES_DETECTED",
    "additional_data": null,
    "log_type": "information",
    "short_description": "Multiple faces detected",
    "long_description": "Multiple faces were detected in the liveness image. The system uses the largest face for liveness verification and face comparison, but the presence of multiple faces may require additional review.",
    "node_id": "liveness_primary"
  }
]
```

### Rostro duplicado con payload

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null
    },
    "log_type": "warning",
    "short_description": "Duplicated face from other approved session",
    "long_description": "The system identified a duplicated face from another approved session, requiring further investigation.",
    "node_id": "liveness_primary"
  }
]
```

Aquí la acción de rostro duplicado está configurada en Revisión, por lo que la advertencia lleva `log_type: "warning"` y el estado del informe de prueba de vida es `In Review`. Con el valor predeterminado (Sin acción), llevaría `log_type: "information"`. `api_service` es `null` porque el rostro coincidente procede de una sesión de un flujo, no de una llamada independiente a la API.

### Rostro duplicado con otro nombre

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null
    },
    "log_type": "information",
    "short_description": "Duplicated face from other approved session",
    "long_description": "The system identified a duplicated face from another approved session, requiring further investigation.",
    "node_id": "liveness_primary"
  },
  {
    "feature": "LIVENESS",
    "risk": "DUPLICATED_FACE_NAME_MISMATCH",
    "additional_data": {
      "duplicated_session_id": "8d2f1c4e-6b7a-4c8d-9e0f-1a2b3c4d5e6f",
      "duplicated_session_number": 123,
      "api_service": null,
      "name_match_score": 42.5
    },
    "log_type": "warning",
    "short_description": "Duplicated face under a different name",
    "long_description": "The same face was already approved on another session, but under a different name. The identity behind the duplicate does not match the identity declared on this session, which is a strong indicator of identity fraud.",
    "node_id": "liveness_primary"
  }
]
```

`DUPLICATED_FACE` mantiene su propia acción configurada (aquí, Sin acción: `log_type: "information"`), mientras que `DUPLICATED_FACE_NAME_MISMATCH` lleva su propia acción, que de forma predeterminada es Revisión (`log_type: "warning"`). El estado del informe de prueba de vida sigue la más grave de las dos: `In Review` en este caso, aunque la configuración de rostro duplicado por sí sola no lo habría marcado.

### Anomalía de coherencia de la grabación con sus mediciones

```json theme={null}
"warnings": [
  {
    "feature": "LIVENESS",
    "risk": "LIVENESS_VIDEO_ANOMALY",
    "additional_data": {
      "forensics_version": 2,
      "duration_seconds": 6.0,
      "repeated_sequence": {
        "period_frames": 6,
        "cycles": 3,
        "matched_pairs": 12
      },
      "anomaly_reasons": ["repeated_moving_sequence"]
    },
    "log_type": "information",
    "short_description": "Liveness video stream anomaly",
    "long_description": "The recorded liveness video contains a repeated moving sequence consistent with a looped feed. Camera stalls, repeated still frames and slow frame delivery alone do not raise this signal. This is an independent recording check, not a complete assessment of whether the capture is live.",
    "node_id": "liveness_primary"
  }
]
```

Este ejemplo muestra la evidencia de reproducción de una grabación que contiene tres copias de una secuencia en movimiento. `log_type` es `information` porque la acción configurada es `NO_ACTION`. Los diagnósticos de entrega de fotogramas, omitidos en este ejemplo por brevedad, no activan el hallazgo.

## Tipos de advertencia

A cada riesgo se le asigna una gravedad según la configuración de tu aplicación. Las tres gravedades son:

## Relacionado

* [Informe de prueba de vida](https://docs.didit.me/es/core-technology/liveness/report-liveness.md): esquema completo del informe y sus estados.
* [Advertencias de coincidencia facial](https://docs.didit.me/es/core-technology/face-match/warnings-face-match.md): advertencias complementarias de coincidencia facial 1:1.
* [Webhooks](https://docs.didit.me/es/integration/webhooks.md): `session.status.updated` incluye las advertencias en cuanto termina el paso de prueba de vida.
* [Modelos de datos: comprobación de prueba de vida](https://docs.didit.me/es/reference/data-models.md#prueba-de-vida): esquema canónico con todos los campos.
* [Modelos de datos: objeto de advertencia](https://docs.didit.me/es/reference/data-models.md#objeto-de-advertencia): la estructura de cada entrada de `warnings[]`.


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