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

# Prova de vida: avisos e códigos de erro

> Consulte todos os avisos de prova de vida da Didit: ataques faciais, qualidade, listas de bloqueio e duplicados, com causas e soluções.

## Visão geral

Os avisos no relatório de prova de vida assinalam todas as condições observadas pela Didit durante a execução da verificação de prova de vida. Ficam registados no array `warnings[]` em cada item de `liveness_checks[]` (consulte [Relatório de prova de vida](https://docs.didit.me/pt/core-technology/liveness/report-liveness.md)), com o campo `feature` definido como `"LIVENESS"`. Cada entrada segue a estrutura partilhada do [objeto de aviso](https://docs.didit.me/pt/reference/data-models.md#objeto-de-aviso): `feature`, `risk`, `additional_data`, `log_type`, `short_description`, `long_description`, `node_id`.

Cada aviso tem três camadas:

1. **O código `risk`** — um identificador estável que pode utilizar no seu código para fazer correspondências (os códigos listados abaixo).
2. **O `log_type`** — um de `information`, `warning` ou `error`. Os riscos de recusa automática têm sempre `error`. Para riscos configuráveis, é derivado da ação configurada: **Sem ação** → `information`, **Revisão** → `warning`, **Recusar** → `error`. Para riscos baseados em limiares (`LOW_LIVENESS_SCORE`, `LOW_FACE_QUALITY`), é `error` quando o valor atinge ou fica abaixo do limiar de recusa e `warning` quando atinge ou fica abaixo apenas do limiar de revisão.
3. **O impacto na decisão** — o mesmo encaminhamento define o `status` do relatório de prova de vida: uma ação de Revisão move-o para `In Review`, uma ação de recusa (ou qualquer risco de recusa automática) para `Declined`, e Sem ação deixa-o inalterado.

Alguns riscos só são emitidos quando o método de prova de vida é `PASSIVE` (verificações de múltiplos rostos, qualidade e luminância). As tabelas abaixo listam o conjunto completo de códigos de risco de prova de vida e as respetivas gravidades — não existem outros códigos de risco de prova de vida.

## Condições de recusa automática

Os seguintes riscos forçam sempre o relatório de prova de vida (e a sessão) para `Declined`, com `log_type: "error"`:

| Risco | Acionador |
| - | - |
| `NO_FACE_DETECTED` | Nenhum rosto foi localizado durante a captura de prova de vida, ou o utilizador esgotou as tentativas disponíveis. |
| `LIVENESS_FACE_ATTACK` | O modelo detetou um ataque de apresentação (máscara, reprodução em ecrã, spoofing da classe deepfake). |
| `FACE_IN_BLOCKLIST` | O rosto correspondeu a uma entrada na lista de bloqueio de rostos da sua aplicação. |
| `AGE_BELOW_MINIMUM` | Idade estimada abaixo do mínimo configurado. Emitido apenas em fluxos adaptativos de verificação de idade e nós `AGE_ESTIMATION`. |
| `AGE_NOT_DETECTED` | Não foi possível estimar a idade. Emitido apenas em fluxos de estimativa de idade com a alternativa de verificação de identidade desativada. |

Quando `NO_FACE_DETECTED` é acionado, `LOW_LIVENESS_SCORE` é suprimido (não há nenhum rosto ao qual atribuir uma pontuação).

## Definições de verificação configuráveis

Na consola da Didit, os riscos de prova de vida estão agrupados sob as seguintes definições do fluxo:

| Grupo | Riscos | Configuração |
| - | - | - |
| **Limiares de pontuação de prova de vida** | `LOW_LIVENESS_SCORE` | Limiar de revisão + limiar de recusa em `score`. Igual ou inferior ao limiar de revisão → `In Review`; igual ou inferior ao limiar de recusa → `Declined`. |
| **Ação para rosto duplicado** | `DUPLICATED_FACE`, `POSSIBLE_DUPLICATED_FACE` | Uma definição partilhada: Sem ação (predefinição) / Revisão / Recusar. Os riscos são totalmente ignorados quando o rosto correspondente está na sua lista de permissões de rostos. |
| **Incompatibilidade de identidade em rosto duplicado** | `DUPLICATED_FACE_NAME_MISMATCH` | Definição própria (`face_liveness_duplicated_face_name_mismatch_action`): Sem ação / Revisão (predefinição) / Recusar. O risco só é avaliado quando `DUPLICATED_FACE` também é acionado — veja abaixo. |
| **Correspondência facial com ataque de prova de vida** | `FACE_MATCHES_LIVENESS_ATTACK` | Definição própria (`face_liveness_attack_face_match_action`): Sem ação (predefinição) / Revisão. A opção Recusar definida aqui é aceite mas aplicada como Revisão. Também disponível no nó de Estimativa de idade. |
| **Possível rosto na lista de bloqueio** | `POSSIBLE_FACE_IN_BLOCKLIST` | Não configurável em fluxos — sempre encaminhado para Revisão (`log_type: "warning"`). |
| **Ação para múltiplos rostos** *(apenas em modo passivo)* | `MULTIPLE_FACES_DETECTED` | Sem ação (predefinição) / Revisão / Recusar. |
| **Limiares de qualidade do rosto** *(apenas em modo passivo)* | `LOW_FACE_QUALITY` | Limiar de revisão (predefinição 15) + limiar de recusa (predefinição 0, ou seja, recusa desativada). |
| **Luminância facial** *(apenas em modo passivo)* | `LOW_FACE_LUMINANCE`, `HIGH_FACE_LUMINANCE` | Limiares mínimo / máximo (predefinições 20 / 80 na escala normalizada de 0–100) + uma ação por direção (predefinição Revisão). |
| **Limiares de idade** *(fluxos adaptativos / nó `AGE_ESTIMATION`)* | `AGE_BELOW_MINIMUM`, `AGE_NOT_DETECTED` | Limiares de idade mínima e de idade limítrofe; ambos os riscos recusam automaticamente o passo de prova de vida. Com a alternativa de verificação de identidade ativada, o fluxo encaminha o utilizador para uma verificação de documento em vez de terminar a sessão. |

## Avisos produzidos

### Prova de vida principal

| Risco | Causa | Gravidade | Afeta o estado? | Resolução |
| - | - | - | - | - |
| `NO_FACE_DETECTED` | Nenhum rosto localizado durante a captura, ou o utilizador esgotou as tentativas (`MAX_ATTEMPTS_REACHED`). | `error` | **Recusa automática** | Repetir a captura com melhor iluminação; garantir que o rosto está centrado. |
| `LIVENESS_FACE_ATTACK` | O modelo detetou um ataque de apresentação. | `error` | **Recusa automática** | Tratar como fraude. A sessão é recusada automaticamente. |
| `LOW_LIVENESS_SCORE` | `score` igual ou inferior ao limiar de revisão do fluxo. Suprimido quando `NO_FACE_DETECTED` também está presente. | `warning`; escala para `error` quando a pontuação é igual ou inferior ao limiar de recusa | Configurável (limiares de revisão / recusa) | Repetir a captura; ajustar os limiares se observar falsos positivos. |

### Integridade do canal de captura

Sinais de ataques de injeção reportados pelo cliente no momento da captura. Ao contrário dos ataques de apresentação (um artefacto colocado em frente a uma câmara real), estes descrevem a substituição ou interceção do próprio fluxo de vídeo da câmara.

Cada um é configurável por fluxo e tem como predefinição **nenhuma ação**, pelo que ativar a funcionalidade não altera quaisquer decisões até que opte por fazê-lo.

| Risco | Causa | Chave de configuração | Predefinição |
| - | - | - | - |
| `VIRTUAL_CAMERA_DETECTED` | O dispositivo de captura foi identificado como uma câmara virtual de software (OBS, ManyCam, Snap Camera, DroidCam e semelhantes) em vez de uma câmara física. | `virtual_camera_action` | `NO_ACTION` |
| `EXTERNAL_CAPTURE_DEVICE_DETECTED` | O dispositivo de captura era uma câmara externa ou uma placa de captura em vez de uma câmara integrada. | `external_capture_device_action` | `NO_ACTION` |
| `FRAME_INJECTION_SUSPECTED` | Os fotogramas capturados mostram indicadores de composição de software ou injeção na cadeia de processamento da câmara em vez de uma captura genuína em direto, **ou** a captura foi realizada em hardware emulado ou virtualizado (um emulador Android ou uma máquina virtual num computador), onde não existe um sensor de câmara física e cada fotograma é fornecido pelo anfitrião. | `frame_injection_action` | `NO_ACTION` |
| `INJECTION_ATTACK_DETECTED` | A captura foi injetada em vez de capturada pela própria câmara do dispositivo: uma câmara virtual de software, um fluxo de vídeo da câmara gerado pela página ou por automação de navegador, uma câmara intercetada ou uma ferramenta de instrumentação associada à aplicação. `additional_data.reasons` lista apenas as razões que o comprovam. Sinais que uma pessoa genuína pode produzir nunca acionam este aviso. Na prova de vida e correspondência facial segue `frame_injection_action`, pelo que as decisões de selfie não mudam. | `frame_injection_action` | `NO_ACTION` |
| `SCREEN_CAPTURE_DURING_CAPTURE` | A gravação de ecrã ou a partilha de ecrã estava ativa no dispositivo durante a captura biométrica. | `screen_capture_action` | `NO_ACTION` |

> [!NOTE]
>
> Os navegadores não disponibilizam atestação da fonte da câmara ao nível do SO a nenhum fornecedor, pelo que na web estes sinais são evidências corroborantes e não provas cabais. Na web, um veredito de `null` significa **não determinado** (as etiquetas do dispositivo não estão disponíveis até que a permissão da câmara seja concedida) e nunca aciona um risco.

Uma câmara virtual é identificada pelo nome do seu dispositivo, pelo que uma câmara que o sistema operativo apresente sob um nome vulgar não é reconhecida dessa forma. Dentro de um emulador Android, a câmara remapeada é etiquetada como qualquer uma integrada, razão pela qual o caso de hardware emulado é reportado através de `FRAME_INJECTION_SUSPECTED`: é detetado a partir do ambiente do dispositivo - a pilha de renderização e o modelo do dispositivo indicado pelo agente do utilizador - em vez do nome da câmara. As constatações baseadas no ambiente do dispositivo incluem `additional_data.reason: "emulated_capture_device"`, distinguindo-as da análise de fotogramas do próprio modelo de prova de vida.

> [!NOTE]
>
> Detetar a máquina a partir de um navegador é uma evidência, não uma atestação, e um atacante determinado pode interferir com ela. Os SDKs móveis nativos reportam sinais de integridade ao nível do sistema operativo mais fortes, que um navegador não consegue ver (emulador, dispositivo com root ou jailbreak, interceção em tempo de execução, depurador associado), cada um com a sua própria ação configurável em [Integridade do dispositivo e do ambiente de execução](https://docs.didit.me/pt/core-technology/ip-analysis/warnings-ip-analysis.md#integridade-do-dispositivo-e-do-runtime). Estes sinais aumentam consideravelmente o custo do atacante, mas por si só não provam que uma captura veio de um dispositivo genuíno. Os sinais de integridade do dispositivo são independentes do método de prova de vida, pelo que se combinam com qualquer um de Passivo, 3D Flash ou 3D Action & Flash.

### Análise forense da integridade da gravação

`LIVENESS_VIDEO_ANOMALY` é calculado **no servidor na gravação de prova de vida armazenada**, independentemente do modelo de prova de vida. Deteta uma sequência em movimento repetida ao longo de múltiplos ciclos, consistente com um fluxo de vídeo em loop.

| Risco | Causa | Chave de configuração | Predefinição |
| - | - | - | - |
| `LIVENESS_VIDEO_ANOMALY` | A gravação contém uma sequência em movimento repetida. Paragens da câmara, fotogramas estáticos repetidos, introduções escuras e entrega lenta de fotogramas por si só não acionam este sinal. | `face_liveness_video_anomaly_action` | `NO_ACTION` |

Defina a ação no seu nó de Prova de vida ou Estimativa de idade: `NO_ACTION` regista uma constatação informativa, `REVIEW` pode escalar uma verificação decidida para Em análise, e `DECLINE` pode escalá-la para Recusada. A verificação é executada de forma assíncrona, pelo que uma escalada pode chegar após o resultado inicial. Uma decisão existente mais grave não é despromovida, e as decisões de revisão manual são preservadas.

As constatações da versão 2 incluem `forensics_version: 2`, evidência `repeated_sequence` e `repeated_moving_sequence` em `anomaly_reasons`. As medições de entrega como `unique_frame_ratio`, `static_pair_ratio`, `decoded_fps_ratio` e `max_frame_gap_seconds` permanecem como diagnósticos; não conseguem, por si só, provar uma reprodução. As constatações mais antigas descrevem a versão do detetor utilizada na altura e não são reclassificadas retroativamente.

> [!NOTE]
>
> Este é um sinal adicional conservador, não uma deteção completa de conteúdos sintéticos ou vídeo injetado. Uma gravação sem anomalias não é prova de vida. Capturas curtas ou ambíguas e capturas sem evidências utilizáveis de reprodução permanecem não assinaladas por esta verificação. Gravações em falta ou ilegíveis não produzem constatações a partir desta verificação; outras verificações continuam a aplicar-se.

### Correspondência facial entre sessões

| Risco | Causa | Dados adicionais | Gravidade |
| - | - | - | - |
| `FACE_IN_BLOCKLIST` | O rosto correspondeu a um rosto na lista de bloqueio. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `error` — **recusa automática** |
| `POSSIBLE_FACE_IN_BLOCKLIST` | O rosto correspondeu a um rosto na lista de bloqueio num intervalo de menor confiança. | `blocklisted_session_id`, `blocklisted_session_number`, `api_service` | `warning` — sempre encaminhado para Revisão nos fluxos |
| `FACE_IN_ALLOWLIST` | O rosto correspondeu a um rosto na lista de permissões. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — ação de rosto duplicado ignorada |
| `POSSIBLE_FACE_IN_ALLOWLIST` | O rosto correspondeu a um rosto na lista de permissões num intervalo de menor confiança. | `allowlisted_session_id`, `allowlisted_session_number`, `api_service` | `information` — possível ação de rosto duplicado ignorada |
| `DUPLICATED_FACE` | O rosto correspondeu a um rosto já aprovado de outro utilizador (uma sessão `Approved` com `vendor_data` diferente, ou um rosto importado associado a um dos seus utilizadores de fornecedor). | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurável — `information` por predefinição |
| `POSSIBLE_DUPLICATED_FACE` | O rosto correspondeu a outro rosto aprovado ou importado num intervalo de menor confiança. | `duplicated_session_id`, `duplicated_session_number`, `api_service` | Configurável — `information` por predefinição |
| `DUPLICATED_FACE_NAME_MISMATCH` | Emitido juntamente com `DUPLICATED_FACE` quando a identidade da sessão correspondida não coincide com o nome resolvido desta sessão (documento de identificação, `expected_details` ou utilizador de fornecedor associado), utilizando a mesma pontuação de correspondência de nomes e o mesmo limiar que a verificação de identidade. Um rosto reutilizado sob um nome diferente é um sinal de fraude mais forte do que um simples duplicado, pelo que tem a sua própria ação configurável. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `name_match_score` | Configurável — `warning` por predefinição. Nunca flexibiliza o resultado configurado do próprio `DUPLICATED_FACE`, apenas o agrava. |
| `DUPLICATED_FACE_DOCUMENT_MISMATCH` | Emitido juntamente com `DUPLICATED_FACE` quando o documento de identificação do utilizador correspondido apresenta uma data de nascimento diferente da do documento desta sessão. A mesma pessoa que apresente um documento diferente (por exemplo, um passaporte após um cartão de cidadão) ou um documento renovado não é sinalizada, e duas sessões que partilhem o mesmo número de documento do mesmo país nunca são sinalizadas. | `duplicated_session_id`, `duplicated_session_number`, `api_service`, `mismatch_dimensions` | Configurável (`face_liveness_duplicated_face_document_mismatch_action`) - `Review` por predefinição. Nunca flexibiliza o resultado configurado do próprio `DUPLICATED_FACE`, apenas o agrava. |
| `FACE_MATCHES_LIVENESS_ATTACK` | O rosto corresponde a um rosto de uma sessão anterior desta aplicação, de outro utilizador, cuja própria captura de prova de vida foi considerada um ataque com elevada confiança. Evidência para revisão, não prova de um ataque. | `liveness_attack_session_id`, `liveness_attack_session_number`, `similarity_percentage`, `liveness_attack_sessions_count` | Configurável - `information` por predefinição (Sem ação) |

Para correspondências com rostos importados ou rostos em entradas de lista (que não possuem sessão), os valores de `*_session_id`, `*_session_number` e `api_service` em `additional_data` são `null`.

Os rostos pertencentes ao mesmo utilizador (mesmo `vendor_data`, ou o mesmo utilizador de fornecedor quando disponível) são excluídos de **toda** a pesquisa no índice — tanto da deteção de duplicados como da triagem na lista de bloqueio. A precedência de correspondência é: lista de bloqueio exata → lista de permissões exata → duplicado exato → lista de bloqueio possível → lista de permissões possível → duplicado possível — apenas um destes seis códigos mutuamente exclusivos aparece por relatório. `DUPLICATED_FACE_NAME_MISMATCH` não faz parte desse grupo de precedência: é um código adicional emitido **além de** `DUPLICATED_FACE` quando a verificação de identidade também falha, nunca em substituição deste. `additional_data.name_match_score` nunca inclui os nomes que estão a ser comparados — apenas IDs e uma pontuação, para que nenhum dado pessoal (PII) chegue ao payload do aviso.

Um nome escrito num sistema de escrita diferente em cada documento (por exemplo, hebraico num e latino no outro) pode obter uma pontuação abaixo do limiar, mesmo quando ambas as sessões pertencem à mesma pessoa. Nesse caso específico, `DUPLICATED_FACE_NAME_MISMATCH` não é emitido quando os documentos de identificação de ambas as sessões se corroboram mutuamente em todos os seguintes pontos:

* Ambos os documentos apresentam o mesmo estado emissor.
* Um identificador coincide exatamente nos dois documentos. `document_number` e `personal_number` são considerados equivalentes, porque o mesmo número nacional pode constar em qualquer um dos campos, dependendo do tipo de documento.
* Onde ambos os documentos contêm uma data de nascimento, trata-se da mesma data.

Se os nomes estiverem no mesmo sistema de escrita, se o identificador ou o estado emissor for diferente ou estiver em falta, ou se as datas de nascimento se contradisserem, o aviso continua a ser emitido conforme descrito acima.

### Qualidade da prova de vida passiva (apenas quando `method = "PASSIVE"`)

| Risco | Causa | Gravidade | Resolução |
| - | - | - | - |
| `MULTIPLE_FACES_DETECTED` | Foi visível mais de um rosto durante a captura. O rosto maior é sempre utilizado para a pontuação e correspondência. | Configurável — `information` por predefinição | Repetir a captura sozinho. |
| `LOW_FACE_QUALITY` | Qualidade do rosto abaixo do limiar de revisão (predefinição: 15). | `warning`; `error` quando abaixo do limiar de recusa (predefinição: 0 — recusa desativada) | Melhor foco / menor oclusão / rosto centrado. |
| `LOW_FACE_LUMINANCE` | Luminância normalizada abaixo do limiar mínimo (predefinição: 20). | Configurável — `warning` por predefinição (a ação tem como predefinição Revisão) | Melhor iluminação. |
| `HIGH_FACE_LUMINANCE` | Luminância normalizada acima do limiar máximo (predefinição: 80). | Configurável — `warning` por predefinição (a ação tem como predefinição Revisão) | Reduzir a iluminação; evitar contraluz. |

`LOW_FACE_LUMINANCE` e `HIGH_FACE_LUMINANCE` são mutuamente exclusivos — a luminância ou está abaixo do mínimo ou acima do máximo, nunca ambos.

### Estimativa de idade (fluxos adaptativos e nós `AGE_ESTIMATION`)

| Risco | Causa | Gravidade | Resolução |
| - | - | - | - |
| `AGE_BELOW_MINIMUM` | Idade estimada abaixo do mínimo configurado (ou limiar limítrofe quando o recurso à verificação de identidade está ativado). | `error` | O fluxo recorre à verificação de identidade quando configurado. |
| `AGE_NOT_DETECTED` | Não foi possível estimar a idade e o recurso à verificação de identidade está desativado. | `error` | Ative o recurso ou efetue nova captura. |

## Strings de descrição exatas

A API devolve exatamente estas strings `short_description` e `long_description` para cada risco:

| `risk` | `short_description` | `long_description` |
| - | - | - |
| `NO_FACE_DETECTED` | No Face Detected in liveness | The system couldn't identify a face during the liveness check, which may be due to poor image quality, improper positioning, or technical issues. |
| `LIVENESS_FACE_ATTACK` | Liveness Face Attack | The system detected a potential attempt to bypass the liveness check. |
| `LOW_LIVENESS_SCORE` | Low liveness score | The liveness check resulted in a low score, indicating potential use of non-live facial representations or poor-quality biometric data. |
| `LIVENESS_VIDEO_ANOMALY` | Liveness video stream anomaly | 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. |
| `FACE_IN_BLOCKLIST` | Face in blocklist | The system identified a face in the blocklist, which means the face is not allowed to be verified. |
| `POSSIBLE_FACE_IN_BLOCKLIST` | Possible face in blocklist | The system identified a possible face in the blocklist, which means the face is not allowed to be verified. |
| `FACE_IN_ALLOWLIST` | Face in allowlist | The face matched the application's face allowlist, so duplicate-face actions were skipped for this signal. |
| `POSSIBLE_FACE_IN_ALLOWLIST` | Possible face in allowlist | The face possibly matched the application's face allowlist, so possible duplicate-face actions were skipped for this signal. |
| `DUPLICATED_FACE` | Duplicated face from other approved session | The system identified a duplicated face from another approved session, requiring further investigation. |
| `POSSIBLE_DUPLICATED_FACE` | Possible duplicated face from other approved session | The system identified a possible duplicate face from another approved session, requiring further investigation. |
| `DUPLICATED_FACE_NAME_MISMATCH` | Duplicated face under a different name | 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. |
| `FACE_MATCHES_LIVENESS_ATTACK` | Face matches a liveness attack | The face in this liveness capture matches a face from an earlier session of this application whose own capture the liveness engine judged to be an attack with high confidence, in a session of another user. A genuine user can be rejected by mistake, so this is a signal for review, not proof of an attack. |
| `MULTIPLE_FACES_DETECTED` | Multiple faces detected | 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. |
| `LOW_FACE_QUALITY` | Low face quality | 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. |
| `LOW_FACE_LUMINANCE` | Low face luminance | The facial image is too dark, which may affect the accuracy of liveness detection. Better lighting conditions are recommended. |
| `HIGH_FACE_LUMINANCE` | High face luminance | The facial image is too bright or overexposed, which may affect the accuracy of liveness detection. Reduced lighting or avoiding direct light is recommended. |
| `AGE_BELOW_MINIMUM` | Age below minimum | The age of the face is below the minimum age threshold for the application. |
| `AGE_NOT_DETECTED` | Age not detected | The system couldn't identify the age of the face, which is necessary for document verification. |

## API autónoma de prova de vida passiva

A [API de Prova de Vida](https://docs.didit.me/pt/standalone-apis/passive-liveness.md) autónoma reutiliza os mesmos códigos de risco com algumas diferenças de comportamento:

* `NO_FACE_DETECTED` e `LOW_LIVENESS_SCORE` são mutuamente exclusivos — a verificação da pontuação só é executada quando um rosto é encontrado. `LOW_LIVENESS_SCORE` é acionado quando é atingido o `face_liveness_score_decline_threshold` do pedido (predefinição 30) e inclui sempre `log_type: "error"`.
* `POSSIBLE_FACE_IN_BLOCKLIST` é tratado como uma recusa (`log_type: "error"`) em vez de revisão.
* `MULTIPLE_FACES_DETECTED` inclui `log_type: "warning"`, enquanto os riscos de rostos duplicados permanecem informativos. Apenas os avisos de nível `error` alteram o `status` da resposta autónoma para `Declined`.
* As entradas de aviso autónomas incluem `feature`, mas não `node_id`.

## Exemplos

### Recusa automática em caso de ataque detetado

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

### Avisos configuráveis numa captura passiva

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

### Rosto duplicado com 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"
  }
]
```

Aqui, a ação de rosto duplicado está definida como Review, pelo que o aviso inclui `log_type: "warning"` e o estado do relatório de prova de vida é `In Review`. Com a predefinição (No action), incluiria `log_type: "information"`. `api_service` é `null` porque o rosto correspondente teve origem numa sessão de fluxo, e não numa chamada de API autónoma.

### Rosto duplicado sob um nome diferente

```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` mantém a sua própria ação configurada (aqui, No action — `log_type: "information"`), enquanto `DUPLICATED_FACE_NAME_MISMATCH` inclui a sua própria ação, cuja predefinição é Review (`log_type: "warning"`). O estado do relatório de prova de vida segue a mais grave das duas: neste caso, `In Review`, mesmo que a definição simples de rosto duplicado por si só não o tivesse sinalizado.

### Anomalia de integridade da gravação com as suas medições

```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 exemplo mostra a evidência de reprodução de uma gravação que contém três cópias de uma sequência em movimento. `log_type` é `information` porque a ação configurada é `NO_ACTION`. O diagnóstico de entrega de fotogramas, omitido deste exemplo por brevidade, não desencadeia a deteção.

## Tipos de aviso

A cada risco é atribuída uma gravidade com base na configuração da sua aplicação. As três gravidades são:

## Relacionado

* [Relatório de prova de vida](https://docs.didit.me/pt/core-technology/liveness/report-liveness.md) — esquema completo do relatório e estados.
* [Avisos de correspondência facial](https://docs.didit.me/pt/core-technology/face-match/warnings-face-match.md) — avisos complementares de correspondência facial 1:1.
* [Webhooks](https://docs.didit.me/pt/integration/webhooks.md) — `session.status.updated` inclui os avisos assim que o passo de prova de vida for concluído.
* [Modelos de dados — Verificação de prova de vida](https://docs.didit.me/pt/reference/data-models.md#verificação-de-prova-de-vida) — esquema canónico com todos os campos.
* [Modelos de dados — Objeto de aviso](https://docs.didit.me/pt/reference/data-models.md#objeto-de-aviso) — a estrutura de cada entrada em `warnings[]`.


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