> ## 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 de vérification de l'e-mail : fuites, OTP, JSON

> Analysez avec Didit les retours de vérification d'e-mail : cycle OTP, fuites de données, adresses jetables et avertissements de risque.

Le rapport de vérification de l'e-mail présente le résultat complet d'un défi OTP par e-mail : à qui le message a été envoyé, si l'adresse est jetable ou non distribuable, si elle apparaît dans des fuites de données connues, le nombre de tentatives effectuées par l'utilisateur, ainsi que toute correspondance inter-sessions avec votre liste de blocage ou d'autres utilisateurs approuvés.

Cette page documente la structure JSON renvoyée par l'endpoint de décision afin que vous puissiez analyser les résultats OTP, l'exposition aux fuites de données et les indicateurs de risque pour chaque adresse vérifiée.

![Rapport Didit de vérification de l'e-mail montrant le résultat OTP, les données de fuites et les indicateurs de risque](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/email-verification-report.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=4d153b7d3d9d4c88bc3932466af7ed29)

## Vue d'ensemble

Un rapport d'e-mail est généré chaque fois qu'un nœud de workflow exécute la fonctionnalité Vérification de l'e-mail. Chaque rapport représente un défi OTP associé à une adresse et contient :

* L'adresse `email` vérifiée.
* Des indicateurs de risque booléens (`is_breached`, `is_disposable`, `is_undeliverable`) et le tableau détaillé `breaches[]` provenant d'une base de données de renseignements sur les fuites de données.
* Le nombre de tentatives d'envoi d'OTP (`verification_attempts`) et l'horodatage d'approbation.
* Un journal chronologique `lifecycle[]` de chaque envoi, nouvelle tentative et tentative de vérification du code.
* Un tableau `matches[]` signalant la présence de la même adresse dans d'autres vérifications d'e-mail approuvées ou sur votre liste de blocage.
* Un tableau `warnings[]` — les événements de risque émis pendant la vérification (voir les [avertissements de la vérification de l'e-mail](https://docs.didit.me/fr/core-technology/email-verification/warnings-email-verification.md)).
* Un `node_id` qui identifie le nœud du graphe de workflow ayant produit le rapport (sessions V3 uniquement).

Dans les sessions de workflow hébergées, le défi OTP s'exécute dans l'interface utilisateur de vérification de Didit — vous lisez simplement le résultat à partir du payload de décision. Pour un OTP de serveur à serveur sans flux hébergé, utilisez l'API Email autonome : [`POST /v3/email/send/`](https://docs.didit.me/fr/standalone-apis/email-send) envoie le code et [`POST /v3/email/check/`](https://docs.didit.me/fr/standalone-apis/email-check) valide la saisie de l'utilisateur ; les vérifications autonomes finalisées apparaissent sous la même structure de rapport.

Les sessions hébergées limitent par défaut l'utilisateur à **2 saisies de code incorrectes** (`email_max_check_attempts`) et à **2 envois d'OTP — l'envoi initial plus un renvoi** (`email_max_retries`), configurables par nœud de workflow. Le dépassement de l'une ou l'autre de ces limites finalise l'étape avec l'état `Declined` et la raison `EMAIL_CODE_ATTEMPTS_EXCEEDED`.

## Emplacement dans les réponses de l'API

L'endpoint de décision (`GET /v3/session/{sessionId}/decision/`) renvoie les rapports d'e-mail sous la clé de tableau au pluriel **`email_verifications`**. Ce tableau contient une entrée par nœud de vérification de l'e-mail dans le graphe de workflow — généralement une seule, mais les flux d'authentification renforcée peuvent en générer plusieurs.

```json theme={null}
{
  "session_id": "11111111-1111-1111-1111-111111111111",
  "status": "Approved",
  "email_verifications": [
    { "node_id": "feature_email_1", "status": "Approved", "...": "..." }
  ]
}
```

Une valeur `null` signifie qu'aucune étape de vérification de l'e-mail n'a encore été exécutée. Parcourez le tableau (plutôt que de lire `email_verifications[0]`) lorsque votre workflow est susceptible de recueillir plusieurs adresses e-mail.

## Schéma

Le schéma canonique champ par champ se trouve sur la page [Modèles de données](https://docs.didit.me/fr/reference/data-models.md#vérification-de-l’e-mail).

```typescript theme={null}
interface EmailVerification {
  node_id: string | null;
  status: "Not Finished" | "Approved" | "Declined" | "In Review" | "Expired";
  email: string;
  is_breached: boolean;
  breaches: Breach[];                // Up to the 5 most recent known breaches
  is_disposable: boolean;            // Disposable / throwaway provider
  is_undeliverable: boolean;         // Failed syntax / DNS (MX) validation or OTP delivery
  verification_attempts: number;     // OTP send attempts
  verified_at: string | null;        // ISO 8601, null until a valid code is entered
  lifecycle: EmailLifecycleEvent[];  // OTP send/retry/check timeline
  warnings: Warning[];               // Risk events (see Data models → Warning object)
  matches: EmailMatch[];             // Cross-session / blocklist matches
}

interface Breach {
  name: string;                      // Breached service name
  domain: string;                    // Affected domain
  breach_date: string;               // YYYY-MM-DD
  breach_emails_count: number;       // Total affected accounts
  description: string;               // HTML description of the breach
  logo_path: string;                 // Breached-service logo URL
  data_classes: string[];            // Exposed data categories (snake_case)
  is_verified: boolean;              // true when the breach is a verified incident
}
```

Une adresse non distribuable — syntaxe invalide, domaine inexistant, enregistrements MX manquants ou échec de livraison de l'OTP — finalise l'étape en **`Declined`** avec l'avertissement de refus automatique `UNDELIVERABLE_EMAIL_DETECTED`. Seule exception : lorsque l'utilisateur a saisi l'adresse lui-même (elle n'a pas été préremplie lors de la création de la session), un envoi non distribuable renvoie une erreur inline afin qu'il puisse réessayer avec une autre adresse au lieu d'être immédiatement refusé.

### Valeurs de statut

| Statut | Signification |
| - | - |
| `Not Finished` | L'envoi de l'OTP a été initié mais la vérification n'a pas encore été finalisée. |
| `Approved` | L'utilisateur a saisi un OTP valide et aucun risque entraînant un refus ne s'est déclenché. |
| `Declined` | Un avertissement de refus automatique s'est déclenché (liste de blocage, adresse non distribuable, tentatives dépassées) ou une action de risque configurée sur `DECLINE` s'est déclenchée. |
| `In Review` | Une action de risque configurée sur `REVIEW` a acheminé l'étape vers un examen manuel. |
| `Expired` | Le délai de 5 minutes de l'OTP s'est écoulé sans code valide — s'applique aux vérifications créées via l'API e-mail autonome. |

### Types d'événements du cycle de vie

`lifecycle[]` est trié par ordre chronologique. Chaque événement comporte `type`, `timestamp`, `details` et un `fee` facturable (le cas échéant) :

| Type d'événement | Émis lorsque |
| - | - |
| `EMAIL_VERIFICATION_MESSAGE_SENT` | Première tentative d'envoi d'OTP — y compris les envois qui échouent parce que l'adresse n'est pas distribuable. |
| `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT` | Envoi d'OTP ultérieur après que l'utilisateur a demandé un renvoi. |
| `VALID_CODE_ENTERED` | L'utilisateur a soumis le code OTP correct. |
| `INVALID_CODE_ENTERED` | L'utilisateur a soumis un code OTP incorrect ou expiré (pris en compte dans le plafond). |
| `EMAIL_VERIFICATION_APPROVED` | Le statut au niveau de la fonctionnalité a été défini sur `Approved`. |
| `EMAIL_VERIFICATION_DECLINED` | Le statut au niveau de la fonctionnalité a été défini sur `Declined`. |
| `EMAIL_VERIFICATION_IN_REVIEW` | Le statut au niveau de la fonctionnalité a été défini sur `In Review`. |
| `EMAIL_VERIFICATION_EXPIRED` | Le délai de l'OTP s'est écoulé sans code valide (API e-mail autonome). |

Le payload `details` dépend de la famille d'événements :

* **Événements d'envoi** (`EMAIL_VERIFICATION_MESSAGE_SENT`, `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`) — `{ status, reason }`. `status` est `Success`, `Retry` ou `Undeliverable` ; `reason` est `null` sauf si l'envoi a échoué (`email_can_not_be_delivered`, ou `unknown` pour des anciennes valeurs non reconnues).
* **Événements de vérification** (`VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`) — `{ code_tried, status }` avec `status` `Approved`, `Failed`, `Expired or Not Found` ou `Declined`.
* **Événements de statut final** — `null`, sauf `EMAIL_VERIFICATION_DECLINED` / `EMAIL_VERIFICATION_IN_REVIEW`, qui contiennent `{ "reason": "<risk code>" }` (par ex. `UNDELIVERABLE_EMAIL_DETECTED`).

Les envois avec le `status` `Success` ou `Undeliverable` enregistrent les frais de Vérification de l'e-mail de \$0.02 ; les envois `Retry`, les événements de vérification et les événements de statut portent toujours `fee: 0`.

### Correspondances entre sessions

`matches[]` enregistre la même adresse sur des vérifications d'e-mail **précédemment approuvées** au sein de la même application — à travers les sessions KYC, KYB et d'API autonomes — ainsi que les correspondances avec les entrées des listes de blocage configurées via les [listes de l'API de gestion](https://docs.didit.me/fr/management-api/lists/overview.md). Les vérifications partageant les `vendor_data` de la session actuelle sont exclues (le même utilisateur final ne correspond pas à lui-même), le tableau est limité à **5** entrées, ordonnées de la plus ancienne à la plus récente. Lorsque l'adresse figure sur votre liste de blocage mais qu'aucune des sessions correspondantes n'est sur liste de blocage, une entrée synthétique avec `source: "list_entry"` (tous les champs de session à `null`) est ajoutée au début du tableau.

```typescript theme={null}
interface EmailMatch {
  session_id: string | null;         // null when source = "list_entry"
  session_number: number | null;
  vendor_data: string | null;
  verification_date: string | null;  // ISO 8601, creation date of the matched session
  email: string;
  status: string | null;             // Status of the matched session
  is_blocklisted: boolean;
  api_service: string | null;        // Set when the matched session came from a standalone API
  source: "session" | "list_entry";  // "list_entry" = manual blocklist hit
}
```

## Exemples

### Approuvé — OTP sans problème avec un avertissement informatif

```json theme={null}
{
  "node_id": "feature_email_1",
  "status": "Approved",
  "email": "alex.sample@example.com",
  "is_breached": true,
  "breaches": [
    {
      "name": "ExampleAir",
      "domain": "example-air.com",
      "breach_date": "2022-08-25",
      "breach_emails_count": 6083479,
      "description": "In August 2022, the airline ExampleAir suffered a data breach that exposed customers' personal information.",
      "logo_path": "https://<media-host>/logos/ExampleAir.png",
      "data_classes": [
        "dates_of_birth", "email_addresses", "genders", "names",
        "nationalities", "phone_numbers", "physical_addresses",
        "salutations", "spoken_languages"
      ],
      "is_verified": true
    }
  ],
  "is_disposable": false,
  "is_undeliverable": false,
  "verification_attempts": 1,
  "verified_at": "2025-09-15T17:36:19.963451Z",
  "lifecycle": [
    {
      "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2025-09-15T17:35:50.000000+00:00",
      "details": { "status": "Success", "reason": null },
      "fee": 0.02
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2025-09-15T17:36:19.000000+00:00",
      "details": { "code_tried": "123456", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "EMAIL_VERIFICATION_APPROVED",
      "timestamp": "2025-09-15T17:36:19.963451+00:00",
      "details": null,
      "fee": 0
    }
  ],
  "warnings": [
    {
      "feature": "EMAIL",
      "risk": "BREACHED_EMAIL_DETECTED",
      "additional_data": null,
      "log_type": "information",
      "short_description": "Breached email detected",
      "long_description": "This email address was found in one or more known data breaches.",
      "node_id": "feature_email_1"
    }
  ],
  "matches": []
}
```

### Refusé — adresse non distribuable

Une adresse préremplie qui échoue à la validation de la syntaxe ou à la validation DNS (MX) — ou dont l'e-mail d'OTP ne peut pas être distribué — est immédiatement finalisée avec le statut `Declined`. Aucun événement de vérification du code n'apparaît, car aucun code n'est parvenu à l'utilisateur.

```json theme={null}
{
  "node_id": "feature_email_1",
  "status": "Declined",
  "email": "user@nonexistent-domain.example",
  "is_breached": false,
  "breaches": [],
  "is_disposable": false,
  "is_undeliverable": true,
  "verification_attempts": 1,
  "verified_at": null,
  "lifecycle": [
    {
      "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2025-09-15T18:00:00.000000+00:00",
      "details": { "status": "Undeliverable", "reason": "email_can_not_be_delivered" },
      "fee": 0.02
    },
    {
      "type": "EMAIL_VERIFICATION_DECLINED",
      "timestamp": "2025-09-15T18:00:01.500000+00:00",
      "details": { "reason": "UNDELIVERABLE_EMAIL_DETECTED" },
      "fee": 0
    }
  ],
  "warnings": [
    {
      "feature": "EMAIL",
      "risk": "UNDELIVERABLE_EMAIL_DETECTED",
      "additional_data": null,
      "log_type": "error",
      "short_description": "Undeliverable email detected",
      "long_description": "The system detected that the email is undeliverable, which is not allowed.",
      "node_id": "feature_email_1"
    }
  ],
  "matches": []
}
```

### Refusé — boîte aux lettres jetable sur liste de blocage

L'utilisateur a saisi l'OTP, mais l'adresse correspondait à une entrée de votre liste de blocage d'e-mails (refus automatique). L'indicateur jetable est également activé — au niveau `information` ici car `disposable_email_action` est laissé à sa valeur par défaut `NO_ACTION`.

```json theme={null}
{
  "node_id": "feature_email_1",
  "status": "Declined",
  "email": "user@mailinator.com",
  "is_breached": false,
  "breaches": [],
  "is_disposable": true,
  "is_undeliverable": false,
  "verification_attempts": 1,
  "verified_at": "2025-09-15T18:05:42.201734Z",
  "lifecycle": [
    {
      "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2025-09-15T18:05:01.000000+00:00",
      "details": { "status": "Success", "reason": null },
      "fee": 0.02
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2025-09-15T18:05:42.000000+00:00",
      "details": { "code_tried": "654321", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "EMAIL_VERIFICATION_DECLINED",
      "timestamp": "2025-09-15T18:05:42.201734+00:00",
      "details": { "reason": "EMAIL_IN_BLOCKLIST" },
      "fee": 0
    }
  ],
  "warnings": [
    {
      "feature": "EMAIL",
      "risk": "EMAIL_IN_BLOCKLIST",
      "additional_data": {
        "blocklisted_session_id": null,
        "blocklisted_session_number": null,
        "api_service": null
      },
      "log_type": "error",
      "short_description": "Email in blocklist",
      "long_description": "The system detected that the email is in the blocklist, which is not allowed.",
      "node_id": "feature_email_1"
    },
    {
      "feature": "EMAIL",
      "risk": "DISPOSABLE_EMAIL_DETECTED",
      "additional_data": null,
      "log_type": "information",
      "short_description": "Disposable email detected",
      "long_description": "The system detected that the email is disposable, which is not allowed.",
      "node_id": "feature_email_1"
    }
  ],
  "matches": [
    {
      "session_id": null,
      "session_number": null,
      "vendor_data": null,
      "verification_date": null,
      "email": "user@mailinator.com",
      "status": null,
      "is_blocklisted": true,
      "api_service": null,
      "source": "list_entry"
    }
  ]
}
```

## Liens associés

* [Vue d'ensemble de la Vérification de l'e-mail](https://docs.didit.me/fr/core-technology/email-verification/overview.md) — fonctionnement et tarifs de la fonctionnalité.
* [Avertissements de la Vérification de l'e-mail](https://docs.didit.me/fr/core-technology/email-verification/warnings-email-verification.md) — l'ensemble des codes de risque, des déclencheurs de refus et des actions configurables.
* [Modèles de données — vérification de l'e-mail](https://docs.didit.me/fr/reference/data-models.md#vérification-de-l’e-mail) — schéma canonique champ par champ.
* [API Email — Envoyer un OTP](https://docs.didit.me/fr/standalone-apis/email-send.md) et [Vérifier un OTP](https://docs.didit.me/fr/standalone-apis/email-check.md) — endpoints serveur à serveur autonomes.
* [API de gestion — Listes](https://docs.didit.me/fr/management-api/lists/overview.md) — gérer la liste de blocage d'e-mails qui alimente `matches[]` avec `source: list_entry`.


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