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

# Rapport d'analyse de l'appareil et de l'IP

> Analysez le rapport Didit d'analyse de l'appareil et de l'IP : géolocalisation, détection VPN/proxy, empreinte et doublons d'appareils.

## Vue d'ensemble

L'analyse de l'appareil et de l'IP établit le profil de chaque session par géolocalisation IP, empreinte d'appareil, navigateur/système d'exploitation et type de réseau.
La géolocalisation, l'enrichissement des risques réseau, la mise en correspondance d'appareils et les vérifications d'intégrité de l'appareil à distance s'exécutent de manière asynchrone pendant que l'utilisateur effectue la vérification.
Les observations sur l'appareil et l'IP restent disponibles pendant que l'analyse est en cours ; les champs de géolocalisation peuvent être vides jusqu'à la réception des résultats, ou lorsque l'adresse n'est pas publique.
Si votre workflow utilise ces vérifications pour déterminer l'issue ou sélectionner une étape ultérieure, la session reste `In Progress` jusqu'à ce que les résultats requis soient disponibles.
Si l'analyse requise reste indisponible après un nombre limité de tentatives, la session passe à `In Review` pour une décision manuelle.
Les échecs d'enrichissement facultatifs n'empêchent pas la finalisation, et les décisions manuelles prévalent toujours.
Elle produit :

* Un bloc de **géolocalisation IP** (pays, État, ville, latitude/longitude, fuseau horaire) déduit de l'IP publique.
* Des **indicateurs de risque réseau** — `is_vpn_or_tor` et `is_data_center` — pour détecter les tentatives de dissimulation (VPN, nœuds de sortie Tor, hébergeurs, anonymiseurs).
* Des **calculs de distance entre documents** — la distance à vol d'oiseau en km entre l'emplacement de l'IP, l'emplacement du document d'identité et l'emplacement du justificatif de domicile.
* Des **correspondances entre sessions** — lorsque la même adresse IP ou identité d'appareil apparaît sur différentes sessions appartenant à des utilisateurs distincts (regroupés par `vendor_data`).
* Une **récupération d'empreinte d'appareil** — un signal de récupération avec un niveau de confiance élevé qui lie les sessions même après que l'utilisateur a vidé son stockage, est passé en mode navigation privée ou a réinstallé l'application.

![Capture d'écran du rapport d'analyse d'appareil et d'IP de Didit avec géolocalisation, empreinte d'appareil et indicateurs de risque](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/ip-analysis-report.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=5d4877664a7c89384ee32d4a5cb6949b)

## Où elle apparaît dans les réponses d'API

L'endpoint de décision renvoie l'analyse de l'appareil et de l'IP sous la forme du tableau **`ip_analyses[]`** dans `GET /v3/session/{sessionId}/decision/`. Les entrées sont des observations `Location` dédupliquées, identifiées par (`node_id`, `ip_address`, `device_fingerprint`) — un même nœud peut générer plusieurs entrées lorsque l'IP ou l'appareil de l'utilisateur change en cours de session.

```text theme={null}
GET /v3/session/{sessionId}/decision/
  ──▶ { "ip_analyses": [ { status, node_id, ip_address, ip, id_document, poa_document, warnings, matches, … }, … ] }
```

La structure ci-dessous reflète le schéma canonique — voir [Modèles de données](https://docs.didit.me/fr/reference/data-models.md#analyse-de-l’ip).

## Schéma

Consultez [Analyse de l'appareil et de l'IP dans la référence des modèles de données](https://docs.didit.me/fr/reference/data-models.md#analyse-de-l’ip) pour le schéma canonique.

```typescript theme={null}
interface IPAnalysisV3 {
  status: 'Not Finished' | 'Approved' | 'Declined' | 'In Review' | 'Resub Requested';
  node_id: string | null;

  // Device
  device_brand: string | null;
  device_model: string | null;
  browser_family: string | null;
  os_family: string | null;
  platform: 'mobile' | 'tablet' | 'desktop' | null;
  device_fingerprint: string | null;

  // IP geolocation
  ip_country: string | null;
  ip_country_code: string | null;           // ISO 3166-1 alpha-2
  ip_state: string | null;
  ip_city: string | null;
  latitude: number | null;
  longitude: number | null;
  ip_address: string;
  isp: string | null;
  organization: string | null;
  is_vpn_or_tor: boolean;
  is_data_center: boolean;
  time_zone: string | null;
  time_zone_offset: string | null;

  // Distance blocks — each carries its own location + distances to the other two
  ip: {
    location: { latitude: number; longitude: number } | null;
    distance_from_id_document: number | null;   // km
    distance_from_poa_document: number | null;  // km
  };
  id_document: {
    location: { latitude: number; longitude: number } | null;
    distance_from_ip: number | null;
    distance_from_poa_document: number | null;
  };
  poa_document: {
    location: { latitude: number; longitude: number } | null;
    distance_from_ip: number | null;
    distance_from_id_document: number | null;
  };

  warnings: Warning[];          // see Data Models — Warning object

  // Cross-session matches — up to 5 IP matches + 5 device matches
  matches: IPAnalysisMatch[];
}

interface IPAnalysisMatch {
  session_id: string;                       // matching session UUID
  session_number: number;
  vendor_data: string | null;
  verification_date: string | null;         // "YYYY-MM-DDTHH:MM:SSZ"
  match_type: 'ip_address' | 'device_fingerprint';
  match_source: 'ip_address' | 'persistent_id' | 'legacy_fp' | 'recovered_high';
  matched_value: string | null;             // shared IP, device identifier, or recovered device UUID
  status: string;                           // lifecycle status of the matching session
  is_blocklisted: boolean;                  // currently always false
  api_service: string | null;               // standalone API service; null for workflow sessions
  source: 'session';
  device_info: {
    device_brand: string | null;
    device_model: string | null;
    browser_family: string | null;
    os_family: string | null;
    platform: string | null;
    device_fingerprint: string | null;
  };
  location_info: {
    ip_address: string | null;
    ip_country: string | null;
    ip_country_code: string | null;
    ip_state: string | null;
    ip_city: string | null;
    is_vpn_or_tor: boolean;
    is_data_center: boolean;
  };
  confidence: number;                       // 0–1, = 1 - P(false positive)
  match_mode: 'deterministic' | 'probabilistic' | 'co_occurrence';

  // Present only when match_source = 'recovered_high'
  recovery_similarity?: number;             // cosine similarity, 4 decimals
  tls_ja4_corroborated?: boolean;           // TLS JA4 fingerprints of both observations agree
  recovery_gate_reason?: string;            // e.g. 'hardware_root_match'
}
```

### Sémantique des correspondances

`match_source` indique la manière dont la correspondance a été établie, et `confidence` évalue la probabilité qu'elle soit *erronée* (`confidence = 1 - P(false positive)`) :

| `match_source` | Signification | `confidence` | `match_mode` |
| - | - | - | - |
| `ip_address` | IP partagée — colocalisation réseau, jamais une affirmation d'identité d'appareil. | `0.0` | `co_occurrence` |
| `persistent_id` | Identifiant d'appareil persistant stocké exact. | `1.0` | `deterministic` |
| `legacy_fp` | Hachage d'empreinte d'appareil hérité `didit-fp-*`. | `0.5` | `probabilistic` |
| `recovered_high` | Résultat de récupération approximative d'empreinte avec un niveau de confiance élevé après des contrôles stricts et bloquants. | `1.0` si ancré dans le matériel, sinon `< 1.0`, augmenté lorsque TLS JA4 et le pays de l'IP concordent de manière indépendante | `deterministic` ou `probabilistic` |

Les candidats de récupération à plus faible niveau de confiance apparaissent uniquement sous forme d'avertissements de risque — jamais dans `matches[]`. Les correspondances IP et les correspondances d'appareil sont limitées à 5 chacune, de sorte que le tableau contient au maximum 10 entrées.

## Valeurs de statut

Les statuts sont des valeurs `FeatureStatusChoices` au niveau de la fonctionnalité. Chaque avertissement déclenché correspond à l'action configurée pour celui-ci sur le nœud du workflow ; l'action la plus stricte l'emporte.

| Valeur | Signification |
| - | - |
| `Not Finished` | Le nœud d'analyse IP ne s'est pas terminé pour cette session (par défaut). |
| `Approved` | Aucun avertissement ne s'est déclenché, ou chaque avertissement déclenché est configuré sur Aucune action. |
| `In Review` | Au moins un avertissement déclenché est configuré sur Examen (voir les [avertissements](https://docs.didit.me/fr/core-technology/ip-analysis/warnings-ip-analysis.md)). |
| `Declined` | Un avertissement de liste de blocage s'est déclenché (`IP_ADDRESS_IN_BLOCKLIST` ou `DEVICE_FINGERPRINT_IN_BLOCKLIST` — entraînant toujours un refus), ou un avertissement configurable est défini sur Refuser pour votre workflow. |
| `Resub Requested` | Un réviseur a demandé la resoumission de cette étape. |

Des règles de statut personnalisées configurées sur le nœud d'analyse IP peuvent également ajuster le statut résultant.

## Détection de VPN, proxy et Tor

`is_vpn_or_tor` et `is_data_center` sont des indicateurs booléens indépendants renvoyés pour chaque session. Lorsque `is_vpn_or_tor` vaut `true`, Didit émet également l'avertissement `PRIVATE_NETWORK_DETECTED` afin que votre équipe puisse agir en conséquence via la configuration du workflow. Le trafic provenant uniquement d'un centre de données (sans VPN/Tor) définit `is_data_center=true` sans déclencher d'avertissement automatique — utilisez-le comme signal supplémentaire dans votre propre notation.

## Exemples

### Approuvé

```json theme={null}
{
  "ip_analyses": [
    {
      "status": "Approved",
      "node_id": "ip-1",
      "device_brand": "Apple",
      "device_model": "iPhone",
      "browser_family": "Mobile Safari",
      "os_family": "iOS",
      "platform": "mobile",
      "device_fingerprint": "didit-fp-8d2c7a91f4b3e042",
      "ip_country": "Spain",
      "ip_country_code": "ES",
      "ip_state": "Barcelona",
      "ip_city": "Barcelona",
      "latitude": 41.4022,
      "longitude": 2.1407,
      "ip_address": "83.50.226.71",
      "isp": "Telefonica",
      "organization": "Telefonica de Espana",
      "is_vpn_or_tor": false,
      "is_data_center": false,
      "time_zone": "Europe/Madrid",
      "time_zone_offset": "+0100",
      "ip": {
        "location": { "latitude": 41.4022, "longitude": 2.1407 },
        "distance_from_id_document": 23.4,
        "distance_from_poa_document": 12.3
      },
      "id_document": {
        "location": { "latitude": 41.2706, "longitude": 1.9770 },
        "distance_from_ip": 23.4,
        "distance_from_poa_document": 18.7
      },
      "poa_document": {
        "location": { "latitude": 41.3128, "longitude": 2.0540 },
        "distance_from_ip": 12.3,
        "distance_from_id_document": 18.7
      },
      "warnings": [],
      "matches": []
    }
  ]
}
```

### Refusé — détection dans la liste de blocage IP + VPN + appareil en double

```json theme={null}
{
  "ip_analyses": [
    {
      "status": "Declined",
      "node_id": "ip-1",
      "device_brand": null,
      "device_model": null,
      "browser_family": "Chrome",
      "os_family": "Linux",
      "platform": "desktop",
      "device_fingerprint": "didit-fp-a13c0d22e8b94471",
      "ip_country": "Netherlands",
      "ip_country_code": "NL",
      "ip_state": "North Holland",
      "ip_city": "Amsterdam",
      "latitude": 52.3676,
      "longitude": 4.9041,
      "ip_address": "45.61.20.5",
      "isp": "Example Hosting",
      "organization": "Example Hosting BV",
      "is_vpn_or_tor": true,
      "is_data_center": true,
      "time_zone": "Europe/Amsterdam",
      "time_zone_offset": "+0100",
      "ip": {
        "location": { "latitude": 52.3676, "longitude": 4.9041 },
        "distance_from_id_document": 1834.2,
        "distance_from_poa_document": 1822.5
      },
      "id_document": {
        "location": { "latitude": 40.4168, "longitude": -3.7038 },
        "distance_from_ip": 1834.2,
        "distance_from_poa_document": 14.0
      },
      "poa_document": {
        "location": { "latitude": 40.5070, "longitude": -3.6720 },
        "distance_from_ip": 1822.5,
        "distance_from_id_document": 14.0
      },
      "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"
        },
        {
          "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"
        },
        {
          "feature": "LOCATION",
          "risk": "DUPLICATED_DEVICE_FINGERPRINT",
          "additional_data": {
            "duplicated_session_id": "11111111-2222-3333-4444-555555555555",
            "duplicated_session_number": 1042,
            "api_service": null,
            "match_source": "persistent_id"
          },
          "log_type": "warning",
          "short_description": "Duplicated device fingerprint from another session",
          "long_description": "The same device fingerprint was detected in another session with a different vendor_data, which may indicate multiple identities verified from the same device.",
          "node_id": "ip-1"
        }
      ],
      "matches": [
        {
          "session_id": "11111111-2222-3333-4444-555555555555",
          "session_number": 1042,
          "vendor_data": "user-other",
          "verification_date": "2026-05-28T14:03:21Z",
          "match_type": "device_fingerprint",
          "match_source": "persistent_id",
          "matched_value": "pid_9f1c2b7a8d3e4f50",
          "status": "Declined",
          "is_blocklisted": false,
          "api_service": null,
          "source": "session",
          "device_info": {
            "device_brand": null,
            "device_model": null,
            "browser_family": "Chrome",
            "os_family": "Linux",
            "platform": "desktop",
            "device_fingerprint": "didit-fp-a13c0d22e8b94471"
          },
          "location_info": {
            "ip_address": "45.61.23.99",
            "ip_country": "Netherlands",
            "ip_country_code": "NL",
            "ip_state": "North Holland",
            "ip_city": "Amsterdam",
            "is_vpn_or_tor": true,
            "is_data_center": true
          },
          "confidence": 1.0,
          "match_mode": "deterministic"
        }
      ]
    }
  ]
}
```

## Voir aussi

* [Avertissements de l'analyse de l'appareil et de l'IP](https://docs.didit.me/fr/core-technology/ip-analysis/warnings-ip-analysis.md) — tous les codes d'avertissement que l'analyse IP peut émettre
* [Vue d'ensemble de l'analyse de l'appareil et de l'IP](https://docs.didit.me/fr/core-technology/ip-analysis/overview.md) — ce que mesure chaque bloc
* [Modèles de données — Analyse IP](https://docs.didit.me/fr/reference/data-models.md#analyse-de-l’ip) — schéma canonique
* [Webhooks](https://docs.didit.me/fr/integration/webhooks.md) — `status.updated` transmet le même payload d'analyse IP


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