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

# Códigos de aviso de fingerprint de dispositivo e IP

> Todos os códigos de aviso da análise de dispositivo e IP da Didit: VPN/Tor, país divergente, listas de bloqueio, IP/dispositivo duplicado e mais.

## Visão geral

A Análise de dispositivo e IP emite tags de aviso em `ip_analyses[].warnings[]` sempre que detecta um comportamento suspeito de dispositivo, rede ou localização. Nove tags têm uma ação configurável (Recusar / Revisão / Nenhuma ação) por nó do fluxo de verificação (workflow); as duas tags de lista de bloqueio sempre forçam `Declined`, e as duas tags de lista de permissões são sempre informativas. O `log_type` de cada aviso reflete a ação aplicada: `error` (Recusar), `warning` (Revisão) ou `information` (Nenhuma ação). Cada risco é disparado no máximo uma vez por sessão.

Cada risco abaixo é verificado no pipeline de decisão em produção; os avisos trazem a tag de recurso `LOCATION` e o formato padrão do [objeto de aviso](https://docs.didit.me/pt-br/reference/data-models.md#objeto-de-aviso).

Os avisos de impressão digital do dispositivo são divididos intencionalmente em sinais exatos e sinais de recuperação:

* `DUPLICATED_DEVICE_FINGERPRINT` significa que a mesma identidade determinística do dispositivo (`match_source` `persistent_id` ou `legacy_fp`) foi reutilizada em sessões com valores diferentes de `vendor_data`.
* `DEVICE_RECOVERED_HIGH_CONFIDENCE` significa que a recuperação de impressão digital v2 associou a sessão a um dispositivo já visto **depois** que o ID persistente mudou (dados de armazenamento apagados, modo anônimo, reinstalação do app). O aviso só aparece quando a correspondência passa pelo limiar de similaridade de alta confiança e pelos critérios obrigatórios.

![Exemplo de aviso da Análise de dispositivo e IP da Didit com alertas de dispositivo, VPN, proxy e divergência de localização](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/ip-analysis-warning-example.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=370f87af45a6138ebd7454abe9131665)

## Avisos gerados

| Risco | Causa | `log_type` | Afeta o status | Ação recomendada |
| - | - | - | - | - |
| `PRIVATE_NETWORK_DETECTED` | `is_vpn_or_tor` era `true`: a sessão foi aberta por VPN, proxy ou nó de saída Tor. `additional_data` é `null`. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Decida se a sua tolerância a risco permite tráfego mascarado. Se você aceitar, deixe em Nenhuma ação. |
| `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | O país ISO do documento de identidade é diferente do país obtido a partir do endereço IP. `additional_data` traz os dois códigos ISO-3: `document_country_code`, `ip_country_code`. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Envie para revisão quando o usuário viaja legitimamente. Recuse quando vier acompanhado de sinais de VPN ou de dispositivo duplicado. |
| `EXPECTED_IP_ADDRESS_MISMATCH` | A sessão foi criada com um endereço IP esperado, e o IP atual é diferente. `additional_data` traz `expected_ip_address` e `actual_ip_address`. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Use quando você fixa o IP previamente na criação da sessão. Recuse a sessão ou exija autenticação adicional em caso de divergência. |
| `IP_ADDRESS_IN_BLOCKLIST` | O endereço IP da sessão corresponde a uma entrada na lista de bloqueio de IPs da aplicação. `additional_data`: `ip_address`. | sempre `error` | Força `Declined`. | Rejeite a sessão. Se necessário, audite a origem da lista de bloqueio em busca de falsos positivos. |
| `DEVICE_FINGERPRINT_IN_BLOCKLIST` | A impressão digital do dispositivo da sessão corresponde a uma entrada na lista de bloqueio de dispositivos. `additional_data`: `device_fingerprint`. | sempre `error` | Força `Declined`. | Rejeite a sessão. |
| `IP_ADDRESS_IN_ALLOWLIST` | O IP da sessão teve correspondências duplicadas, mas está na lista de permissões de IPs da aplicação, então o aviso de IP duplicado foi ignorado. `additional_data`: `ip_address`. | sempre `information` | Nenhum. | Use para NATs corporativos confiáveis, redes de QA ou pontos de acesso compartilhados conhecidos. |
| `DEVICE_FINGERPRINT_IN_ALLOWLIST` | A impressão digital do dispositivo da sessão teve correspondências duplicadas determinísticas, mas está na lista de permissões de dispositivos, então o aviso de dispositivo duplicado foi ignorado. `additional_data`: `device_fingerprint`. | sempre `information` | Nenhum. | Use apenas para dispositivos compartilhados confiáveis. As listas de bloqueio continuam tendo prioridade. |
| `DUPLICATED_IP_ADDRESS` | O mesmo IP foi usado em outra sessão com um `vendor_data` diferente. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`. Ignorado quando o IP está na lista de permissões. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Comum em NAT corporativo ou compartilhado. Combine com outros sinais (dispositivo duplicado, divergência de país) antes de recusar. |
| `DUPLICATED_DEVICE_FINGERPRINT` | A mesma identidade determinística de dispositivo foi reutilizada em sessões com `vendor_data` diferentes. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`persistent_id` ou `legacy_fp`). Ignorado quando a impressão digital está na lista de permissões. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Forte evidência de abuso com várias contas. Envie para revisão ou recuse, conforme a sua tolerância a fraude. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | O modelo de recuperação de dispositivos v2 associou a sessão a um dispositivo já visto com alta confiança, mesmo após a mudança do ID persistente. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`recovered_high`), `recovery_similarity`, `recovery_match_device_uuid`. Não é suprimido pela lista de permissões de dispositivos. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Comece com Revisão, meça sua taxa de falsos positivos e depois torne a ação mais rígida. Sinal forte de tentativas de limpeza do armazenamento ou de uso do modo anônimo. |
| `DEVICE_LINKED_TO_LIVENESS_ATTACK` | O mesmo dispositivo (identificado pelo seu ID de dispositivo persistente) foi usado em uma sessão anterior de outro usuário cuja captura de prova de vida foi classificada como ataque. Um dispositivo já usado para atacar a verificação de prova de vida é um forte indício de que esta captura vem do mesmo atacante. `additional_data`: `liveness_attack_session_id`, `liveness_attack_session_number`, `liveness_attack_sessions_count`, `match_source` (`persistent_id`). | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Comece com Revisão e meça sua taxa de falsos positivos antes de passar para Recusar. |
| `DEVICE_MODEL_INCONSISTENT` | O mesmo dispositivo (identificado pelo seu ID de dispositivo persistente) foi informado como outro modelo de dispositivo em uma sessão anterior. Um dispositivo físico não muda de modelo, então o modelo informado provavelmente foi falsificado, ou o identificador do dispositivo foi copiado para outro dispositivo. Nomes de modelo genéricos nunca são comparados. `additional_data`: `device_model`, `earlier_device_model`, `earlier_session_id`, `earlier_session_number`, `match_source`. | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Nenhuma ação). | Compare os dois modelos informados e revise a sessão anterior antes de agir. |
| `IP_LOCATION_NOT_ALLOWED` | O geofencing por IP está ativado e o IP da sessão está localizado em um país ou estado/região marcado como não permitido. `additional_data`: `ip_country_code` (ISO-3), `ip_country`, `ip_state`, `restricted_by` (`country` ou `state`). | segue a ação configurada | Configurável: Recusar / Revisão / Nenhuma ação (padrão: Recusar). | Use para aplicar restrições jurisdicionais. Combine com `vpn_detection_action` para que o tráfego mascarado não consiga contornar a restrição geográfica. |

Quando o dispositivo recuperado ainda não tem sessões relacionadas elegíveis (portanto `matches[]` permanece vazio), `DEVICE_RECOVERED_HIGH_CONFIDENCE` é gerado mesmo assim, com um formato alternativo de `additional_data`: `recovery_match_device_uuid`, `recovery_match_similarity`, `recovery_match_band`, `recovery_gate_reason`.

`IP_LOCATION_NOT_ALLOWED` é gerado quando o geofencing por IP está ativado (`is_ip_geofencing_enabled`) e o IP da sessão está localizado em um país ou estado/região marcado como não permitido em `ip_geofencing_by_country`. `additional_data` traz `ip_country_code` (ISO-3), `ip_country`, `ip_state` e `restricted_by` (`country` ou `state`). As entradas de estado/região têm prioridade sobre a configuração do país e são comparadas, sem diferenciar maiúsculas de minúsculas, com o nome da região informado pelo provedor de IP (por exemplo, `"California"`). Países que não constam na configuração são permitidos.

## Integridade do dispositivo e do ambiente de execução

Sinais reportados pelos SDKs nativos e pelo cliente web que descrevem o estado do dispositivo em que a verificação foi executada. Eles existem para detectar ataques de injeção: um invasor capaz de fazer root em um dispositivo ou de interceptar o processo do app pode substituir o feed da câmera antes que ele chegue às verificações biométricas.

Cada um é configurável por fluxo e tem como padrão **Sem ação**, de modo que ativar o recurso não altera nenhuma decisão até que você opte por isso.

| Risco | Causa | Chave de configuração | Padrão |
| - | - | - | - |
| `DEVICE_APP_TAMPERED` | A atestação da plataforma não conseguiu confirmar que a requisição veio de uma build genuína e não modificada da aplicação em um dispositivo genuíno. | `device_app_tampered_action` | `NO_ACTION` |
| `DEVICE_RUNTIME_HOOKING_DETECTED` | Um framework de instrumentação ou de hooking em tempo de execução (Frida, Xposed, LSPosed, Substrate) foi detectado no processo da aplicação. | `device_hooking_action` | `NO_ACTION` |
| `DEVICE_ROOTED_OR_JAILBROKEN` | O dispositivo apresenta indícios de root ou jailbreak, que removem as proteções do sistema operacional que impedem a interceptação da câmera. | `device_rooted_action` | `NO_ACTION` |
| `DEVICE_EMULATOR_DETECTED` | A sessão foi originada em um emulador ou simulador, e não em um dispositivo físico. | `device_emulator_action` | `NO_ACTION` |
| `DEVICE_DEBUGGER_ATTACHED` | Um depurador ou rastreador de processos estava anexado à aplicação durante a verificação. | `device_debugger_action` | `NO_ACTION` |
| `AUTOMATION_FRAMEWORK_DETECTED` | A sessão foi conduzida por um framework de automação de navegador ou por um navegador headless, e não por uma pessoa. | `automation_detected_action` | `NO_ACTION` |
| `DEVICE_INTEGRITY_SIGNALS_MISSING` | O cliente informou uma versão do SDK que oferece suporte ao envio de sinais de integridade, mas nenhum sinal de integridade chegou, o que pode indicar que os sinais foram removidos no trajeto. | `device_integrity_missing_action` | `NO_ACTION` |

> [!NOTE]
>
> Cada verificação é feita em caráter de melhor esforço. Quando uma verificação não pode ser executada, ela reporta **não determinado** em vez de um resultado sem indícios, de modo que uma verificação com falha nunca gera um falso positivo contra um usuário legítimo. Os sinais são reportados a partir do SDK nativo **4.4.0**; sessões de SDKs anteriores legitimamente não enviam nada e nunca geram `DEVICE_INTEGRITY_SIGNALS_MISSING`.

> [!WARNING]
>
> Sinais de root e de emulador são comuns entre usuários legítimos com dispositivos modificados, mas não fraudulentos. Comece configurando-os como Revisão em vez de Recusa e acompanhe sua própria taxa de recusa antes de torná-los mais rígidos.

## Configurações disponíveis

Controles do fluxo por nó (também configuráveis globalmente nas configurações de verificação da aplicação; toda ação tem como padrão **Sem ação**, salvo indicação em contrário):

| Configuração | Controla | Padrão |
| - | - | - |
| `vpn_detection_action` | `PRIVATE_NETWORK_DETECTED` | Sem ação |
| `ip_mismatch_action` | `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | Sem ação |
| `expected_ip_mismatch_action` | `EXPECTED_IP_ADDRESS_MISMATCH` | Sem ação |
| `duplicated_ip_action` | `DUPLICATED_IP_ADDRESS` | Sem ação |
| `duplicated_device_action` | `DUPLICATED_DEVICE_FINGERPRINT` | Sem ação |
| `recovered_device_action` | `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Sem ação |
| `device_liveness_attack_history_action` | `DEVICE_LINKED_TO_LIVENESS_ATTACK` | Sem ação |
| `device_model_inconsistency_action` | `DEVICE_MODEL_INCONSISTENT` | Sem ação |
| `ip_geofencing_action` | `IP_LOCATION_NOT_ALLOWED` | Recusar |

As listas de permissão de IP e de dispositivo suprimem apenas o aviso de IP duplicado com correspondência exata ou o aviso determinístico de dispositivo duplicado para o valor incluído na lista. Elas não suprimem avisos de VPN/proxy, de divergência de país, de divergência de IP esperado, de dispositivo recuperado nem de lista de bloqueio.

Os avisos de dispositivo recuperado são úteis para detectar redes de fraude que alternam contas e sessões a partir do mesmo hardware, mas a Didit é conservadora por concepção: o sistema prefere deixar de identificar alguns usuários duplicados a mesclar dispositivos não relacionados quando as evidências não são fortes o suficiente. **Implantação recomendada**: comece com Revisão, acompanhe o volume por duas semanas e, depois, torne a ação mais rígida se sua taxa de falsos positivos for baixa.

## Dispositivo duplicado vs. dispositivo recuperado

Trate os dois avisos de forma diferente, pois eles são acionados por evidências distintas:

| Aviso | Gatilho | Significado típico | Primeira ação recomendada |
| - | - | - | - |
| `DUPLICATED_DEVICE_FINGERPRINT` | Correspondência exata da identidade persistente do dispositivo (`persistent_id`) ou do hash de fingerprint legado (`legacy_fp`). | Evidência forte de que o mesmo dispositivo aparece em usuários diferentes. | Revisar ou recusar, dependendo da sua tolerância a fraudes. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Recuperação v2 de alta confiança (`recovered_high`) após mudança no armazenamento, na sessão ou na identidade do app. | Sinal forte de tentativas em modo anônimo, redefinição de armazenamento ou reinstalação do app. Separado intencionalmente para que você possa monitorá-lo de forma independente. | Faça uma revisão primeiro e, depois, adote critérios mais rigorosos após medir sua taxa de falsos positivos. |

## Correspondências entre sessões

Quando o mesmo endereço IP, a mesma identidade exata de dispositivo ou um dispositivo recuperado é detectado em sessões pertencentes a **usuários diferentes**, a Didit registra essas ocorrências como `matches[]` em `ip_analyses[]`. As sessões são agrupadas por `vendor_data`: sessões com o mesmo `vendor_data` são tratadas como do mesmo usuário e excluídas das correspondências. Sem `vendor_data`, cada sessão é tratada como de um usuário único e todas as possíveis duplicatas são exibidas. Recomendamos fortemente sempre informar `vendor_data` para reduzir o ruído.

Cada correspondência inclui:

* `session_id`, `session_number`, `vendor_data` e `verification_date` da sessão correspondente, além do seu `status` de ciclo de vida e de `api_service` (`null` para sessões de workflow); `source` é sempre `session`
* `match_type`: `ip_address` ou `device_fingerprint`
* `match_source`: `ip_address`, `persistent_id`, `legacy_fp` ou `recovered_high`
* `matched_value`: o IP compartilhado, o identificador do dispositivo ou (para correspondências recuperadas) o UUID do dispositivo recuperado
* `confidence` (0–1, `1 - P(false positive)`) e `match_mode` (`deterministic` / `probabilistic` / `co_occurrence`)
* `device_info`: `device_brand`, `device_model`, `browser_family`, `os_family`, `platform`, `device_fingerprint`
* `location_info`: `ip_address`, `ip_country`, `ip_country_code`, `ip_state`, `ip_city`, `is_vpn_or_tor`, `is_data_center`
* Campos extras de dispositivo recuperado quando `match_source` é `recovered_high`: `recovery_similarity`, `tls_ja4_corroborated`, `recovery_gate_reason`

As correspondências por IP e por dispositivo são limitadas a 5 cada (no máximo 10 entradas). Consulte a [página do relatório](https://docs.didit.me/pt-br/core-technology/ip-analysis/report-ip-analysis.md#semântica-das-correspondências) para ver o esquema completo de correspondências e o modelo de confiança.

## Exemplos

### VPN + divergência de país (configurado para Revisão)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "PRIVATE_NETWORK_DETECTED",
      "additional_data": null,
      "log_type": "warning",
      "short_description": "Private network (VPN/Tor) detected",
      "long_description": "The system detected that the user tried to use a private network (VPN/TOR) to complete the verification process.",
      "node_id": "ip-1"
    },
    {
      "feature": "LOCATION",
      "risk": "COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP",
      "additional_data": { "document_country_code": "ESP", "ip_country_code": "NLD" },
      "log_type": "warning",
      "short_description": "Document country does not match IP country",
      "long_description": "The country from the document does not match the country from the IP address, suggesting a potential mismatch between the document and the user's location.",
      "node_id": "ip-1"
    }
  ]
}
```

### Correspondência na lista de bloqueio (força a recusa)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "IP_ADDRESS_IN_BLOCKLIST",
      "additional_data": { "ip_address": "45.61.20.5" },
      "log_type": "error",
      "short_description": "IP address in blocklist",
      "long_description": "The IP address used for this session was found in the application's IP blocklist, indicating a known suspicious or forbidden origin.",
      "node_id": "ip-1"
    }
  ]
}
```

### Dispositivo recuperado com alta confiança (configurado para Revisão)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "DEVICE_RECOVERED_HIGH_CONFIDENCE",
      "additional_data": {
        "duplicated_session_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
        "duplicated_session_number": 5101,
        "api_service": null,
        "match_source": "recovered_high",
        "recovery_similarity": 0.9874,
        "recovery_match_device_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
      },
      "log_type": "warning",
      "short_description": "Device matches a previously seen device with high confidence",
      "long_description": "A previously seen device matched this session with high confidence through v2 fuzzy fingerprint recovery after passing strict hard gates, indicating the same physical device under a fresh persistent_id.",
      "node_id": "ip-1"
    }
  ]
}
```

## Relacionados

* [Relatório de Análise de dispositivo e IP](https://docs.didit.me/pt-br/core-technology/ip-analysis/report-ip-analysis.md): formato completo da resposta e semântica dos status
* [Visão geral da Análise de dispositivo e IP](https://docs.didit.me/pt-br/core-technology/ip-analysis/overview.md): o que cada bloco mede
* [Modelos de dados: análise de IP](https://docs.didit.me/pt-br/reference/data-models.md#análise-de-ip): esquema canônico
* [Webhooks](https://docs.didit.me/pt-br/integration/webhooks.md): `status.updated` inclui os avisos da análise de IP

### Tipos de aviso


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