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

# Verifica Email API: convalida del codice OTP

> Convalida con Didit un codice OTP email tramite POST /v3/email/check/, con segnali su violazioni, email usa e getta e recapitabilità. Senza contratti.

## Componente aggiuntivo di intelligence

Imposta `enable_enrichment` su `true` per eseguire anche l'analisi dell'indirizzo email tramite intelligence: un punteggio di rischio e la sua cronologia di violazioni dei dati.
Il componente aggiuntivo viene fatturato \$0.05 per richiesta al prezzo di listino, in aggiunta al prezzo del controllo.
La richiesta restituisce `403` quando il tuo saldo non è sufficiente a coprire il costo.

Tre campi determinano l'effetto dei segnali.
Ciascuno può essere `NO_ACTION` (valore predefinito) o `DECLINE`, e ognuno ha effetto solo quando `enable_enrichment` è `true`.

| Campo | Rifiuta quando |
| - | - |
| `email_intelligence_score_action` | Il punteggio di rischio supera la soglia. |
| `recent_email_breach_action` | L'indirizzo compare in una violazione dei dati recente e nota. |
| `frequent_email_breach_action` | L'indirizzo compare in molte violazioni dei dati note. |

Con `NO_ACTION`, il segnale viene comunque restituito in `email.email_intelligence`, così puoi applicare una tua regola.


## OpenAPI

````yaml it/openapi-25.json POST /v3/email/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: Verifica codice email
      description: >-
        Verifica l'OTP recapitato da [`POST
        /v3/email/send/`](/it/standalone-apis/email-send) e ottieni il risultato
        finale di verifica oltre ai dati di intelligence sull'email:
        recapitabilità, esposizione a violazioni dei dati (`is_breached` e la
        lista `breaches` da un database di intelligence sulle violazioni),
        rilevamento di provider usa e getta e uso duplicato dell'indirizzo nelle
        varie sessioni.


        **Come la verifica individua il record.** Il confronto avviene in base
        alla tua applicazione e all'indirizzo `email` — `request_id` non è un
        input. Viene verificata la verifica più recente ancora in sospeso creata
        negli ultimi **5 minuti**. Se non ne esiste alcuna (mai inviata, già
        finalizzata, irrecapitabile al momento dell'invio o risalente a più di 5
        minuti prima), l'endpoint restituisce `200` con `status: "Expired or Not
        Found"`.


        **Budget di tentativi.** Ogni verifica consente **3 tentativi di
        codice**. I primi due codici errati restituiscono `status: "Failed"` con
        i tentativi rimanenti e `email: null`; il terzo codice errato finalizza
        la verifica come `Declined` con un avviso `EMAIL_CODE_ATTEMPTS_EXCEEDED`
        e restituisce il report email completo. I codici vengono confrontati
        senza distinzione tra maiuscole e minuscole (rilevante per gli invii con
        `alphanumeric_code`); solo l'ultimo codice inviato è valido.


        **Esiti.** `Approved` — codice corretto e nessun rischio ostativo.
        `Declined` — terminale: il codice era corretto ma è stato rilevato un
        rischio ostativo (un'azione `DECLINE` indicata di seguito, un indirizzo
        in blocklist o un indirizzo risultato irrecapitabile alla
        finalizzazione), oppure il budget di tentativi è stato esaurito.
        `Failed` — codice errato, tentativi rimanenti. `Expired or Not Found` —
        nulla da verificare. Con `Approved`/`Declined` il valore `request_id`
        corrisponde al `request_id` dell'invio (l'ID di sessione) e `email`
        include il report completo (`is_breached`, `breaches`, `is_disposable`,
        `is_undeliverable`, `warnings`, `lifecycle`, `matches`); con `Failed` ed
        `Expired or Not Found` il `request_id` è un UUID casuale monouso.


        **Azioni di rischio.** `duplicated_email_action`,
        `breached_email_action` e `disposable_email_action` stabiliscono cosa
        accade quando viene rilevato il rischio corrispondente a fronte di un
        codice corretto: `DECLINE` converte lo stato finale in `Declined`;
        `NO_ACTION` (predefinito) registra il rischio in `email.warnings` senza
        modificare lo stato.


        **Fatturazione.** I controlli sono gratuiti — il credito viene consumato
        dall'invio riuscito.


        **Persistenza della sessione.** Un controllo finalizzato aggiorna la
        sessione creata dall'invio (visibile nella Business Console,
        consultabile tramite `GET /v3/session/{sessionId}/decision/`) e attiva
        un webhook `status.updated`.


        **Sandbox.** Le chiavi API sandbox ignorano tutte le elaborazioni:
        qualsiasi codice ben formato (`123456` incluso) restituisce un payload
        `Approved` statico con un oggetto `email` semplificato (`status`,
        `email`, `is_breached`, `is_disposable`, `is_undeliverable`); un input
        malformato restituisce comunque `400`. Nulla viene reso persistente.


        **Autenticazione.** Invia la chiave API della tua applicazione
        nell'intestazione `x-api-key`. Credenziali mancanti o non valide
        restituiscono `403` (`{"detail": "You do not have permission to perform
        this action."}`) — questa API non restituisce mai `401`.


        **Limite di frequenza.** Budget di scrittura condiviso di 300
        richieste/min per chiave API su tutti gli endpoint POST/PATCH/DELETE; il
        superamento restituisce `429`.


        **Impronta social.** Imposta `enable_social` su `true` per aggiungere un
        blocco `email_social`: le piattaforme online su cui questo indirizzo è
        registrato, con conteggi per categoria e gli eventuali dettagli del
        profilo disponibili. `profiles_registered: 0` indica che le piattaforme
        sono state verificate e che l'indirizzo non è stato trovato su nessuna
        di esse: una risposta valida e fatturabile. Il blocco è assente quando
        il componente aggiuntivo non è stato richiesto o non è stato possibile
        completare il controllo; in tal caso non viene fatturato. La
        fatturazione aggiunge un'unità `email_social` per richiesta oltre al
        prezzo proprio di questo endpoint.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    Lo stesso indirizzo email utilizzato nella chiamata
                    corrispondente [`POST
                    /v3/email/send/`](/it/standalone-apis/email-send). Questo è
                    ciò che collega la verifica all'invio.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    L'OTP ricevuto dall'utente finale: 4–8 cifre, oppure 4–8
                    lettere/cifre quando è stato utilizzato `alphanumeric_code:
                    true` al momento dell'invio. Il confronto non fa distinzione
                    tra maiuscole e minuscole.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Cosa fare quando lo stesso indirizzo è già stato utilizzato
                    e approvato da un utente diverso (contano solo le verifiche
                    precedentemente approvate) (diverso `vendor_data`) della tua
                    applicazione. `DECLINE` imposta lo `status` finale su
                    `Declined`; `NO_ACTION` registra il rischio in
                    `email.warnings` e popola `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Cosa fare quando l'indirizzo compare in violazioni di dati
                    note (`email.is_breached`). `DECLINE` imposta lo `status`
                    finale su `Declined`; `NO_ACTION` registra il rischio in
                    `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Cosa fare quando il dominio appartiene a un provider di
                    posta usa e getta/temporanea (`email.is_disposable`).
                    `DECLINE` imposta lo `status` finale su `Declined`;
                    `NO_ACTION` registra il rischio in `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Quando è `true`, esegue anche l'analisi dell'indirizzo
                    email: un punteggio di rischio e la relativa cronologia
                    delle violazioni. Fatturato come un'unità
                    `email_intelligence_api` per richiesta ($0.05 a prezzo di
                    listino) in aggiunta al prezzo di questo endpoint. La
                    richiesta restituisce `403` quando il tuo saldo non è
                    sufficiente a coprirlo.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Azione quando il punteggio di rischio dell'intelligence
                    delle email supera la soglia. `DECLINE` imposta lo `status`
                    finale su `Declined`; `NO_ACTION` registra il segnale senza
                    rifiutare. Ha effetto solo quando `enable_enrichment` è
                    `true`.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Azione quando l'indirizzo compare in una recente violazione
                    dei dati nota. `DECLINE` imposta lo `status` finale su
                    `Declined`; `NO_ACTION` registra il segnale senza rifiutare.
                    Ha effetto solo quando `enable_enrichment` è `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Azione quando l'indirizzo compare in molteplici violazioni
                    dei dati note. `DECLINE` imposta lo `status` finale su
                    `Declined`; `NO_ACTION` registra il segnale senza rifiutare.
                    Ha effetto solo quando `enable_enrichment` è `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Se true, cerca anche l'impronta social dell'indirizzo: le
                    piattaforme email, social, professionali, di e-commerce e di
                    intrattenimento su cui è registrato. Fatturato come un'unità
                    `email_social` per richiesta in aggiunta al prezzo di questo
                    endpoint.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Azione quando il controllo dell'impronta social rileva che
                    l'indirizzo non è registrato su nessuna delle piattaforme
                    coperte. Solo NO_ACTION e DECLINE sono accettati su questo
                    endpoint; REVIEW è disponibile sulla chiave di
                    configurazione del workflow con lo stesso nome.
              required:
                - email
                - code
            examples:
              Default:
                summary: Registra eventuali rischi ma non rifiutare mai automaticamente
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: Rifiuta automaticamente caselle di posta monouso e compromesse
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Verifica completata: anche i codici errati e le verifiche mancanti
            restituiscono `200`; esamina `status`, non il codice HTTP. Il campo
            `email` viene popolato solo per gli esiti definitivi
            (`Approved`/`Declined`), è `null` per `Failed` ed è assente per
            `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: Codice corretto — indirizzo pulito, report email completo
                  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: >-
                    Codice corretto; esposizione a violazioni registrata come
                    avviso (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: >-
                    Codice errato: l'utente può riprovare; request_id qui è un
                    UUID monouso
                  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: >-
                    Codice corretto, ma l'indirizzo è usa e getta e
                    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: >-
                    Nessuna verifica in sospeso per questo indirizzo negli
                    ultimi 5 minuti
                  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: >-
            Errore di validazione — busta dell'errore di campo di DRF: un array
            di messaggi per campo non conforme.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Indirizzo email non valido
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` non incluso nel corpo'
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            Autorizzazione negata. Restituito quando l'intestazione `x-api-key`
            è mancante; una chiave errata, revocata o scaduta restituisce `401`.
            I controlli sono gratuiti, pertanto qui non viene eseguito alcun
            controllo del credito disponibile.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Nessuna intestazione `x-api-key`, oppure la chiave non è
                    valida/revocata
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            Limite di frequenza superato. Gli endpoint POST/PATCH/DELETE
            condividono un budget di 300 richieste di scrittura al minuto per
            chiave API (la creazione di transazioni e l'ingestione di eventi
            hanno un budget separato di 600). La risposta contiene le
            intestazioni `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` e `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Più di 300 richieste di scrittura nel minuto corrente
                  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: >-
            Su `Approved`/`Declined`: l'id di sessione della verifica
            corrispondente — identico al `request_id` restituito da `POST
            /v3/email/send/`. Su `Failed` ed `Expired or Not Found`: un UUID
            casuale monouso che non può essere cercato in seguito.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — codice corretto, nessun rischio di rifiuto. `Declined`
            — definitivo: è stato rilevato un rischio che comporta il rifiuto
            oppure il limite di tentativi (3) è stato esaurito. `Failed` —
            codice errato, tentativi rimanenti. `Expired or Not Found` — nessuna
            verifica in attesa per questo indirizzo negli ultimi 5 minuti.
        message:
          type: string
          description: >-
            Spiegazione di facile lettura dell'esito, compreso il numero di
            tentativi rimanenti dopo un codice errato.
        email:
          type: object
          nullable: true
          description: >-
            Report email completo. Presente (non nullo) solo per gli esiti
            finalizzati (`Approved`/`Declined`); `null` su `Failed` e assente su
            `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Stato finale della verifica email. Corrisponde allo `status` di
                primo livello per i controlli finalizzati.
            email:
              type: string
              format: email
              description: L'indirizzo email verificato.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true` quando l'indirizzo compare in violazioni di dati note
                (ricerca di intelligence sulle violazioni eseguita al momento
                del completamento).
            breaches:
              type: array
              description: >-
                Fino a 5 delle violazioni note più recenti contenenti questo
                indirizzo. Array vuoto (o omesso) quando `is_breached` è
                `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Identificatore della violazione.
                  domain:
                    type: string
                    description: Dominio del servizio violato.
                  breach_date:
                    type: string
                    format: date
                    description: Data in cui si è verificata la violazione.
                  breach_emails_count:
                    type: integer
                    description: >-
                      Numero totale di account esposti nella violazione dei
                      dati.
                  description:
                    type: string
                    description: >-
                      Descrizione di facile lettura della violazione (può
                      contenere markup HTML).
                  logo_path:
                    type: string
                    description: URL del logo del servizio violato.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Categorie di dati esposti, in snake_case (ad es.,
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Indica se la violazione è stata verificata come legittima.
            is_disposable:
              type: boolean
              description: >-
                `true` quando il dominio appartiene a un provider noto di email
                temporanee/usa e getta.
            is_undeliverable:
              type: boolean
              description: >-
                `true` quando l'indirizzo non può ricevere posta (validazione
                della sintassi o DNS/MX non riuscita, oppure messaggio
                rimbalzato).
            verification_attempts:
              type: integer
              description: >-
                Numero di invii dell'OTP per questa verifica (1, oppure 2 dopo
                un nuovo tentativo).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Data e ora di inserimento del codice corretto. `null` se la
                verifica non è mai stata approvata.
            warnings:
              type: array
              description: >-
                Avvisi di rischio registrati durante la verifica (duplicate,
                breached, disposable, undeliverable, attempts exceeded,
                blocklist, ecc.). Array vuoto se non ne è presente alcuno.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: Funzionalità che ha generato l'avviso. Sempre `EMAIL` qui.
                  risk:
                    type: string
                    description: Codice di rischio leggibile dalla macchina.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Contesto specifico del rischio (ad es. l'ID della sessione
                      duplicata per i rischi di duplicazione). `null` quando il
                      rischio non include dati aggiuntivi.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Gravità. I rischi `error` comportano il rifiuto della
                      verifica, `warning` la contrassegna per la revisione,
                      `information` viene registrato senza influire sullo stato.
                  short_description:
                    type: string
                    description: Riepilogo del rischio su una riga leggibile dall'utente.
                  long_description:
                    type: string
                    description: Spiegazione di facile lettura del rischio.
            lifecycle:
              type: array
              description: >-
                Traccia di audit cronologica della verifica. L'evento `type` è
                uno tra `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: Tipo di evento.
                  timestamp:
                    type: string
                    format: date-time
                    description: Data e ora in cui si è verificato l'evento.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload specifico dell'evento. Eventi di invio: `{status,
                      reason}`. Eventi di inserimento codice: `{code_tried,
                      status}`. Eventi di stato finale: `null`, o `{reason}` se
                      rifiutata o in revisione.
                  fee:
                    type: number
                    description: >-
                      Importo in USD fatturato per questo evento. Diverso da
                      zero solo al primo invio riuscito; 0 per nuovi tentativi,
                      inserimenti di codici ed eventi di stato.
            matches:
              type: array
              description: >-
                Altre sessioni della tua applicazione (KYC, KYB o API) in cui lo
                stesso indirizzo email è stato utilizzato da un utente diverso
                (differente `vendor_data`). Fino a 5 voci; una corrispondenza
                sintetica con una voce della blocklist viene anteposta se
                presente (e solo quando non esiste un'email derivata dalla
                sessione inclusa nella blocklist) — le corrispondenze derivate
                dalla sessione mantengono l'ordine di created_at. Array vuoto in
                assenza di corrispondenze.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID sessione dell'altra verifica che ha utilizzato questo
                      indirizzo email.
                  session_number:
                    type: integer
                    description: Numero progressivo di facile lettura di tale sessione.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` di quella sessione.'
                  verification_date:
                    type: string
                    description: >-
                      Data e ora di creazione di quella sessione
                      (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: L'indirizzo email corrispondente.
                  status:
                    type: string
                    description: >-
                      Stato di quella sessione (ad es., `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Indica se l'indirizzo email è presente nella blocklist
                      della tua applicazione.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Per le sessioni di tipo API, l'API standalone che l'ha
                      creata (es. `PHONE_VERIFICATION`); `null` per le normali
                      sessioni di verifica.
                  source:
                    type: string
                    description: >-
                      Dove è stata trovata la corrispondenza. Di solito
                      `session`; un riscontro nella blocklist tramite una voce
                      dell'elenco dell'organizzazione antepone una
                      corrispondenza sintetica con `source: "list_entry"` e
                      `session_id`/`session_number` nulli.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                Segnali di intelligence sulle email. Presenti solo quando
                `enable_enrichment` era `true` nel controllo.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` della sessione della verifica corrispondente. `null`
            in caso di `Expired or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` della sessione di verifica corrispondente. `null` in caso
            di `Expired or Not Found`.
        created_at:
          type: string
          format: date-time
          description: Timestamp della risposta a questo controllo.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Impronta social dell'indirizzo email: le piattaforme online su cui
        risulta registrato. Presente solo quando è stato impostato
        `enable_social` e il controllo è stato completato. Ciascun conteggio può
        essere null se non sono stati restituiti dati al riguardo.
        `profiles_registered: 0` indica che le piattaforme sono state
        controllate e l'indirizzo email non è stato trovato su nessuna di esse:
        una risposta valida e fatturabile, nonché un tipico segnale di identità
        sintetica.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: Piattaforme in cui l'indirizzo email risulta registrato.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Piattaforme valutate per la registrazione.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Piattaforme che hanno restituito un nome associato.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Piattaforme che hanno restituito una foto del profilo.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Piattaforme di comunicazione con presenza rilevata.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categorie di piattaforma distinte con presenza rilevata.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicatore composito di maturità digitale, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicatore della ricchezza del profilo, 0-10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Mix di piattaforme gratuite rispetto a quelle a pagamento, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registrazioni su piattaforme gratuite.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registrazioni su piattaforme a pagamento completo.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registrazioni su piattaforme freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: Completezza del profilo WhatsApp. Solo telefono; null per email.
          example: Partial
        registered_platforms:
          type: array
          description: Piattaforme in cui la registrazione è confermata.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Piattaforme verificate con esito negativo.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Numero di registrazioni e percentuale per categoria di piattaforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Dettagli del profilo per piattaforma, indicizzati per piattaforma,
            quando la piattaforma li rende disponibili.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Blocco normalizzato di email intelligence. Presente solo quando l'add-on
        di intelligence è stato eseguito per questa email; se presente, è
        esposto anche come alias `enrichment` con valori identici.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Punteggio di rischio normalizzato da 0 a 100. Più alto è il
            punteggio, maggiore è il rischio.
        deliverable:
          type: string
          nullable: true
          description: Fascia di recapitabilità (ad es. `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` o `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Indice numerico del rischio di violazione.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` quando l''indirizzo compare in una violazione recente.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` quando l''indirizzo compare in numerose violazioni.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` quando il dominio è un provider usa e getta.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` quando il dominio è un provider di email gratuito.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` quando l''indirizzo compare in violazioni note.'
        no_of_breaches:
          type: number
          nullable: true
          description: Numero di violazioni note che contengono l'indirizzo.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificatore Didit stabile del segnale, ad esempio
                  `IR-5AC67A32`. Opaco: usalo per raggruppare e filtrare, non
                  analizzarlo.
              value:
                nullable: true
                description: >-
                  Per un flag di rischio (ad esempio `voip`, `leaked`,
                  `disposable`, `spam_trap`), il suo valore: un booleano, un
                  livello o una data. Null per un codice motivo con punteggio.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: >-
                  Indica se il segnale ha aumentato il rischio o ha aggiunto
                  affidabilità.
              message:
                type: string
                description: Spiegazione di facile lettura del segnale, in inglese.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Con quale intensità il segnale ha modificato il punteggio, ad
                  esempio `low`, `medium` o `high`.
          description: >-
            Segnali che spiegano il punteggio, ciascuno con un codice Didit
            stabile, una direzione, un messaggio e un livello di impatto. Nel
            tempo possono comparire nuovi codici, pertanto non rifiutare i
            codici sconosciuti.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Identificatore della piattaforma.
          example: whatsapp
        category:
          type: string
          description: >-
            Categoria della piattaforma, ad es. MESSAGING, SOCIAL_MEDIA,
            ECOMMERCE, PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` per piattaforme globali, `local` per quelle specifiche di
            una regione.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: >-
            Piattaforme in questa categoria in cui la registrazione è
            confermata.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Quota delle piattaforme verificate della categoria con una
            registrazione, 0.0-1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nome del profilo, se esposto dalla piattaforma.
        photo:
          type: string
          nullable: true
          description: URL della foto del profilo, se esposto dalla piattaforma.
        about:
          type: string
          nullable: true
          description: >-
            Testo della bio/sezione informazioni del profilo, se esposto dalla
            piattaforma.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilità del profilo, se esposta dalla piattaforma.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Indica se il profilo è un account aziendale, quando la piattaforma
            lo rende disponibile.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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