> ## 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 advertencia de huella de dispositivo e IP

> Códigos de advertencia de dispositivo e IP de Didit: VPN/Tor, país distinto, listas de bloqueo, duplicados, dispositivos recuperados e IP esperada.

## Descripción general

El análisis de dispositivo e IP emite etiquetas de advertencia en `ip_analyses[].warnings[]` cada vez que detecta un comportamiento sospechoso del dispositivo, la red o la ubicación. Nueve etiquetas tienen una acción configurable (Rechazar / Revisar / Ninguna acción) por cada nodo del flujo de verificación (workflow); las dos etiquetas de lista de bloqueo siempre fuerzan `Declined`, y las dos etiquetas de lista de permitidos son siempre informativas. El `log_type` de cada advertencia refleja la acción aplicada: `error` (Rechazar), `warning` (Revisar) o `information` (Ninguna acción). Cada riesgo se activa como máximo una vez por sesión.

Cada riesgo que aparece a continuación está verificado con el pipeline de decisión en producción; las advertencias llevan la etiqueta de función `LOCATION` y la estructura estándar del [objeto de advertencia](https://docs.didit.me/es/reference/data-models.md#objeto-de-advertencia).

Las advertencias de huella digital del dispositivo se dividen intencionadamente en señales exactas y señales recuperadas:

* `DUPLICATED_DEVICE_FINGERPRINT` significa que la misma identidad determinista del dispositivo (`match_source` `persistent_id` o `legacy_fp`) se reutilizó en sesiones con distintos valores de `vendor_data`.
* `DEVICE_RECOVERED_HIGH_CONFIDENCE` significa que la recuperación de huella digital v2 asoció la sesión a un dispositivo visto anteriormente **después** de que cambiara el ID persistente (almacenamiento borrado, modo incógnito, reinstalación de la aplicación). La advertencia solo aparece cuando la coincidencia supera el umbral de similitud de alta confianza y los criterios estrictos.

![Ejemplo de advertencias del análisis de dispositivo e IP de Didit con alertas de dispositivo, VPN, proxy y discrepancia de ubicación](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)

## Advertencias generadas

| Riesgo | Causa | `log_type` | Afecta al estado | Corrección recomendada |
| - | - | - | - | - |
| `PRIVATE_NETWORK_DETECTED` | `is_vpn_or_tor` era `true`: la sesión se abrió a través de una VPN, un proxy o un nodo de salida de Tor. `additional_data` es `null`. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Decide si tu tolerancia al riesgo admite tráfico enmascarado. Si lo aceptas, déjalo en Sin acción. |
| `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | El país ISO del documento de identidad difiere del país obtenido a partir de la dirección IP. `additional_data` incluye ambos códigos ISO-3: `document_country_code`, `ip_country_code`. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Revisa cuando el usuario viaja de forma legítima. Rechaza cuando coincide con señales de VPN o de dispositivo duplicado. |
| `EXPECTED_IP_ADDRESS_MISMATCH` | La sesión se creó con una dirección IP esperada y la IP real es distinta. `additional_data` incluye `expected_ip_address` y `actual_ip_address`. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Úsalo cuando fijes la IP de antemano al crear la sesión. Rechaza la sesión o exige una autenticación reforzada si no coincide. |
| `IP_ADDRESS_IN_BLOCKLIST` | La dirección IP de la sesión coincide con una entrada de la lista de bloqueo de IP de la aplicación. `additional_data`: `ip_address`. | siempre `error` | Fuerza `Declined`. | Rechaza la sesión. Si es necesario, audita el origen de la lista de bloqueo para detectar falsos positivos. |
| `DEVICE_FINGERPRINT_IN_BLOCKLIST` | La huella digital del dispositivo de la sesión coincide con una entrada de la lista de bloqueo de dispositivos. `additional_data`: `device_fingerprint`. | siempre `error` | Fuerza `Declined`. | Rechaza la sesión. |
| `IP_ADDRESS_IN_ALLOWLIST` | La IP de la sesión tenía coincidencias duplicadas, pero está en la lista de permitidos de IP de la aplicación, por lo que se omitió la advertencia de IP duplicada. `additional_data`: `ip_address`. | siempre `information` | Ninguno. | Úsalo para NAT corporativos de confianza, redes de QA o puntos de acceso compartidos conocidos. |
| `DEVICE_FINGERPRINT_IN_ALLOWLIST` | La huella digital del dispositivo de la sesión tenía coincidencias duplicadas deterministas, pero está en la lista de permitidos de dispositivos, por lo que se omitió la advertencia de dispositivo duplicado. `additional_data`: `device_fingerprint`. | siempre `information` | Ninguno. | Úsalo solo para dispositivos compartidos de confianza. Las listas de bloqueo siguen teniendo prioridad. |
| `DUPLICATED_IP_ADDRESS` | La misma IP se usó en otra sesión con un `vendor_data` distinto. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`. Se omite cuando la IP está en la lista de permitidos. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Es habitual en NAT corporativos o compartidos. Combínalo con otras señales (dispositivo duplicado, discrepancia de país) antes de rechazar. |
| `DUPLICATED_DEVICE_FINGERPRINT` | La misma identidad determinista de dispositivo se reutilizó en sesiones con distinto `vendor_data`. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`persistent_id` o `legacy_fp`). Se omite cuando la huella digital está en la lista de permitidos. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Prueba sólida de abuso con múltiples cuentas. Revisa o rechaza según tu tolerancia al fraude. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | El modelo de recuperación de dispositivos v2 asoció la sesión con un dispositivo visto anteriormente con alta confianza, incluso después de que cambiara el ID persistente. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`recovered_high`), `recovery_similarity`, `recovery_match_device_uuid`. La lista de permitidos de dispositivos no lo suprime. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Empieza con Revisar, mide tu tasa de falsos positivos y después endurece la acción. Señal sólida de intentos de restablecer el almacenamiento o de usar el modo incógnito. |
| `DEVICE_LINKED_TO_LIVENESS_ATTACK` | El mismo dispositivo (identificado por su id persistente de dispositivo) se usó en una sesión anterior de otro usuario cuya captura de prueba de vida se consideró un ataque. Un dispositivo que ya se ha usado para atacar la prueba de vida es un indicio sólido de que esta captura procede del mismo atacante. `additional_data`: `liveness_attack_session_id`, `liveness_attack_session_number`, `liveness_attack_sessions_count`, `match_source` (`persistent_id`). | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Empieza con Revisar y mide tu tasa de falsos positivos antes de endurecer la acción a Rechazar. |
| `DEVICE_MODEL_INCONSISTENT` | El mismo dispositivo (identificado por su id persistente de dispositivo) se registró con un modelo de dispositivo distinto en una sesión anterior. Un dispositivo físico no cambia de modelo, así que es probable que se haya falseado el modelo notificado o que el identificador del dispositivo se haya copiado a otro dispositivo. Las cadenas de modelo genéricas nunca se comparan. `additional_data`: `device_model`, `earlier_device_model`, `earlier_session_id`, `earlier_session_number`, `match_source`. | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Sin acción). | Compara los dos modelos notificados y revisa la sesión anterior antes de actuar. |
| `IP_LOCATION_NOT_ALLOWED` | La geovalla por IP está activada y la IP de la sesión se encuentra en un país o estado/región marcado como no permitido. `additional_data`: `ip_country_code` (ISO-3), `ip_country`, `ip_state`, `restricted_by` (`country` o `state`). | refleja la acción configurada | Configurable: Rechazar / Revisar / Sin acción (predeterminado: Rechazar). | Úsalo para aplicar restricciones jurisdiccionales. Combínalo con `vpn_detection_action` para que el tráfico enmascarado no pueda eludir la geovalla. |

Cuando el dispositivo recuperado aún no tiene sesiones asociadas aptas (por lo que no hay nada en `matches[]`), `DEVICE_RECOVERED_HIGH_CONFIDENCE` se activa igualmente con una estructura alternativa de `additional_data`: `recovery_match_device_uuid`, `recovery_match_similarity`, `recovery_match_band`, `recovery_gate_reason`.

`IP_LOCATION_NOT_ALLOWED` se activa cuando la geovalla por IP está activada (`is_ip_geofencing_enabled`) y la IP de la sesión se encuentra en un país o estado/región marcado como no permitido en `ip_geofencing_by_country`. `additional_data` incluye `ip_country_code` (ISO-3), `ip_country`, `ip_state` y `restricted_by` (`country` o `state`). Las entradas de estado/región prevalecen sobre el indicador del país y se comparan, sin distinguir mayúsculas de minúsculas, con el nombre de región del proveedor de IP (p. ej., `"California"`); los países que no figuran en la configuración están permitidos.

## Integridad del dispositivo y del entorno de ejecución

Señales que reportan los SDK nativos y el cliente web y que describen el estado del dispositivo en el que se realizó la verificación. Su propósito es detectar ataques de inyección: un atacante capaz de rootear un dispositivo o de interceptar el proceso de la aplicación puede sustituir el flujo de la cámara antes de que llegue a los controles biométricos.

Cada una se puede configurar por flujo y tiene como valor predeterminado **Sin acción**, de modo que activar la función no cambia ninguna decisión hasta que decidas activarla.

| Riesgo | Causa | Clave de configuración | Valor predeterminado |
| - | - | - | - |
| `DEVICE_APP_TAMPERED` | La atestación de la plataforma no pudo verificar que la solicitud procediera de una compilación auténtica y sin modificar de la aplicación en un dispositivo auténtico. | `device_app_tampered_action` | `NO_ACTION` |
| `DEVICE_RUNTIME_HOOKING_DETECTED` | Se detectó un framework de instrumentación o de hooking en tiempo de ejecución (Frida, Xposed, LSPosed, Substrate) en el proceso de la aplicación. | `device_hooking_action` | `NO_ACTION` |
| `DEVICE_ROOTED_OR_JAILBROKEN` | El dispositivo muestra indicios de root o jailbreak, que eliminan las protecciones del sistema operativo que impiden interceptar la cámara. | `device_rooted_action` | `NO_ACTION` |
| `DEVICE_EMULATOR_DETECTED` | La sesión se originó en un emulador o simulador y no en un dispositivo físico. | `device_emulator_action` | `NO_ACTION` |
| `DEVICE_DEBUGGER_ATTACHED` | Había un depurador o un rastreador de procesos conectado a la aplicación durante la verificación. | `device_debugger_action` | `NO_ACTION` |
| `AUTOMATION_FRAMEWORK_DETECTED` | La sesión la controló un framework de automatización de navegadores o un navegador headless, no una persona. | `automation_detected_action` | `NO_ACTION` |
| `DEVICE_INTEGRITY_SIGNALS_MISSING` | El cliente reportó una versión del SDK compatible con el envío de señales de integridad, pero no llegó ninguna señal de integridad, lo que puede indicar que las señales se eliminaron durante la transmisión. | `device_integrity_missing_action` | `NO_ACTION` |

> [!NOTE]
>
> Cada comprobación se realiza en la medida de lo posible. Cuando una comprobación no puede ejecutarse, reporta **no determinado** en lugar de un resultado sin incidencias, de modo que una comprobación fallida nunca genera un falso positivo para un usuario legítimo. Las señales se reportan a partir de la versión **4.4.0** de los SDK nativos; las sesiones de SDK anteriores no envían nada, de forma legítima, y nunca generan `DEVICE_INTEGRITY_SIGNALS_MISSING`.

> [!WARNING]
>
> Las señales de root y de emulador son frecuentes entre usuarios legítimos con dispositivos modificados pero no fraudulentos. Empieza configurándolas en Revisión en lugar de Rechazo y vigila tu propia tasa de rechazo antes de endurecerlas.

## Opciones configurables

Controles del flujo de trabajo por nodo (también configurables de forma global en la configuración de verificación de la aplicación; todas las acciones tienen como valor predeterminado **Sin acción**, salvo que se indique lo contrario):

| Configuración | Controla | Valor predeterminado |
| - | - | - |
| `vpn_detection_action` | `PRIVATE_NETWORK_DETECTED` | Sin acción |
| `ip_mismatch_action` | `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | Sin acción |
| `expected_ip_mismatch_action` | `EXPECTED_IP_ADDRESS_MISMATCH` | Sin acción |
| `duplicated_ip_action` | `DUPLICATED_IP_ADDRESS` | Sin acción |
| `duplicated_device_action` | `DUPLICATED_DEVICE_FINGERPRINT` | Sin acción |
| `recovered_device_action` | `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Sin acción |
| `device_liveness_attack_history_action` | `DEVICE_LINKED_TO_LIVENESS_ATTACK` | Sin acción |
| `device_model_inconsistency_action` | `DEVICE_MODEL_INCONSISTENT` | Sin acción |
| `ip_geofencing_action` | `IP_LOCATION_NOT_ALLOWED` | Rechazo |

Las listas de permitidos de IP y de dispositivos suprimen únicamente la advertencia exacta de IP duplicada o la advertencia determinista de dispositivo duplicado para el valor permitido. No suprimen las advertencias de VPN/proxy, de discrepancia de país, de discrepancia con la IP esperada, de dispositivo recuperado ni de lista de bloqueo.

Las advertencias de dispositivo recuperado son útiles para detectar redes de fraude que rotan cuentas y sesiones desde el mismo hardware, pero Didit es conservador por diseño: el sistema prefiere pasar por alto algunos usuarios duplicados antes que fusionar dispositivos no relacionados cuando la evidencia no es lo bastante sólida. **Implementación recomendada**: empieza con Revisión, vigila el volumen durante dos semanas y después endurece la acción si tu tasa de falsos positivos es baja.

## Dispositivo duplicado frente a dispositivo recuperado

Trata las dos advertencias de forma distinta, ya que se activan con evidencias diferentes:

| Advertencia | Disparador | Significado habitual | Primera acción recomendada |
| - | - | - | - |
| `DUPLICATED_DEVICE_FINGERPRINT` | Coincidencia exacta de la identidad persistente del dispositivo (`persistent_id`) o del hash de huella heredado (`legacy_fp`). | Evidencia sólida de que el mismo dispositivo aparece en distintos usuarios. | Revisar o rechazar, según tu tolerancia al fraude. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Recuperación v2 de alta confianza (`recovered_high`) después de que cambiaran el almacenamiento, la sesión o la identidad de la aplicación. | Señal sólida de intentos con modo incógnito, borrado del almacenamiento o reinstalación de la aplicación. Se separa intencionadamente para que puedas monitorizarla de forma independiente. | Primero, revisa; después, aplica criterios más estrictos tras medir tu tasa de falsos positivos. |

## Coincidencias entre sesiones

Cuando se detecta la misma dirección IP, la misma identidad exacta del dispositivo o el mismo dispositivo recuperado en sesiones que pertenecen a **usuarios distintos**, Didit las registra como `matches[]` en `ip_analyses[]`. Las sesiones se agrupan por `vendor_data`: las sesiones con el mismo `vendor_data` se tratan como un mismo usuario y se excluyen de las coincidencias. Sin `vendor_data`, cada sesión se trata como un usuario único y se muestran todos los posibles duplicados, así que te recomendamos encarecidamente enviar siempre `vendor_data` para reducir el ruido.

Cada coincidencia incluye:

* `session_id`, `session_number`, `vendor_data` y `verification_date` de la sesión coincidente, además de su `status` del ciclo de vida y `api_service` (`null` en las sesiones de flujo); `source` siempre es `session`
* `match_type`: `ip_address` o `device_fingerprint`
* `match_source`: `ip_address`, `persistent_id`, `legacy_fp` o `recovered_high`
* `matched_value`: la IP compartida, el identificador del dispositivo o (en las coincidencias de dispositivos recuperados) el UUID del dispositivo recuperado
* `confidence` (0–1, `1 - P(false positive)`) y `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 adicionales de dispositivo recuperado cuando `match_source` es `recovered_high`: `recovery_similarity`, `tls_ja4_corroborated`, `recovery_gate_reason`

Las coincidencias de IP y las de dispositivo tienen un límite de 5 cada una (como máximo 10 entradas). Consulta la [página del informe](https://docs.didit.me/es/core-technology/ip-analysis/report-ip-analysis.md#semántica-de-las-coincidencias) para ver el esquema completo de las coincidencias y el modelo de confianza.

## Ejemplos

### VPN + discrepancia de país (configurado como En revisión)

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

### Coincidencia en la lista de bloqueo (fuerza el rechazo)

```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 con confianza alta (configurado como En revisión)

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

## Relacionado

* [Informe de análisis de dispositivo e IP](https://docs.didit.me/es/core-technology/ip-analysis/report-ip-analysis.md): estructura completa de la respuesta y significado de los estados
* [Visión general del análisis de dispositivo e IP](https://docs.didit.me/es/core-technology/ip-analysis/overview.md): qué mide cada bloque
* [Modelos de datos: análisis de IP](https://docs.didit.me/es/reference/data-models.md#análisis-de-ip): esquema canónico
* [Webhooks](https://docs.didit.me/es/integration/webhooks.md): `status.updated` incluye las advertencias del análisis de IP

### Tipos de advertencia


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