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

# Validar codi OTP de correu: API de verificació

> Didit valida codis OTP de correu amb POST /v3/email/check/: filtracions, adreces temporals i entregabilitat. Pagament per ús, sense contractes.

## Complement d'intel·ligència

Defineix `enable_enrichment` com a `true` per executar també la intel·ligència de correu electrònic sobre l'adreça: una puntuació de risc i el seu historial de fuites de dades.
El complement es factura a \$0.05 per sol·licitud al preu de llista, a sobre del preu de la verificació.
La sol·licitud retorna `403` quan el teu saldo no pot cobrir-lo.

Tres camps determinen l'efecte dels senyals.
Cadascun pot ser `NO_ACTION` (el valor per defecte) o `DECLINE`, i cadascun només té efecte quan `enable_enrichment` és `true`.

| Camp | Es rebutja quan |
| - | - |
| `email_intelligence_score_action` | La puntuació de risc és superior al llindar. |
| `recent_email_breach_action` | L'adreça apareix en una fuita de dades recent i coneguda. |
| `frequent_email_breach_action` | L'adreça apareix en moltes fuites de dades conegudes. |

Amb `NO_ACTION`, el senyal es continua retornant a `email.email_intelligence`, de manera que pots aplicar la teva pròpia regla.


## OpenAPI

````yaml ca/openapi-25.json POST /v3/email/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: Comprovar el codi de correu electrònic
      description: >-
        Verifica l'OTP lliurat per [`POST
        /v3/email/send/`](/ca/standalone-apis/email-send) i obtén el resultat
        final de la verificació més intel·ligència de correu electrònic:
        capacitat de lliurament, exposició a filtracions (`is_breached` i la
        llista `breaches` d'una base de dades d'intel·ligència de filtracions),
        detecció de proveïdors d'un sol ús i ús duplicat de l'adreça entre les
        teves sessions.


        **Com troba la comprovació la verificació.** La coincidència es fa
        mitjançant la teva aplicació i l'adreça `email`; `request_id` no és una
        entrada. Es comprova la verificació pendent més recent creada durant els
        darrers **5 minuts**. Si no n'hi ha cap (mai enviada, ja finalitzada, no
        lliurable en el moment de l'enviament o de fa més de 5 minuts),
        l'endpoint retorna `200` amb `status: "Expired or Not Found"`.


        **Pressupost d'intents.** Cada verificació permet **3 intents de codi**.
        Els dos primers codis incorrectes retornen `status: "Failed"` amb els
        intents restants i `email: null`; el tercer codi incorrecte finalitza la
        verificació com a `Declined` amb una advertència
        `EMAIL_CODE_ATTEMPTS_EXCEEDED` i retorna l'informe complet de correu
        electrònic. Els codis es comparen sense distingir entre majúscules i
        minúscules (rellevant per a enviaments amb `alphanumeric_code`); només
        és vàlid el codi enviat més recentment.


        **Resultats.** `Approved`: codi correcte i cap risc de rebuig.
        `Declined`: terminal: el codi era correcte però ha coincidit un risc de
        rebuig (una acció `DECLINE` a continuació, una adreça a la llista de
        bloqueig o l'adreça s'ha trobat no lliurable en finalitzar), o s'ha
        esgotat el pressupost d'intents. `Failed`: codi incorrecte, queden
        intents. `Expired or Not Found`: res a comprovar. En
        `Approved`/`Declined`, el `request_id` coincideix amb el `request_id` de
        l'enviament (l'id de la sessió) i `email` inclou l'informe complet
        (`is_breached`, `breaches`, `is_disposable`, `is_undeliverable`,
        `warnings`, `lifecycle`, `matches`); en `Failed` i `Expired or Not
        Found`, el `request_id` és un UUID aleatori d'un sol ús.


        **Accions de risc.** `duplicated_email_action`, `breached_email_action`
        i `disposable_email_action` decideixen què passa quan es detecta el risc
        corresponent amb un codi correcte: `DECLINE` canvia l'estat final a
        `Declined`; `NO_ACTION` (per defecte) registra el risc a
        `email.warnings` sense afectar l'estat.


        **Facturació.** Les comprovacions són gratuïtes: el crèdit es consumeix
        amb l'enviament satisfactori.


        **Persistència de la sessió.** Una comprovació finalitzada actualitza la
        sessió creada per l'enviament (visible a la Business Console,
        consultable mitjançant `GET /v3/session/{sessionId}/decision/`) i activa
        un webhook `status.updated`.


        **Sandbox.** Les claus d'API de sandbox ometen tot el processament:
        qualsevol codi ben format (inclòs `123456`) retorna un payload estàtic
        `Approved` amb un objecte `email` simplificat (`status`, `email`,
        `is_breached`, `is_disposable`, `is_undeliverable`); l'entrada mal
        formada continua retornant `400`. No es persisteix res.


        **Autenticació.** Envia la clau d'API de la teva aplicació a la
        capçalera `x-api-key`. Les credencials absents o no vàlides retornen
        `403` (`{"detail": "You do not have permission to perform this
        action."}`); aquesta API mai retorna `401`.


        **Límit de freqüència.** Pressupost d'escriptura compartit de 300
        sol·licituds/min per clau d'API entre tots els endpoints
        POST/PATCH/DELETE; superar-lo retorna `429`.


        **Petjada social.** Estableix `enable_social` a `true` per afegir un
        bloc `email_social`: les plataformes en línia on aquesta adreça està
        registrada, amb recomptes per categoria i qualsevol detall de perfil
        disponible. `profiles_registered: 0` significa que s'han comprovat les
        plataformes i que l'adreça no s'ha trobat en cap d'elles: una resposta
        vàlida i facturable. El bloc no apareix quan no s'ha sol·licitat el
        complement o quan la comprovació no s'ha pogut completar, i en aquest
        cas no es factura. La facturació afegeix una unitat de `email_social`
        per sol·licitud al preu propi d'aquest endpoint.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    La mateixa adreça de correu electrònic utilitzada a la crida
                    corresponent [`POST
                    /v3/email/send/`](/ca/standalone-apis/email-send). Això és
                    el que enllaça la comprovació amb l'enviament.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    L'OTP que ha rebut l'usuari final: 4–8 dígits, o 4–8
                    lletres/dígits quan s'ha utilitzat `alphanumeric_code: true`
                    en el moment de l'enviament. La comparació no distingeix
                    entre majúscules i minúscules.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Què fer quan la mateixa adreça ja ha estat utilitzada i
                    aprovada per un usuari diferent (només compten les
                    verificacions prèviament aprovades) (diferent `vendor_data`)
                    de la teva aplicació. `DECLINE` canvia el `status` final a
                    `Declined`; `NO_ACTION` registra el risc a `email.warnings`
                    i emplena `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Què fer quan l'adreça apareix en filtracions de dades
                    conegudes (`email.is_breached`). `DECLINE` canvia el
                    `status` final a `Declined`; `NO_ACTION` registra el risc a
                    `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Què fer quan el domini pertany a un proveïdor de correu d'un
                    sol ús o temporal (`email.is_disposable`). `DECLINE` canvia
                    el `status` final a `Declined`; `NO_ACTION` registra el risc
                    a `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Quan és `true`, també executa intel·ligència de correu
                    electrònic a l'adreça: una puntuació de risc i el seu
                    historial de filtracions. Es factura com una unitat de
                    `email_intelligence_api` per sol·licitud ($0.05 a preu de
                    tarifa) a més del preu propi d'aquest endpoint. La
                    sol·licitud retorna `403` quan el teu saldo no pot
                    cobrir-ho.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Acció quan la puntuació de risc de la intel·ligència de
                    correu electrònic supera el llindar. `DECLINE` canvia
                    l'`status` final a `Declined`; `NO_ACTION` registra el
                    senyal sense rebutjar. Només té efecte quan
                    `enable_enrichment` és `true`.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Acció quan l'adreça apareix en una filtració de dades
                    coneguda i recent. `DECLINE` canvia el `status` final a
                    `Declined`; `NO_ACTION` registra el senyal sense rebutjar.
                    Només té efecte quan `enable_enrichment` és `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Acció quan l'adreça apareix en moltes filtracions de dades
                    conegudes. `DECLINE` canvia el `status` final a `Declined`;
                    `NO_ACTION` registra el senyal sense rebutjar. Només té
                    efecte quan `enable_enrichment` és `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Quan és cert, també consulta la petjada social de l'adreça:
                    les plataformes de correu electrònic, socials,
                    professionals, de comerç electrònic i d'entreteniment on
                    està registrada. Es factura com una unitat de `email_social`
                    per sol·licitud a més del preu propi d'aquest endpoint.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Acció quan la comprovació de petjada social no troba
                    l'adreça registrada a cap de les plataformes que cobreix. En
                    aquest endpoint només s'accepten NO_ACTION i DECLINE; REVIEW
                    està disponible a la clau de configuració del flux de
                    treball amb el mateix nom.
              required:
                - email
                - code
            examples:
              Default:
                summary: Registra qualsevol risc però no rebutgis mai automàticament
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: Rebutja automàticament bústies d'un sol ús i compromeses
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Comprovació completada — els codis incorrectes i les verificacions
            que falten també retornen `200`; inspecciona `status`, no el codi
            HTTP. `email` només s'emplena en resultats finalitzats
            (`Approved`/`Declined`), és `null` a `Failed`, i no apareix a
            `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    Codi correcte — adreça neta, informe complet de correu
                    electrònic
                  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: >-
                    Codi correcte; exposició a filtracions registrada com a
                    advertència (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: >-
                    Codi incorrecte: l'usuari pot reintentar; request_id aquí és
                    un UUID d'un sol ús
                  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: >-
                    Codi correcte, però l'adreça és d'un sol ús i
                    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: >-
                    No hi ha cap verificació pendent per a aquesta adreça en els
                    darrers 5 minuts
                  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: >-
            Error de validació — embolcall d'errors de camp de DRF: una matriu
            de missatges per camp infractor.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Adreça de correu electrònic amb format incorrecte
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` no s''ha inclòs al cos'
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            Permís denegat. Es retorna quan falta la capçalera `x-api-key`; una
            clau incorrecta, revocada o caducada retorna `401`. Les
            comprovacions són gratuïtes, de manera que aquí no hi ha cap
            comprovació de crèdit.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Sense capçalera `x-api-key`, o la clau no és vàlida/s'ha
                    revocat
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            S'ha superat el límit de freqüència. Els endpoints POST/PATCH/DELETE
            comparteixen un pressupost de 300 sol·licituds d'escriptura per
            minut per clau d'API (la creació de transaccions i la ingesta
            d'esdeveniments tenen un pressupost independent de 600). La resposta
            inclou les capçaleres `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` i `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Més de 300 sol·licituds d'escriptura en el minut actual
                  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: >-
            A `Approved`/`Declined`: l'identificador de sessió de la verificació
            coincident — idèntic al `request_id` retornat per `POST
            /v3/email/send/`. A `Failed` i `Expired or Not Found`: un UUID
            aleatori d'un sol ús que no es podrà consultar posteriorment.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — codi correcte, sense risc que provoqui rebuig.
            `Declined` — terminal: ha coincidit un risc que provoca rebuig o
            s'ha esgotat el pressupost d'intents (3). `Failed` — codi
            incorrecte, queden intents. `Expired or Not Found` — cap verificació
            pendent per a aquesta adreça en els darrers 5 minuts.
        message:
          type: string
          description: >-
            Explicació fàcil de llegir del resultat, inclòs el nombre d'intents
            restants després d'un codi incorrecte.
        email:
          type: object
          nullable: true
          description: >-
            Informe complet de correu electrònic. Present (no nul) només en
            resultats finalitzats (`Approved`/`Declined`); `null` a `Failed` i
            absent a `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Estat final de la verificació de correu electrònic. Coincideix
                amb el `status` de nivell superior per a les comprovacions
                finalitzades.
            email:
              type: string
              format: email
              description: L'adreça de correu electrònic verificada.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true` quan l'adreça apareix en filtracions de dades conegudes
                (cerca d'intel·ligència sobre filtracions executada en
                finalitzar).
            breaches:
              type: array
              description: >-
                Fins a les 5 filtracions conegudes més recents que contenen
                aquesta adreça. Matriu buida (o omesa) quan `is_breached` és
                `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Identificador de la filtració.
                  domain:
                    type: string
                    description: Domini del servei afectat per la filtració.
                  breach_date:
                    type: string
                    format: date
                    description: Data en què es va produir l'incompliment.
                  breach_emails_count:
                    type: integer
                    description: Nombre total de comptes exposats a la filtració.
                  description:
                    type: string
                    description: >-
                      Descripció fàcil de llegir de la vulneració (pot contenir
                      marcatge HTML).
                  logo_path:
                    type: string
                    description: URL del logotip del servei afectat per la filtració.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Categories de dades exposades, en snake_case (p. ex.,
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Indica si s'ha verificat que la filtració és legítima.
            is_disposable:
              type: boolean
              description: >-
                `true` quan el domini pertany a un proveïdor conegut de correu
                d'un sol ús o temporal.
            is_undeliverable:
              type: boolean
              description: >-
                `true` quan l'adreça no pot rebre correu (ha fallat la validació
                de sintaxi o DNS/MX, o el missatge ha rebotat).
            verification_attempts:
              type: integer
              description: >-
                Nombre d'enviaments d'OTP per a aquesta verificació (1, o 2
                després d'un reintent).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quan es va introduir el codi correcte. `null` si la verificació
                mai no es va aprovar.
            warnings:
              type: array
              description: >-
                Advertències de risc registrades durant la verificació
                (duplicate, breached, disposable, undeliverable, attempts
                exceeded, blocklist, etc.). Matriu buida si no n'hi ha cap.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: >-
                      Funcionalitat que ha generat l'advertència. Sempre `EMAIL`
                      aquí.
                  risk:
                    type: string
                    description: Codi de risc llegible per màquina.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Context específic del risc (p. ex., l'id de la sessió
                      duplicada per a riscos de duplicats). `null` quan el risc
                      no inclou dades addicionals.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Gravetat. Els riscos `error` fan que es rebutgi la
                      verificació, `warning` la marca per a revisió i
                      `information` es registra sense afectar l'estat.
                  short_description:
                    type: string
                    description: Resum d'una sola línia del risc, llegible per a humans.
                  long_description:
                    type: string
                    description: Explicació fàcil de llegir del risc.
            lifecycle:
              type: array
              description: >-
                Pista d'auditoria cronològica de la verificació. El `type` de
                l'esdeveniment és un dels següents:
                `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: Tipus d'esdeveniment.
                  timestamp:
                    type: string
                    format: date-time
                    description: Quan va ocórrer l'esdeveniment.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload específic de l'esdeveniment. Esdeveniments
                      d'enviament: `{status, reason}`. Esdeveniments
                      d'introducció de codi: `{code_tried, status}`.
                      Esdeveniments d'estat final: `null`, o `{reason}` si s'ha
                      rebutjat o està en revisió.
                  fee:
                    type: number
                    description: >-
                      Import en USD facturat per aquest esdeveniment. Diferent
                      de zero només en el primer enviament satisfactori; 0 per a
                      reintents, entrades de codi i esdeveniments d'estat.
            matches:
              type: array
              description: >-
                Altres sessions de la teva aplicació (KYC, KYB o API) on un
                usuari diferent (`vendor_data` diferent) ha utilitzat la mateixa
                adreça de correu electrònic. Fins a 5 entrades; s'afegeix al
                principi una coincidència sintètica de llista de bloqueig d'una
                entrada de llista quan n'hi ha una (i només quan no existeix cap
                correu electrònic a la llista de bloqueig derivat de la sessió)
                — les coincidències derivades de sessions mantenen l'ordre de
                created_at. Matriu buida quan no hi ha coincidències.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID de sessió de l'altra verificació que ha utilitzat
                      aquesta adreça de correu electrònic.
                  session_number:
                    type: integer
                    description: Número seqüencial fàcil de llegir d'aquesta sessió.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` d''aquella sessió.'
                  verification_date:
                    type: string
                    description: Quan es va crear aquesta sessió (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: L'adreça de correu electrònic coincident.
                  status:
                    type: string
                    description: >-
                      Estat d'aquesta sessió (p. ex., `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Indica si l'adreça de correu electrònic és a la llista de
                      bloqueig de la teva aplicació.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Per a sessions de tipus API, l'API independent que la va
                      crear (p. ex., `PHONE_VERIFICATION`); `null` per a
                      sessions de verificació habituals.
                  source:
                    type: string
                    description: >-
                      On s'ha trobat la coincidència. Normalment `session`; una
                      coincidència amb la llista de bloqueig mitjançant una
                      entrada de llista de l'organització anteposa una
                      coincidència sintètica amb `source: "list_entry"` i
                      `session_id`/`session_number` nuls.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                Senyals d'intel·ligència de correu electrònic. Només estan
                presents quan `enable_enrichment` era `true` a la comprovació.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` de la sessió de la verificació coincident. `null` a
            `Expired or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` de la sessió de la verificació coincident. `null` a
            `Expired or Not Found`.
        created_at:
          type: string
          format: date-time
          description: Marca de temps de la resposta d'aquesta comprovació.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Petjada social de l'adreça de correu electrònic: les plataformes en
        línia on està registrada. Només present si s'ha definit `enable_social`
        i la comprovació s'ha completat. Cada recompte pot ser nul si no s'han
        obtingut dades. `profiles_registered: 0` significa que s'han consultat
        les plataformes i que l'adreça de correu electrònic no s'ha trobat en
        cap d'elles: una resposta vàlida i facturable, i un senyal habitual
        d'identitat sintètica.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: >-
            Plataformes on l'adreça de correu electrònic està confirmada com a
            registrada.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plataformes avaluades per al registre.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plataformes que han retornat un nom associat.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plataformes que han retornat una foto de perfil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Plataformes de comunicació amb presència detectada.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categories de plataforma diferents amb presència detectada.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicador compost de maduresa digital, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicador de riquesa del perfil, de 0 a 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Combinació de plataformes gratuïtes i de pagament, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registres en plataformes gratuïtes.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registres en plataformes totalment de pagament.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registres en plataformes freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Completitud del perfil de WhatsApp. Només per a telèfon; null per a
            correu electrònic.
          example: Partial
        registered_platforms:
          type: array
          description: Plataformes on el registre està confirmat.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Plataformes comprovades amb resultat negatiu.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Recompte registrat i proporció per categoria de plataforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detalls del perfil per plataforma, indexats per plataforma, quan la
            plataforma els exposa.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Bloc d'intel·ligència de correu electrònic normalitzat. Només present
        quan el complement d'intel·ligència s'ha executat per a aquest correu
        electrònic; quan és present també s'exposa com l'àlies `enrichment` amb
        valors idèntics.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Puntuació de risc normalitzada de 0 a 100. Com més alta, més
            arriscada.
        deliverable:
          type: string
          nullable: true
          description: Franja de capacitat de lliurament (p. ex., `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` o `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Índex numèric de risc de vulneració.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` quan l''adreça apareix en una filtració recent.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` quan l''adreça apareix en moltes filtracions.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` quan el domini és un proveïdor d''un sol ús.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` quan el domini és un proveïdor de correu gratuït.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` quan l''adreça apareix en filtracions conegudes.'
        no_of_breaches:
          type: number
          nullable: true
          description: Nombre de filtracions conegudes que contenen l'adreça.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificador estable de Didit del senyal, per exemple
                  `IR-5AC67A32`. Opac: agrupa i filtra per ell, no l'analitzis
                  sintàcticament.
              value:
                nullable: true
                description: >-
                  Per a un indicador de risc (per exemple `voip`, `leaked`,
                  `disposable`, `spam_trap`), el seu valor: un booleà, un nivell
                  o una data. Null per a un codi de motiu amb puntuació.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Si el senyal ha augmentat el risc o ha reforçat la confiança.
              message:
                type: string
                description: Explicació fàcil de llegir del senyal, en anglès.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Amb quina intensitat ha modificat la puntuació el senyal, per
                  exemple `low`, `medium` o `high`.
          description: >-
            Senyals que expliquen la puntuació, cadascun amb un codi de Didit
            estable, una direcció, un missatge i un nivell d'impacte. Poden
            aparèixer codis nous al llarg del temps, de manera que no rebutgis
            els codis desconeguts.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Identificador de plataforma.
          example: whatsapp
        category:
          type: string
          description: >-
            Categoria de plataforma, p. ex. MESSAGING, SOCIAL_MEDIA, ECOMMERCE,
            PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` per a plataformes d'àmbit mundial, `local` per a les
            específiques d'una regió.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: Plataformes d'aquesta categoria on el registre està confirmat.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Proporció de les plataformes comprovades de la categoria amb un
            registre, 0.0-1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nom del perfil, quan la plataforma l'exposa.
        photo:
          type: string
          nullable: true
          description: URL de la foto de perfil, quan la plataforma l'exposa.
        about:
          type: string
          nullable: true
          description: Text d'informació/biografia del perfil, quan la plataforma l'exposa.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilitat del perfil, quan la plataforma l'exposa.
        business_account:
          type: boolean
          nullable: true
          description: Si el perfil és un compte d'empresa, quan la plataforma l'exposa.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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