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

# Détection du vivant : avertissements et codes d'erreur

> Tous les avertissements de détection du vivant de Didit : attaques, qualité, listes de blocage et doublons, avec leurs causes et résolutions.

## Vue d'ensemble

Les avertissements sur le rapport de détection du vivant signalent chaque condition observée par Didit lors de l'exécution du contrôle de détection du vivant. Ils se trouvent dans le tableau `warnings[]` de chaque élément de `liveness_checks[]` (voir [Rapport de détection du vivant](https://docs.didit.me/fr/core-technology/liveness/report-liveness.md)), avec le champ `feature` défini sur `"LIVENESS"`. Chaque entrée suit la structure commune de l'[objet d'avertissement](https://docs.didit.me/fr/reference/data-models.md#objet-d’avertissement) : `feature`, `risk`, `additional_data`, `log_type`, `short_description`, `long_description`, `node_id`.

Chaque avertissement comprend trois couches :

1. **Le code `risk`** — un identifiant stable que vous pouvez exploiter dans votre code (les codes répertoriés ci-dessous).
2. **Le `log_type`** — l'une des valeurs `information`, `warning` ou `error`. Les risques entraînant un refus automatique portent toujours la valeur `error`. Pour les risques configurables, il découle de l'action configurée : **Aucune action** → `information`, **Examen** → `warning`, **Refuser** → `error`. Pour les risques basés sur des seuils (`LOW_LIVENESS_SCORE`, `LOW_FACE_QUALITY`), la valeur est `error` lorsque la valeur franchit le seuil de refus et `warning` lorsqu'elle ne franchit que le seuil d'examen.
3. **L'impact sur la décision** — le même routage détermine le champ `status` du rapport de détection du vivant : une action Examen le fait passer à `In Review`, une action Refuser (ou tout risque de refus automatique) à `Declined`, et Aucune action le laisse inchangé.

Certains risques ne sont émis que lorsque la méthode de détection du vivant est `PASSIVE` (contrôles de visages multiples, de qualité et de luminance). Les tableaux ci-dessous répertorient l'ensemble complet des codes de risque de détection du vivant et leur gravité — aucun autre code de risque de détection du vivant n'existe.

## Conditions de refus automatique

Les risques suivants font systématiquement passer le rapport de détection du vivant (et la session) à `Declined`, avec `log_type: "error"` :

| Risque | Déclencheur |
| - | - |
| `NO_FACE_DETECTED` | Aucun visage n'a été localisé lors de la capture de détection du vivant, ou l'utilisateur a épuisé ses tentatives de réessai. |
| `LIVENESS_FACE_ATTACK` | Le modèle a détecté une attaque par présentation (masque, relecture sur écran, usurpation de type deepfake). |
| `FACE_IN_BLOCKLIST` | Le visage correspond à une entrée de la liste de blocage de visages de votre application. |
| `AGE_BELOW_MINIMUM` | Âge estimé inférieur au minimum configuré. Émis uniquement sur les workflows de vérification d'âge adaptatifs et les nœuds `AGE_ESTIMATION`. |
| `AGE_NOT_DETECTED` | Impossible d'estimer l'âge. Émis uniquement sur les flux d'estimation de l'âge dont le repli vers la vérification d'identité est désactivé. |

Lorsque `NO_FACE_DETECTED` se déclenche, `LOW_LIVENESS_SCORE` est masqué (il n'y a aucun visage à évaluer).

## Paramètres de vérification configurables

Dans la console Didit, les risques de détection du vivant sont regroupés sous les paramètres de workflow suivants :

| Groupe | Risques | Configuration |
| - | - | - |
| **Seuils de score de détection du vivant** | `LOW_LIVENESS_SCORE` | Seuil d'examen + seuil de refus sur `score`. Inférieur ou égal au seuil d'examen → `In Review` ; inférieur ou égal au seuil de refus → `Declined`. |
| **Action sur visage dupliqué** | `DUPLICATED_FACE`, `POSSIBLE_DUPLICATED_FACE` | Un seul paramètre partagé : Aucune action (par défaut) / Examen / Refuser. Ignoré entièrement lorsque le visage correspondant figure dans votre liste d'autorisation de visages. |
| **Discordance d'identité sur visage dupliqué** | `DUPLICATED_FACE_NAME_MISMATCH` | Paramètre dédié (`face_liveness_duplicated_face_name_mismatch_action`) : Aucune action / Examen (par défaut) / Refuser. Évalué uniquement lorsque `DUPLICATED_FACE` se déclenche également — voir ci-dessous. |
| **Correspondance faciale avec attaque de détection du vivant** | `FACE_MATCHES_LIVENESS_ATTACK` | Paramètre dédié (`face_liveness_attack_face_match_action`) : Aucune action (par défaut) / Examen. L'action Refuser définie ici est acceptée, mais appliquée comme Examen. Également disponible sur le nœud Estimation de l'âge. |
| **Visage potentiellement sur liste de blocage** | `POSSIBLE_FACE_IN_BLOCKLIST` | Non configurable dans les workflows — toujours orienté vers un examen (`log_type: "warning"`). |
| **Action en cas de visages multiples** *(passif uniquement)* | `MULTIPLE_FACES_DETECTED` | Aucune action (par défaut) / Examen / Refuser. |
| **Seuils de qualité du visage** *(passif uniquement)* | `LOW_FACE_QUALITY` | Seuil d'examen (par défaut 15) + seuil de refus (par défaut 0, c'est-à-dire refus désactivé). |
| **Luminance du visage** *(passif uniquement)* | `LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE` | Seuils min / max (valeurs par défaut 20 / 80 sur l'échelle normalisée de 0 à 100) + une action par direction (par défaut Examen). |
| **Seuils d'âge** *(workflows adaptatifs / nœud `AGE_ESTIMATION`)* | `AGE_BELOW_MINIMUM`, `AGE_NOT_DETECTED` | Seuils d'âge minimal et limite ; les deux risques refusent automatiquement l'étape de détection du vivant. Lorsque le repli vers la vérification d'identité est activé, le workflow redirige l'utilisateur vers un contrôle de document au lieu de mettre fin à la session. |

## Avertissements générés

### Détection du vivant principale

| Risque | Cause | Gravité | Affecte le statut ? | Résolution |
| - | - | - | - | - |
| `NO_FACE_DETECTED` | Aucun visage localisé pendant la capture, ou l'utilisateur a épuisé ses tentatives de nouvelle capture (`MAX_ATTEMPTS_REACHED`). | `error` | **Refus automatique** | Reprendre la capture avec un meilleur éclairage ; s'assurer que le visage est centré. |
| `LIVENESS_FACE_ATTACK` | Le modèle a détecté une attaque par présentation. | `error` | **Refus automatique** | Traiter comme une fraude. La session est automatiquement refusée. |
| `LOW_LIVENESS_SCORE` | `score` inférieur ou égal au seuil d'examen du workflow. Supprimé lorsque `NO_FACE_DETECTED` est également présent. | `warning` ; passe à `error` lorsque le score est inférieur ou égal au seuil de refus | Configurable (seuils d'examen / de refus) | Reprendre la capture ; ajuster les seuils si vous observez des faux positifs. |

### Intégrité du canal de capture

Signaux d'attaque par injection signalés par le client au moment de la capture. Contrairement aux attaques par présentation (un artefact placé devant une véritable caméra), ceux-ci décrivent le remplacement ou l'interception du flux de la caméra lui-même.

Chacun est configurable par workflow et est défini par défaut sur **aucune action**, de sorte que l'activation de la fonctionnalité ne modifie aucune décision tant que vous n'avez pas choisi une action.

| Risque | Cause | Clé de configuration | Valeur par défaut |
| - | - | - | - |
| `VIRTUAL_CAMERA_DETECTED` | L'appareil de capture a été identifié comme une caméra virtuelle logicielle (OBS, ManyCam, Snap Camera, DroidCam et similaires) plutôt que comme une caméra physique. | `virtual_camera_action` | `NO_ACTION` |
| `EXTERNAL_CAPTURE_DEVICE_DETECTED` | L'appareil de capture était une caméra externe ou une carte d'acquisition plutôt qu'une caméra intégrée. | `external_capture_device_action` | `NO_ACTION` |
| `FRAME_INJECTION_SUSPECTED` | Les images capturées présentent des indicateurs de composition logicielle ou d'injection dans le pipeline de la caméra plutôt qu'une capture réelle en direct, **ou** la capture a été effectuée sur un matériel émulé ou virtualisé (un émulateur Android ou une machine virtuelle de bureau), où aucun capteur de caméra physique n'existe et où chaque image est fournie par l'hôte. | `frame_injection_action` | `NO_ACTION` |
| `INJECTION_ATTACK_DETECTED` | La capture a été injectée plutôt que prise par la caméra de l'appareil lui-même : une caméra virtuelle logicielle, un flux de caméra généré par la page ou par l'automatisation du navigateur, une caméra détournée, ou un outil d'instrumentation attaché à l'application. `additional_data.reasons` ne liste que les raisons qui le prouvent. Les signaux qu'une personne authentique peut produire ne le déclenchent jamais. Pour la détection du vivant et la correspondance faciale, il suit `frame_injection_action`, de sorte que les décisions relatives aux selfies ne changent pas. | `frame_injection_action` | `NO_ACTION` |
| `SCREEN_CAPTURE_DURING_CAPTURE` | L'enregistrement d'écran ou le partage d'écran était actif sur l'appareil pendant la capture biométrique. | `screen_capture_action` | `NO_ACTION` |

> [!NOTE]
>
> Les navigateurs n'exposent aucune attestation de source de caméra au niveau de l'OS à aucun fournisseur ; sur le web, ces signaux constituent donc des éléments de corroboration plutôt que des preuves. Sur le web, un verdict `null` signifie **non déterminé** (les libellés des appareils ne sont pas disponibles tant que l'autorisation de la caméra n'est pas accordée) et ne déclenche jamais de risque.

Une caméra virtuelle est identifiée par le nom de son appareil ; une caméra que le système d'exploitation présente sous un nom ordinaire n'est donc pas reconnue de cette façon. Au sein d'un émulateur Android, la caméra remappée est libellée comme n'importe quelle caméra intégrée, c'est pourquoi le cas du matériel émulé est signalé via `FRAME_INJECTION_SUSPECTED` à la place : il est détecté à partir de l'environnement de l'appareil - la pile de rendu et le modèle d'appareil rapporté dans le user-agent - plutôt qu'à partir du nom de la caméra. Les constats émis à partir de l'environnement de l'appareil portent `additional_data.reason: "emulated_capture_device"`, ce qui les distingue de l'analyse d'images propre au modèle de détection du vivant.

> [!NOTE]
>
> Détecter la machine depuis un navigateur constitue un indice, non une attestation, et un attaquant déterminé peut interférer avec celle-ci. Les SDK mobiles natifs signalent des signaux d'intégrité plus solides, au niveau du système d'exploitation, qu'un navigateur ne peut pas voir (émulateur, appareil rooté ou jailbreaké, interposition au moment de l'exécution, débogueur attaché), chacun avec sa propre action configurable sous [Intégrité de l'appareil et de l'environnement d'exécution](https://docs.didit.me/fr/core-technology/ip-analysis/warnings-ip-analysis.md#intégrité-de-l’appareil-et-de-l’environnement-d’exécution). Ces signaux augmentent considérablement le coût pour l'attaquant, mais à eux seuls ils ne prouvent pas qu'une capture provient d'un appareil authentique. Les signaux d'intégrité de l'appareil sont indépendants de la méthode de détection du vivant, ils se combinent donc avec Passive, 3D Flash ou 3D Action & Flash.

### Analyse médico-légale de la cohérence de l'enregistrement

`LIVENESS_VIDEO_ANOMALY` est calculé **côté serveur sur l'enregistrement de détection du vivant stocké**, indépendamment du modèle de détection du vivant. Il détecte une séquence en mouvement répétée sur plusieurs cycles, caractéristique d'un flux en boucle.

| Risque | Cause | Clé de configuration | Valeur par défaut |
| - | - | - | - |
| `LIVENESS_VIDEO_ANOMALY` | L'enregistrement contient une séquence en mouvement répétée. Les blocages de caméra, les images fixes répétées, les amorces sombres et la lenteur de transmission des images ne déclenchent pas ce signal à eux seuls. | `face_liveness_video_anomaly_action` | `NO_ACTION` |

Définissez l'action sur votre nœud Détection du vivant ou Estimation de l'âge : `NO_ACTION` enregistre un constat informatif, `REVIEW` peut faire passer une vérification déjà tranchée à En cours d'examen, et `DECLINE` peut la faire passer à Refusé. La vérification s'exécute de manière asynchrone, de sorte qu'une escalade peut arriver après le résultat initial. Une décision existante plus sévère n'est pas rétrogradée, et les décisions d'examen manuel sont préservées.

Les constats de version 2 incluent `forensics_version: 2`, des preuves `repeated_sequence` et `repeated_moving_sequence` dans `anomaly_reasons`. Les mesures de transmission telles que `unique_frame_ratio`, `static_pair_ratio`, `decoded_fps_ratio` et `max_frame_gap_seconds` restent des diagnostics ; elles ne peuvent pas établir un rejeu à elles seules. Les constats plus anciens décrivent la version du détecteur utilisée à ce moment-là et ne sont pas reclassés rétroactivement.

> [!NOTE]
>
> Il s'agit d'un signal complémentaire prudent, et non d'une détection complète de médias synthétiques ou de vidéos injectées. Un enregistrement sans anomalie ne constitue pas une preuve de présence du vivant. Les captures courtes ou ambiguës et les captures sans preuve de rejeu exploitable ne sont pas signalées par cette vérification. Les enregistrements manquants ou illisibles ne produisent aucun constat issu de ce contrôle ; les autres vérifications continuent de s'appliquer.

### Correspondance faciale inter-sessions

| Risque | Cause | Données supplémentaires | Gravité |
| - | - | - | - |
| `FACE_IN_BLOCKLIST` | Le visage correspond à un visage sur liste de blocage. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `error` — **refus automatique** |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Le visage correspond à un visage sur liste de blocage avec une plage de confiance plus faible. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `warning` — toujours acheminé vers l'examen dans les workflows |
| `FACE_IN_ALLOWLIST` | Le visage correspond à un visage sur liste d'autorisation. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — action de visage dupliqué ignorée |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Le visage correspond à un visage sur liste d'autorisation avec une plage de confiance plus faible. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — action de visage potentiellement dupliqué ignorée |
| `DUPLICATED_FACE` | Le visage correspond à un visage déjà approuvé d'un autre utilisateur (une session `Approved` avec un `vendor_data` différent, ou un visage importé associé à l'un de vos utilisateurs fournisseur). | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurable — `information` par défaut |
| `POSSIBLE_DUPLICATED_FACE` | Le visage correspond à un autre visage approuvé ou importé avec une plage de confiance plus faible. | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurable — `information` par défaut |
| `DUPLICATED_FACE_NAME_MISMATCH` | Émis aux côtés de `DUPLICATED_FACE` lorsque l'identité de la session correspondante ne concorde pas avec le nom résolu de cette session (document d'identité, `expected_details` ou utilisateur fournisseur lié), en utilisant la même notation de correspondance de nom et le même seuil que la vérification d'identité. Un visage réutilisé sous un nom différent constitue un signal de fraude plus fort qu'un simple doublon, et fait donc l'objet de sa propre action configurable. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `name_match_score` | Configurable — `warning` par défaut. N'assouplit jamais le résultat configuré propre à `DUPLICATED_FACE`, ne fait que l'aggraver. |
| `DUPLICATED_FACE_DOCUMENT_MISMATCH` | Émis aux côtés de `DUPLICATED_FACE` lorsque le document d'identité de l'utilisateur correspondant indique une date de naissance différente de celle du document de cette session. La même personne présentant un document différent (par exemple un passeport après une carte d'identité) ou un document renouvelé n'est pas signalée, et deux sessions partageant le même numéro de document du même pays ne sont jamais signalées. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `mismatch_dimensions` | Configurable (`face_liveness_duplicated_face_document_mismatch_action`) - `Review` par défaut. N'assouplit jamais le résultat configuré propre à `DUPLICATED_FACE`, ne fait que l'aggraver. |
| `FACE_MATCHES_LIVENESS_ATTACK` | Le visage correspond à un visage d'une session antérieure de cette application, appartenant à un autre utilisateur, dont la capture de détection du vivant a elle-même été jugée comme une attaque avec un niveau de confiance élevé. Élément à examiner, et non preuve d'une attaque. | `liveness_attack_session_id`, `liveness_attack_session_number`, `similarity_percentage`, `liveness_attack_sessions_count` | Configurable - `information` par défaut (Aucune action) |

Pour les correspondances avec des visages importés ou des visages figurant dans des listes (qui n'ont pas de session), les valeurs `*_session_id`, `*_session_number` et `api_service` dans `additional_data` sont `null`.

Les visages appartenant au même utilisateur (même `vendor_data`, ou même utilisateur fournisseur lorsqu'il est disponible) sont exclus de l'**intégralité** de la recherche dans l'index — tant pour la détection de doublons que pour le filtrage sur liste de blocage. La priorité de correspondance est la suivante : liste de blocage exacte → liste d'autorisation exacte → doublon exact → liste de blocage possible → liste d'autorisation possible → doublon possible — un seul de ces six codes mutuellement exclusifs apparaît dans chaque rapport. `DUPLICATED_FACE_NAME_MISMATCH` ne fait pas partie de ce groupe de priorité : il s'agit d'un code supplémentaire émis **en plus de** `DUPLICATED_FACE` lorsque la vérification d'identité échoue également, jamais à sa place. `additional_data.name_match_score` ne transmet jamais les noms comparés — uniquement des identifiants et un score, de sorte qu'aucun renseignement personnel n'apparaît dans le payload de l'avertissement.

Un nom écrit dans un système d'écriture différent sur chaque document (par exemple en hébreu sur l'un et en alphabet latin sur l'autre) peut obtenir un score inférieur au seuil même lorsque les deux sessions appartiennent à la même personne. Dans ce cas précis, `DUPLICATED_FACE_NAME_MISMATCH` n'est pas émis lorsque les documents d'identité des deux sessions se corroborent mutuellement sur tous ces points :

* Les deux documents indiquent le même État de délivrance.
* Un identifiant correspond exactement entre les deux documents. `document_number` et `personal_number` sont considérés de manière interchangeable, car le même numéro national peut figurer dans l'un ou l'autre champ selon le type de document.
* Lorsque les deux documents comportent une date de naissance, il s'agit de la même date.

Si les noms sont rédigés dans le même système d'écriture, si l'identifiant ou l'État de délivrance diffère ou est manquant, ou si les dates de naissance se contredisent, l'avertissement est toujours émis comme décrit ci-dessus.

### Qualité de la détection du vivant passive (uniquement lorsque `method = "PASSIVE"`)

| Risque | Cause | Gravité | Mesure corrective |
| - | - | - | - |
| `MULTIPLE_FACES_DETECTED` | Plus d'un visage était visible pendant la capture. Le visage le plus grand est toujours utilisé pour la notation et la correspondance. | Configurable — `information` par défaut | Refaire la capture sans autre personne. |
| `LOW_FACE_QUALITY` | Qualité du visage inférieure au seuil d'examen (15 par défaut). | `warning` ; `error` lorsqu'elle est inférieure au seuil de refus (0 par défaut — refus désactivé) | Meilleure mise au point / moins d'obstruction / visage centré. |
| `LOW_FACE_LUMINANCE` | Luminance normalisée inférieure au seuil minimal (20 par défaut). | Configurable — `warning` par défaut (l'action par défaut est l'examen) | Meilleur éclairage. |
| `HIGH_FACE_LUMINANCE` | Luminance normalisée supérieure au seuil maximal (80 par défaut). | Configurable — `warning` par défaut (l'action par défaut est l'examen) | Réduire l'éclairage ; éviter le contre-jour. |

`LOW_FACE_LUMINANCE` et `HIGH_FACE_LUMINANCE` s'excluent mutuellement — la luminance est soit inférieure au minimum, soit supérieure au maximum, jamais les deux.

### Estimation de l'âge (workflows adaptatifs et nœuds `AGE_ESTIMATION`)

| Risque | Cause | Gravité | Remédiation |
| - | - | - | - |
| `AGE_BELOW_MINIMUM` | Âge estimé inférieur au minimum configuré (ou au seuil limite lorsque le repli vers la vérification d'identité est activé). | `error` | Le workflow bascule vers la vérification d'identité lorsque le repli est configuré. |
| `AGE_NOT_DETECTED` | L'âge n'a pas pu être estimé et le repli vers la vérification d'identité est désactivé. | `error` | Activez le repli ou effectuez une nouvelle capture. |

## Chaînes de description exactes

L'API renvoie ces chaînes exactes de `short_description` et `long_description` pour chaque risque :

| `risk` | `short_description` | `long_description` |
| - | - | - |
| `NO_FACE_DETECTED` | Aucun visage détecté lors de la détection du vivant | Le système n'a pas pu identifier de visage lors de la vérification de détection du vivant, ce qui peut être dû à une mauvaise qualité d'image, un mauvais positionnement ou des problèmes techniques. |
| `LIVENESS_FACE_ATTACK` | Attaque faciale sur la détection du vivant | Le système a détecté une tentative potentielle de contournement de la vérification de détection du vivant. |
| `LOW_LIVENESS_SCORE` | Score de détection du vivant faible | La vérification de détection du vivant a donné un score faible, indiquant l'utilisation potentielle de représentations faciales non vivantes ou de données biométriques de mauvaise qualité. |
| `LIVENESS_VIDEO_ANOMALY` | Anomalie du flux vidéo de détection du vivant | La vidéo de détection du vivant enregistrée contient une séquence animée répétée correspondant à un flux en boucle. Les blocages de la caméra, les images fixes répétées et la lenteur de transmission des images ne déclenchent pas ce signal à eux seuls. Il s'agit d'une vérification d'enregistrement indépendante, et non d'une évaluation complète du caractère vivant de la capture. |
| `FACE_IN_BLOCKLIST` | Visage sur la liste de blocage | Le système a identifié un visage présent sur la liste de blocage, ce qui signifie que le visage n'est pas autorisé à être vérifié. |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Visage potentiel sur la liste de blocage | Le système a identifié un visage potentiel sur la liste de blocage, ce qui signifie que le visage n'est pas autorisé à être vérifié. |
| `FACE_IN_ALLOWLIST` | Visage sur la liste d'autorisation | Le visage correspond à la liste d'autorisation de visages de l'application, les actions liées aux doublons de visages ont donc été ignorées pour ce signal. |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Visage potentiel sur la liste d'autorisation | Le visage correspond potentiellement à la liste d'autorisation de visages de l'application, les actions liées aux doublons de visages potentiels ont donc été ignorées pour ce signal. |
| `DUPLICATED_FACE` | Visage dupliqué d'une autre session approuvée | Le système a identifié un visage dupliqué provenant d'une autre session approuvée, nécessitant une enquête approfondie. |
| `POSSIBLE_DUPLICATED_FACE` | Visage potentiellement dupliqué d'une autre session approuvée | Le système a identifié un visage potentiellement dupliqué provenant d'une autre session approuvée, nécessitant une enquête approfondie. |
| `DUPLICATED_FACE_NAME_MISMATCH` | Visage dupliqué sous un nom différent | Le même visage a déjà été approuvé lors d'une autre session, mais sous un nom différent. L'identité associée au doublon ne correspond pas à l'identité déclarée lors de cette session, ce qui constitue un indicateur fort de fraude à l'identité. |
| `FACE_MATCHES_LIVENESS_ATTACK` | Le visage correspond à une attaque sur la détection du vivant | Le visage de cette capture de détection du vivant correspond à un visage issu d'une session antérieure de cette application dont le moteur de détection du vivant a jugé la capture comme étant une attaque avec un niveau de confiance élevé, lors de la session d'un autre utilisateur. Un utilisateur légitime pouvant être rejeté par erreur, il s'agit d'un signal pour examen et non d'une preuve d'attaque. |
| `MULTIPLE_FACES_DETECTED` | Plusieurs visages détectés | Plusieurs visages ont été détectés dans l'image de détection du vivant. Le système utilise le plus grand visage pour la vérification de détection du vivant et la comparaison faciale, mais la présence de plusieurs visages peut nécessiter un examen supplémentaire. |
| `LOW_FACE_QUALITY` | Qualité du visage faible | La qualité de l'image faciale est inférieure au seuil acceptable, ce qui peut affecter la fiabilité de la détection du vivant. Cela peut être dû à la résolution de la caméra, à la mise au point ou à des artéfacts de compression. |
| `LOW_FACE_LUMINANCE` | Faible luminosité du visage | L'image faciale est trop sombre, ce qui peut affecter la précision de la détection du vivant. De meilleures conditions d'éclairage sont recommandées. |
| `HIGH_FACE_LUMINANCE` | Luminosité élevée du visage | L'image faciale est trop lumineuse ou surexposée, ce qui peut affecter la précision de la détection du vivant. Un éclairage réduit ou l'évitement de la lumière directe est recommandé. |
| `AGE_BELOW_MINIMUM` | Âge inférieur au minimum | L'âge du visage est inférieur au seuil d'âge minimum pour l'application. |
| `AGE_NOT_DETECTED` | Âge non détecté | Le système n'a pas pu identifier l'âge du visage, ce qui est nécessaire pour la vérification de document. |

## API autonome de détection passive du vivant

L'[API Liveness](https://docs.didit.me/fr/standalone-apis/passive-liveness.md) autonome réutilise les mêmes codes de risque avec quelques différences de comportement :

* `NO_FACE_DETECTED` et `LOW_LIVENESS_SCORE` s'excluent mutuellement — la vérification du score ne s'exécute que si un visage a été détecté. `LOW_LIVENESS_SCORE` se déclenche en fonction du `face_liveness_score_decline_threshold` de la requête (par défaut 30) et comporte toujours `log_type: "error"`.
* `POSSIBLE_FACE_IN_BLOCKLIST` est traité comme un refus (`log_type: "error"`) plutôt qu'un examen.
* `MULTIPLE_FACES_DETECTED` comporte `log_type: "warning"`, tandis que les risques de visages dupliqués restent informatifs. Seuls les avertissements de niveau `error` font basculer le `status` de la réponse autonome à `Declined`.
* Les entrées d'avertissement autonomes incluent `feature` mais aucun `node_id`.

## Exemples

### Refus automatique en cas d'attaque détectée

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

### Avertissements configurables sur une capture passive

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

### Visage dupliqué avec 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"
  }
]
```

Ici, l'action pour visage dupliqué est définie sur Examen, l'avertissement porte donc `log_type: "warning"` et le statut du rapport de détection du vivant est `In Review`. Avec la valeur par défaut (Aucune action), il contiendrait plutôt `log_type: "information"`. `api_service` est `null` car le visage correspondant provient d'une session de workflow, et non d'un appel d'API autonome.

### Visage dupliqué sous un nom différent

```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` conserve son action configurée (ici, Aucune action — `log_type: "information"`), tandis que `DUPLICATED_FACE_NAME_MISMATCH` applique sa propre action, définie par défaut sur Examen (`log_type: "warning"`). Le statut du rapport de détection du vivant suit le niveau de gravité le plus élevé des deux : `In Review` ici, même si le paramètre classique de visage dupliqué ne l'aurait pas signalé à lui seul.

### Anomalie de cohérence de l'enregistrement avec ses mesures

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

Cet exemple montre la preuve de rejeu issue d'un enregistrement contenant trois copies d'une séquence animée. `log_type` est `information` car l'action configurée est `NO_ACTION`. Les diagnostics de distribution des trames, omis de cet exemple par souci de concision, ne déclenchent pas cette détection.

## Types d'avertissements

Chaque risque se voit attribuer un niveau de gravité en fonction de la configuration de votre application. Les trois niveaux de gravité sont :

## Liens connexes

* [Rapport de détection du vivant](https://docs.didit.me/fr/core-technology/liveness/report-liveness.md) — schéma complet du rapport et statuts.
* [Avertissements de correspondance faciale](https://docs.didit.me/fr/core-technology/face-match/warnings-face-match.md) — avertissements associés de correspondance faciale 1:1.
* [Webhooks](https://docs.didit.me/fr/integration/webhooks.md) — `session.status.updated` transmet les avertissements dès que l'étape de détection du vivant se termine.
* [Modèles de données — Détection du vivant](https://docs.didit.me/fr/reference/data-models.md#détection-du-vivant) — schéma de référence avec chaque champ.
* [Modèles de données — Objet d'avertissement](https://docs.didit.me/fr/reference/data-models.md#objet-d’avertissement) — structure de chaque entrée dans `warnings[]`.


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