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

# Vérification de l'e-mail : API de contrôle du code OTP

> Valider un code OTP e-mail via POST /v3/email/check/ avec Didit : fuites, adresses jetables, délivrabilité. Tarif à l'usage, sans engagement.

## Module complémentaire Intelligence

Définissez `enable_enrichment` sur `true` pour effectuer également une analyse de l'adresse e-mail : un score de risque et son historique de fuites de données.
Ce module complémentaire est facturé \$0.05 par requête au tarif public, en plus du prix de la vérification.
La requête renvoie `403` lorsque votre solde ne couvre pas ce montant.

Trois champs déterminent l'effet des signaux.
Chacun vaut `NO_ACTION` (valeur par défaut) ou `DECLINE`, et chacun ne prend effet que lorsque `enable_enrichment` vaut `true`.

| Champ | Refuse lorsque |
| - | - |
| `email_intelligence_score_action` | Le score de risque est supérieur au seuil. |
| `recent_email_breach_action` | L'adresse figure dans une violation de données connue et récente. |
| `frequent_email_breach_action` | L'adresse figure dans de nombreuses violations de données connues. |

Avec `NO_ACTION`, le signal est tout de même renvoyé dans `email.email_intelligence`, ce qui vous permet d'appliquer votre propre règle.


## OpenAPI

````yaml fr/openapi-25.json POST /v3/email/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: Vérifier le code e-mail
      description: >-
        Vérifiez l'OTP envoyé par [`POST
        /v3/email/send/`](/fr/standalone-apis/email-send) et obtenez le résultat
        final de la vérification ainsi que des informations sur l'e-mail :
        délivrabilité, exposition aux fuites de données (`is_breached` et la
        liste `breaches` provenant d'une base de données d'intelligence sur les
        fuites), détection de fournisseurs jetables et utilisation en doublon de
        l'adresse sur vos sessions.


        **Comment la vérification identifie l'envoi.** La correspondance
        s'effectue par votre application et l'adresse `email` ; `request_id`
        n'est pas un paramètre d'entrée. La vérification en attente la plus
        récente créée au cours des **5 dernières minutes** est contrôlée. S'il
        n'en existe aucune (jamais envoyée, déjà finalisée, non distribuable au
        moment de l'envoi ou datant de plus de 5 minutes), l'endpoint renvoie
        `200` avec `status: "Expired or Not Found"`.


        **Quota de tentatives.** Chaque vérification autorise **3 tentatives de
        code**. Les deux premiers codes incorrects renvoient `status: "Failed"`
        avec le nombre de tentatives restantes et `email: null` ; le troisième
        code incorrect finalise la vérification en `Declined` avec un
        avertissement `EMAIL_CODE_ATTEMPTS_EXCEEDED` et renvoie le rapport
        complet de l'e-mail. Les codes sont comparés sans distinction de casse
        (pertinent pour les envois d'`alphanumeric_code`) ; seul le code envoyé
        le plus récemment est valide.


        **Résultats.** `Approved` : code correct et aucun risque entraînant un
        refus. `Declined` (définitif) : le code était correct mais un risque
        entraînant un refus correspondait (une action `DECLINE` ci-dessous, une
        adresse sur liste de blocage ou une adresse détectée comme non
        distribuable lors de la finalisation), ou le quota de tentatives a été
        épuisé. `Failed` : code incorrect, tentatives restantes. `Expired or Not
        Found` : rien à vérifier. Pour `Approved`/`Declined`, l'`request_id` est
        égal au `request_id` de l'envoi (l'identifiant de session) et `email`
        contient le rapport complet (`is_breached`, `breaches`, `is_disposable`,
        `is_undeliverable`, `warnings`, `lifecycle`, `matches`) ; pour `Failed`
        et `Expired or Not Found`, l'`request_id` est un UUID aléatoire à usage
        unique.


        **Actions de risque.** `duplicated_email_action`,
        `breached_email_action` et `disposable_email_action` déterminent ce qui
        se passe lorsque le risque correspondant est détecté sur un code correct
        : `DECLINE` bascule le statut final à `Declined` ; `NO_ACTION` (par
        défaut) consigne le risque dans `email.warnings` sans impacter le
        statut.


        **Facturation.** Les vérifications sont gratuites : le crédit est
        consommé par l'envoi réussi.


        **Persistance de session.** Une vérification finalisée met à jour la
        session créée par l'envoi (visible dans la Business Console, consultable
        via `GET /v3/session/{sessionId}/decision/`) et déclenche un webhook
        `status.updated`.


        **Sandbox.** Les clés API sandbox ignorent tout traitement : tout code
        bien formé (y compris `123456`) renvoie un payload statique `Approved`
        avec un objet `email` simplifié (`status`, `email`, `is_breached`,
        `is_disposable`, `is_undeliverable`) ; une entrée mal formée renvoie
        toujours `400`. Rien n'est conservé.


        **Authentification.** Envoyez la clé API de votre application dans
        l'en-tête `x-api-key`. Des identifiants manquants ou invalides renvoient
        `403` (`{"detail": "You do not have permission to perform this
        action."}`) ; cette API ne renvoie jamais `401`.


        **Limite de débit.** Quota partagé d'écriture de 300 requêtes/min par
        clé API sur l'ensemble des endpoints POST/PATCH/DELETE ; son dépassement
        renvoie `429`.


        **Empreinte sociale.** Définissez `enable_social` sur `true` pour
        ajouter un bloc `email_social` : les plateformes en ligne sur lesquelles
        cette adresse est inscrite, avec les décomptes par catégorie et les
        détails de profil disponibles. `profiles_registered: 0` signifie que les
        plateformes ont été vérifiées et que l'adresse n'a été trouvée sur
        aucune d'elles - une réponse valide et facturable. Le bloc est absent
        lorsque le module complémentaire n'a pas été demandé ou que la
        vérification n'a pas pu aboutir, et il n'est pas facturé dans ce cas. La
        facturation ajoute une unité `email_social` par requête en plus du prix
        propre à cet endpoint.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    La même adresse e-mail que celle utilisée dans l'appel
                    [`POST /v3/email/send/`](/fr/standalone-apis/email-send)
                    correspondant. C'est ce qui associe la vérification à
                    l'envoi.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    L'OTP reçu par l'utilisateur final : 4 à 8 chiffres, ou 4 à
                    8 lettres/chiffres lorsque `alphanumeric_code: true` a été
                    utilisé lors de l'envoi. La comparaison est insensible à la
                    casse.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Que faire lorsque la même adresse a déjà été utilisée et
                    approuvée par un utilisateur différent (seules les
                    vérifications précédemment approuvées comptent)
                    (`vendor_data` distinct) de votre application. `DECLINE`
                    fait passer le `status` final à `Declined` ; `NO_ACTION`
                    enregistre le risque dans `email.warnings` et renseigne
                    `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ce qu'il faut faire lorsque l'adresse apparaît dans des
                    violations de données connues (`email.is_breached`).
                    `DECLINE` fait passer le `status` final à `Declined` ;
                    `NO_ACTION` enregistre le risque dans `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Que faire lorsque le domaine appartient à un fournisseur
                    d'adresses e-mail jetables/temporaires
                    (`email.is_disposable`). `DECLINE` fait passer le `status`
                    final à `Declined` ; `NO_ACTION` enregistre le risque dans
                    `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Lorsque la valeur est `true`, exécute également une analyse
                    de renseignements sur l'adresse e-mail : un score de risque
                    et son historique de fuites de données. Facturé comme une
                    unité `email_intelligence_api` par requête ($0.05 au prix
                    catalogue) en plus du prix propre à cet endpoint. La requête
                    renvoie `403` lorsque votre solde ne permet pas de la
                    couvrir.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: "Action lorsque le score de risque de l'intelligence e-mail est supérieur au seuil. `DECLINE` fait passer le `status` final à `Declined`\_; `NO_ACTION` enregistre le signal sans refuser. Ne prend effet que lorsque `enable_enrichment` est `true`."
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Action lorsque l'adresse apparaît dans une fuite de données
                    connue récente. `DECLINE` bascule le `status` final à
                    `Declined` ; `NO_ACTION` enregistre le signal sans refuser.
                    Ne prend effet que lorsque `enable_enrichment` est `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Action lorsque l'adresse apparaît dans de nombreuses fuites
                    de données connues. `DECLINE` bascule le `status` final à
                    `Declined` ; `NO_ACTION` enregistre le signal sans refuser.
                    Ne prend effet que lorsque `enable_enrichment` est `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Si true, recherche également l'empreinte sociale de
                    l'adresse : les plateformes d'e-mail, sociales,
                    professionnelles, d'e-commerce et de divertissement sur
                    lesquelles elle est enregistrée. Facturé comme une unité
                    `email_social` par requête en plus du prix propre à cet
                    endpoint.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: "Action lorsque la vérification de l'empreinte sociale ne trouve l'adresse enregistrée sur aucune des plateformes couvertes. Seuls NO_ACTION et DECLINE sont acceptés sur cet endpoint\_; REVIEW est disponible sur la clé de configuration du workflow du même nom."
              required:
                - email
                - code
            examples:
              Default:
                summary: >-
                  Enregistrer tous les risques sans jamais refuser
                  automatiquement
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: >-
                  Refuser automatiquement les boîtes de réception jetables et
                  compromises
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Vérification terminée — les codes erronés et les vérifications
            manquantes renvoient également `200` ; inspectez `status`, et non le
            code HTTP. `email` n'est renseigné que pour les résultats finalisés
            (`Approved`/`Declined`), vaut `null` pour `Failed`, et est absent
            pour `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: Code correct — adresse propre, rapport d'e-mail complet
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: alice@example.com
                      is_breached: false
                      breaches: []
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Approved with breach exposure:
                  summary: >-
                    Code correct ; exposition à une fuite enregistrée comme
                    avertissement (breached_email_action=NO_ACTION)
                  value:
                    request_id: 3a1f2b6c-9d4e-4f7a-8b2c-1e5d6f7a8b9c
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: bob@example.com
                      is_breached: true
                      breaches:
                        - name: ExampleApp
                          domain: exampleapp.com
                          breach_date: '2019-03-21'
                          breach_emails_count: 763117
                          description: >-
                            In March 2019, the social platform ExampleApp
                            suffered a data breach that exposed email addresses
                            and passwords.
                          logo_path: https://<media-host>/logos/ExampleApp.png
                          data_classes:
                            - email_addresses
                            - passwords
                          is_verified: true
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      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.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '835126'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-5678
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Failed (attempts remaining):
                  summary: >-
                    Code erroné — l'utilisateur peut réessayer ; request_id est
                    ici un UUID à usage unique
                  value:
                    request_id: 11111111-2222-3333-4444-555555555555
                    status: Failed
                    message: 'The verification code is incorrect. Attempts remaining: 2'
                    email: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (risk policy):
                  summary: >-
                    Code correct, mais l'adresse est jetable et
                    disposable_email_action=DECLINE
                  value:
                    request_id: 8c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f
                    status: Declined
                    message: The verification code is correct.
                    email:
                      status: Declined
                      email: tempuser42@mailinator.com
                      is_breached: false
                      breaches: []
                      is_disposable: true
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: EMAIL
                          risk: DISPOSABLE_EMAIL_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: Disposable email detected
                          long_description: >-
                            The system detected that the email is disposable,
                            which is not allowed.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: DISPOSABLE_EMAIL_DETECTED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Expired or Not Found:
                  summary: >-
                    Aucune vérification en attente pour cette adresse au cours
                    des 5 dernières minutes
                  value:
                    request_id: 88808a77-06e9-4cb0-85f5-9c052ddfd987
                    status: Expired or Not Found
                    message: No pending email verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:59.887904+00:00'
        '400':
          description: >-
            Erreur de validation — enveloppe d'erreur de champ de DRF : un
            tableau de messages par champ concerné.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Adresse e-mail mal formée
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` n''est pas inclus dans le corps'
                  value:
                    code:
                      - This field is required.
        '403':
          description: "Permission refusée. Renvoyé lorsque l'en-tête `x-api-key` est manquant\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Les vérifications sont gratuites, aucun contrôle de crédit n'est donc effectué ici."
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Aucun en-tête `x-api-key`, ou la clé est non valide/révoquée
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            Limite de débit dépassée. Les endpoints POST/PATCH/DELETE partagent
            un budget de 300 requêtes d'écriture par minute par clé API (la
            création de transactions et l'ingestion d'événements ont un budget
            distinct de 600). La réponse comporte les en-têtes
            `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` et
            `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: >-
                    Plus de 300 requêtes d'écriture au cours de la minute
                    actuelle
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/email/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "email": "alice@example.com",
                "code": "123456",
                "disposable_email_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.email.check_code(
                email="alice@example.com",
                code="123456",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.email.checkCode({
              email: "alice@example.com",
              code: "123456",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.CheckCode(ctx, didit.EmailCheckCodeParams{\n\tEmail: \"alice@example.com\",\n\tCode:  \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.EmailCheckCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.email().checkCode(EmailCheckCodeParams.builder()
                    .email("alice@example.com")
                    .code("123456")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->email->checkCode([
                'email' => 'alice@example.com',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.email.check_code(
              email: "alice@example.com",
              code: "123456"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Email.CheckCodeAsync(new
            EmailCheckCodeParams

            {
                Email = "alice@example.com",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    EmailVerificationCheckResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            Pour `Approved`/`Declined` : l'identifiant de session de la
            vérification correspondante — identique au `request_id` renvoyé par
            `POST /v3/email/send/`. Pour `Failed` et `Expired or Not Found` : un
            UUID aléatoire à usage unique qui ne pourra pas être consulté
            ultérieurement.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — code correct, aucun risque de refus. `Declined` —
            définitif : un risque entraînant un refus a correspondu ou le nombre
            maximal de tentatives (3) a été épuisé. `Failed` — code erroné,
            tentatives restantes. `Expired or Not Found` — aucune vérification
            en attente pour cette adresse au cours des 5 dernières minutes.
        message:
          type: string
          description: >-
            Explication lisible par l'humain du résultat, incluant le nombre de
            tentatives restantes après un code erroné.
        email:
          type: object
          nullable: true
          description: >-
            Rapport d'e-mail complet. Présent (non null) uniquement pour les
            résultats finalisés (`Approved`/`Declined`) ; `null` pour `Failed`
            et absent pour `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Statut final de la vérification de l'e-mail. Correspond au
                `status` de premier niveau pour les vérifications finalisées.
            email:
              type: string
              format: email
              description: L'adresse e-mail vérifiée.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true` lorsque l'adresse apparaît dans des violations de données
                connues (recherche de renseignements sur les violations exécutée
                lors de la finalisation).
            breaches:
              type: array
              description: >-
                Jusqu'aux 5 fuites de données connues les plus récentes
                contenant cette adresse. Tableau vide (ou omis) lorsque
                `is_breached` vaut `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Identifiant de la violation.
                  domain:
                    type: string
                    description: Domaine du service compromis.
                  breach_date:
                    type: string
                    format: date
                    description: Date à laquelle la violation s'est produite.
                  breach_emails_count:
                    type: integer
                    description: Nombre total de comptes exposés lors de la violation.
                  description:
                    type: string
                    description: >-
                      Description lisible par l'humain de la violation (peut
                      contenir du balisage HTML).
                  logo_path:
                    type: string
                    description: URL du logo du service compromis.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Catégories de données exposées, en snake_case (par
                      exemple, `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Indique si la légitimité de la fuite a été vérifiée.
            is_disposable:
              type: boolean
              description: >-
                `true` lorsque le domaine appartient à un fournisseur connu
                d'e-mails temporaires/jetables.
            is_undeliverable:
              type: boolean
              description: >-
                `true` lorsque l'adresse ne peut pas recevoir de messages (échec
                de la validation de syntaxe ou DNS/MX, ou message rejeté).
            verification_attempts:
              type: integer
              description: >-
                Nombre d'envois d'OTP pour cette vérification (1, ou 2 après une
                nouvelle tentative).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Date et heure de saisie du code correct. `null` si la
                vérification n'a jamais été approuvée.
            warnings:
              type: array
              description: >-
                Avertissements de risque enregistrés pendant la vérification
                (doublon, compromis, jetable, non livrable, nombre maximal de
                tentatives dépassé, liste de blocage, etc.). Tableau vide
                lorsqu'il n'y en a aucun.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: >-
                      Fonctionnalité ayant généré l'avertissement. Toujours
                      `EMAIL` ici.
                  risk:
                    type: string
                    description: Code de risque lisible par machine.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Contexte spécifique au risque (par ex., l'identifiant de
                      la session dupliquée pour les risques de doublon). `null`
                      lorsque le risque ne comporte aucune donnée
                      supplémentaire.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Gravité. Les risques `error` entraînent le refus de la
                      vérification, `warning` la signale pour examen, et
                      `information` est enregistrée sans affecter le statut.
                  short_description:
                    type: string
                    description: Résumé du risque en une ligne, lisible par l'utilisateur.
                  long_description:
                    type: string
                    description: Explication lisible par l'humain du risque.
            lifecycle:
              type: array
              description: >-
                Piste d'audit chronologique de la vérification. L'événement
                `type` est l'un des suivants :
                `EMAIL_VERIFICATION_MESSAGE_SENT`,
                `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `EMAIL_VERIFICATION_APPROVED`,
                `EMAIL_VERIFICATION_DECLINED`, `EMAIL_VERIFICATION_IN_REVIEW`,
                `EMAIL_VERIFICATION_EXPIRED`.
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: Type d'événement.
                  timestamp:
                    type: string
                    format: date-time
                    description: Date et heure de l'événement.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload spécifique à l'événement. Événements d'envoi :
                      `{status, reason}`. Événements de saisie de code :
                      `{code_tried, status}`. Événements de statut final :
                      `null`, ou `{reason}` en cas de refus ou d'examen en
                      cours.
                  fee:
                    type: number
                    description: "Montant en USD facturé pour cet événement. Non nul uniquement lors du premier envoi réussi\_; 0 pour les nouvelles tentatives, les saisies de code et les événements de statut."
            matches:
              type: array
              description: >-
                Autres sessions de votre application (KYC, KYB ou API) où la
                même adresse e-mail a été utilisée par un utilisateur différent
                (`vendor_data` différent). Jusqu'à 5 entrées ; une
                correspondance synthétique issue d'une entrée de liste de
                blocage est ajoutée en tête lorsqu'elle existe (et uniquement
                lorsqu'aucune adresse e-mail issue d'une session et placée sur
                liste de blocage n'existe) — les correspondances issues d'une
                session conservent l'ordre de created_at. Tableau vide lorsqu'il
                n'y a aucune correspondance.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID de session de l'autre vérification ayant utilisé cette
                      adresse e-mail.
                  session_number:
                    type: integer
                    description: Numéro séquentiel lisible par l'humain de cette session.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` de cette session.'
                  verification_date:
                    type: string
                    description: >-
                      Date et heure de création de cette session
                      (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: L'adresse e-mail correspondante.
                  status:
                    type: string
                    description: >-
                      Statut de cette session (par exemple, `Approved`,
                      `Declined`, `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Indique si l'adresse e-mail figure sur la liste de blocage
                      de votre application.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Pour les sessions de type API, l'API autonome qui l'a
                      créée (par ex., `PHONE_VERIFICATION`) ; `null` pour les
                      sessions de vérification régulières.
                  source:
                    type: string
                    description: >-
                      Emplacement où la correspondance a été trouvée.
                      Généralement `session` ; une correspondance avec une liste
                      de blocage via une entrée de liste d'organisation insère
                      une correspondance synthétique avec `source: "list_entry"`
                      et `session_id`/`session_number` à null.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                Signaux d'analyse de l'e-mail. Présents uniquement lorsque
                `enable_enrichment` valait `true` lors de la vérification.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` de la session de la vérification correspondante.
            `null` pour `Expired or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` de la session de la vérification correspondante. `null`
            pour `Expired or Not Found`.
        created_at:
          type: string
          format: date-time
          description: Horodatage de cette réponse de vérification.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: "Empreinte sociale de l'adresse e-mail\_: les plateformes en ligne sur lesquelles elle est enregistrée. Présent uniquement lorsque `enable_social` a été défini et que la vérification s'est terminée. Chaque décompte peut être nul lorsqu'aucune donnée n'a été renvoyée pour celui-ci. `profiles_registered: 0` signifie que les plateformes ont été vérifiées et que l'adresse e-mail n'a été trouvée sur aucune d'entre elles - une réponse valide et facturable, ainsi qu'un signal fréquent d'identité synthétique."
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: >-
            Plateformes pour lesquelles l'inscription de l'adresse e-mail est
            confirmée.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plateformes évaluées pour l'inscription.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plateformes ayant renvoyé un nom associé.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plateformes ayant renvoyé une photo de profil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: >-
            Plateformes de communication sur lesquelles une présence a été
            détectée.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Catégories de plateformes distinctes avec une présence détectée.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicateur composite de maturité numérique, de 0 à 10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicateur de richesse du profil, de 0 à 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Mix de plateformes gratuites vs payantes, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Inscriptions sur des plateformes gratuites.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Inscriptions sur des plateformes payantes.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Inscriptions sur des plateformes freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: "Niveau de complétion du profil WhatsApp. Téléphone uniquement\_; null pour l'e-mail."
          example: Partial
        registered_platforms:
          type: array
          description: Plateformes pour lesquelles l'inscription est confirmée.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Plateformes vérifiées avec un résultat négatif.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Nombre d'inscrits et ratio par catégorie de plateforme.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Détails du profil par plateforme, indexés par plateforme, lorsque
            celle-ci les expose.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Bloc de renseignements d'e-mail normalisé. Présent uniquement lorsque le
        module complémentaire d'intelligence a été exécuté pour cet e-mail ;
        lorsqu'il est présent, il est également exposé sous l'alias `enrichment`
        avec des valeurs identiques.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Score de risque normalisé de 0 à 100. Plus la valeur est élevée,
            plus le risque est grand.
        deliverable:
          type: string
          nullable: true
          description: Tranche de délivrabilité (par ex., `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` ou `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Indice numérique de risque de violation.
        is_recent_breach:
          type: boolean
          nullable: true
          description: >-
            `true` lorsque l'adresse apparaît dans une violation récente de
            données.
        is_frequent_breached:
          type: boolean
          nullable: true
          description: >-
            `true` lorsque l'adresse apparaît dans de nombreuses violations de
            données.
        is_disposable:
          type: boolean
          nullable: true
          description: >-
            `true` lorsque le domaine appartient à un fournisseur d'e-mails
            jetables.
        is_free_domain:
          type: boolean
          nullable: true
          description: >-
            `true` lorsque le domaine provient d'un fournisseur d'e-mails
            gratuit.
        is_breached:
          type: boolean
          nullable: true
          description: >-
            `true` lorsque l'adresse apparaît dans des violations de données
            connues.
        no_of_breaches:
          type: number
          nullable: true
          description: Nombre de violations de données connues contenant l'adresse.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: "Identifiant Didit stable du signal, par exemple `IR-5AC67A32`. Opaque\_: utilisez-le pour regrouper et filtrer, ne l'interprétez pas."
              value:
                nullable: true
                description: >-
                  Pour un indicateur de risque (par exemple `voip`, `leaked`,
                  `disposable`, `spam_trap`), sa valeur : un booléen, un niveau
                  ou une date. Null pour un code de motif noté.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: >-
                  Indique si le signal a augmenté le risque ou renforcé la
                  confiance.
              message:
                type: string
                description: Explication lisible par l'humain du signal, en anglais.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Mesure dans laquelle le signal a influencé le score, par
                  exemple `low`, `medium` ou `high`.
          description: >-
            Signaux expliquant le score, chacun accompagné d'un code Didit
            stable, d'un sens, d'un message et d'un niveau d'impact. De nouveaux
            codes pouvant apparaître au fil du temps, ne rejetez pas les codes
            inconnus.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Identifiant de plateforme.
          example: whatsapp
        category:
          type: string
          description: >-
            Catégorie de plateforme, par ex. MESSAGING, SOCIAL_MEDIA, ECOMMERCE,
            PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` pour les plateformes mondiales, `local` pour celles
            spécifiques à une région.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: >-
            Plateformes de cette catégorie pour lesquelles l'inscription est
            confirmée.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Part des plateformes vérifiées de la catégorie comportant une
            inscription, de 0.0 à 1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nom du profil, lorsque la plateforme en fournit un.
        photo:
          type: string
          nullable: true
          description: URL de la photo de profil, lorsque la plateforme en fournit une.
        about:
          type: string
          nullable: true
          description: >-
            Texte de présentation/biographie du profil, lorsque la plateforme en
            fournit un.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilité du profil, lorsque la plateforme la fournit.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Indique si le profil est un compte professionnel, lorsque la
            plateforme l'expose.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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