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

# E-Mail-Code prüfen: API zur Validierung von E-Mail-OTPs

> POST /v3/email/check/ prüft einen Einmalcode per E-Mail mit Signalen zu Datenlecks, Wegwerfadressen und Zustellbarkeit. Abrechnung pro Nutzung, ohne Verträge.

## Intelligence-Add-on

Setzen Sie `enable_enrichment` auf `true`, um zusätzlich eine E-Mail-Intelligence-Analyse für die Adresse durchzuführen: einen Risiko-Score und ihre Historie von Datenlecks.
Das Add-on wird zum Listenpreis von \$0.05 pro Anfrage berechnet, zusätzlich zum Preis der Prüfung.
Die Anfrage gibt `403` zurück, wenn Ihr Guthaben nicht ausreicht.

Drei Felder bestimmen, was die Signale bewirken.
Jedes ist entweder `NO_ACTION` (der Standard) oder `DECLINE`, und jedes wirkt nur, wenn `enable_enrichment` den Wert `true` hat.

| Feld | Ablehnung erfolgt, wenn |
| - | - |
| `email_intelligence_score_action` | Der Risiko-Score über dem Schwellenwert liegt. |
| `recent_email_breach_action` | Die Adresse in einem kürzlich erfolgten, bekannten Datenleck auftaucht. |
| `frequent_email_breach_action` | Die Adresse in vielen bekannten Datenlecks auftaucht. |

Bei `NO_ACTION` wird das Signal trotzdem in `email.email_intelligence` zurückgegeben, sodass Sie Ihre eigene Regel anwenden können.


## OpenAPI

````yaml de/openapi-25.json POST /v3/email/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: E-Mail-Code prüfen
      description: >-
        Verifizieren Sie den über [`POST
        /v3/email/send/`](/de/standalone-apis/email-send) zugestellten OTP und
        erhalten Sie das finale Verifizierungsergebnis sowie Informationen zur
        E-Mail: Zustellbarkeit, Datenleck-Status (`is_breached` und die
        `breaches`-Liste aus einer Datenbank zu Datenlecks), Erkennung von
        Wegwerf-Anbietern und mehrfache Nutzung der Adresse über Ihre Sitzungen
        hinweg.


        **Wie die Prüfung die Verifizierung findet.** Der Abgleich erfolgt über
        Ihre Anwendung sowie die `email`-Adresse – `request_id` ist keine
        Eingabe. Es wird die neueste ausstehende Verifizierung geprüft, die
        innerhalb der letzten **5 Minuten** erstellt wurde. Gibt es keine (nie
        gesendet, bereits abgeschlossen, zum Sendezeitpunkt unzustellbar oder
        älter als 5 Minuten), gibt der Endpoint `200` mit `status: "Expired or
        Not Found"` zurück.


        **Versuchskontingent.** Jede Verifizierung erlaubt **3 Code-Versuche**.
        Die ersten beiden falschen Codes geben `status: "Failed"` mit den
        verbleibenden Versuchen und `email: null` zurück; der dritte falsche
        Code schließt die Verifizierung als `Declined` mit einer
        `EMAIL_CODE_ATTEMPTS_EXCEEDED`-Warnung ab und gibt den vollständigen
        E-Mail-Bericht zurück. Codes werden ohne Berücksichtigung von
        Groß-/Kleinschreibung verglichen (relevant für Versendungen mit
        `alphanumeric_code`); nur der zuletzt gesendete Code ist gültig.


        **Ergebnisse.** `Approved` – korrekter Code und kein ablehnendes Risiko.
        `Declined` – endgültig: Der Code war korrekt, aber ein ablehnendes
        Risiko zutraf (eine `DECLINE`-Aktion unten, eine Adresse auf der
        Sperrliste oder die Adresse wurde beim Abschluss als unzustellbar
        eingestuft) oder das Versuchskontingent wurde aufgebraucht. `Failed` –
        falscher Code, verbleibende Versuche. `Expired or Not Found` – nichts zu
        prüfen. Bei `Approved`/`Declined` entspricht `request_id` der
        `request_id` des Sendevorgangs (der Sitzungs-ID) und `email` enthält den
        vollständigen Bericht (`is_breached`, `breaches`, `is_disposable`,
        `is_undeliverable`, `warnings`, `lifecycle`, `matches`); bei `Failed`
        und `Expired or Not Found` ist `request_id` eine einmalige zufällige
        UUID.


        **Risikoaktionen.** `duplicated_email_action`, `breached_email_action`
        und `disposable_email_action` bestimmen, was geschieht, wenn bei einem
        korrekten Code das entsprechende Risiko erkannt wird: `DECLINE` setzt
        den finalen Status auf `Declined`; `NO_ACTION` (Standard) erfasst das
        Risiko in `email.warnings`, ohne den Status zu beeinflussen.


        **Abrechnung.** Prüfungen sind kostenlos – der Credit wird durch das
        erfolgreiche Senden verbraucht.


        **Sitzungspersistenz.** Eine abgeschlossene Prüfung aktualisiert die
        durch das Senden erstellte Sitzung (sichtbar in der Business Console,
        abrufbar über `GET /v3/session/{sessionId}/decision/`) und löst einen
        `status.updated`-Webhook aus.


        **Sandbox.** Sandbox-API-Schlüssel überspringen die gesamte
        Verarbeitung: Jeder wohlgeformte Code (einschließlich `123456`) gibt
        eine statische `Approved`-Payload mit einem vereinfachten `email`-Objekt
        (`status`, `email`, `is_breached`, `is_disposable`, `is_undeliverable`)
        zurück; fehlerhafte Eingaben geben weiterhin `400` zurück. Nichts wird
        persistent gespeichert.


        **Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im
        `x-api-key`-Header. Fehlende oder ungültige Anmeldedaten geben `403`
        (`{"detail": "You do not have permission to perform this action."}`)
        zurück – diese API gibt niemals `401` zurück.


        **Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro
        API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei
        Überschreitung wird `429` zurückgegeben.


        **Sozialer Fußabdruck.** Setzen Sie `enable_social` auf `true`, um einen
        `email_social`-Block hinzuzufügen: die Online-Plattformen, auf denen
        diese Adresse registriert ist, mit Anzahlen pro Kategorie und allen
        verfügbaren Profildetails. `profiles_registered: 0` bedeutet, dass die
        Plattformen geprüft wurden und die Adresse auf keiner davon gefunden
        wurde – eine gültige, abrechenbare Antwort. Der Block fehlt, wenn das
        Add-on nicht angefordert wurde oder die Prüfung nicht abgeschlossen
        werden konnte, und wird in diesem Fall nicht abgerechnet. Die Abrechnung
        fügt eine `email_social`-Einheit pro Anfrage zusätzlich zum eigenen
        Preis dieses Endpoints hinzu.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    Dieselbe E-Mail-Adresse, die im zugehörigen Aufruf von
                    [`POST /v3/email/send/`](/de/standalone-apis/email-send)
                    verwendet wurde. Dadurch wird die Prüfung mit dem Versand
                    verknüpft.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    Das OTP, das der Endbenutzer erhalten hat: 4–8 Ziffern oder
                    4–8 Buchstaben/Ziffern, wenn beim Senden `alphanumeric_code:
                    true` verwendet wurde. Beim Abgleich wird die
                    Groß-/Kleinschreibung nicht berücksichtigt.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Was zu tun ist, wenn dieselbe Adresse bereits von einem
                    anderen Benutzer Ihrer Anwendung verwendet und genehmigt
                    wurde (nur zuvor genehmigte Verifizierungen zählen) (andere
                    `vendor_data`). `DECLINE` ändert den finalen `status` zu
                    `Declined`; `NO_ACTION` erfasst das Risiko in
                    `email.warnings` und befüllt `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Was zu tun ist, wenn die Adresse in bekannten Datenlecks
                    auftaucht (`email.is_breached`). `DECLINE` setzt den
                    endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das
                    Risiko in `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Was zu tun ist, wenn die Domain zu einem Anbieter für
                    Wegwerf-/Temporär-E-Mails gehört (`email.is_disposable`).
                    `DECLINE` ändert den finalen `status` zu `Declined`;
                    `NO_ACTION` erfasst das Risiko in `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Wenn `true`, wird zusätzlich eine E-Mail-Intelligence für
                    die Adresse ausgeführt: ein Risiko-Score und ihre Historie
                    von Datenpannen. Wird als eine
                    `email_intelligence_api`-Einheit pro Anfrage ($0.05 zum
                    Listenpreis) zusätzlich zum eigenen Preis dieses Endpoints
                    abgerechnet. Die Anfrage gibt `403` zurück, wenn Ihr
                    Guthaben dies nicht decken kann.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Aktion, wenn der Risiko-Score der E-Mail-Intelligence über
                    dem Schwellenwert liegt. `DECLINE` ändert den endgültigen
                    `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne
                    abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf
                    `true` gesetzt ist.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Aktion, wenn die Adresse in einer kürzlich bekannt
                    gewordenen Datenpanne vorkommt. `DECLINE` ändert den
                    endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das
                    Signal, ohne abzulehnen. Wird nur wirksam, wenn
                    `enable_enrichment` auf `true` gesetzt ist.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Aktion, wenn die Adresse in vielen bekannten Datenpannen
                    vorkommt. `DECLINE` ändert den endgültigen `status` auf
                    `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen.
                    Wird nur wirksam, wenn `enable_enrichment` auf `true`
                    gesetzt ist.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Wenn true, wird auch der digitale Fußabdruck der Adresse
                    ermittelt – die E-Mail-, Social-, Berufs-, E-Commerce- und
                    Unterhaltungsplattformen, auf denen sie registriert ist.
                    Wird als eine `email_social`-Einheit pro Anfrage zusätzlich
                    zum regulären Preis dieses Endpoints abgerechnet.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Aktion, wenn die Prüfung des digitalen Fußabdrucks (Social
                    Footprint) ergibt, dass die Adresse auf keiner der
                    abgedeckten Plattformen registriert ist. An diesem Endpoint
                    werden nur NO_ACTION und DECLINE akzeptiert; REVIEW ist über
                    den gleichnamigen Workflow-Konfigurationsschlüssel
                    verfügbar.
              required:
                - email
                - code
            examples:
              Default:
                summary: Alle Risiken erfassen, aber nie automatisch ablehnen
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: >-
                  Wegwerf- und kompromittierte E-Mail-Postfächer automatisch
                  ablehnen
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Prüfung abgeschlossen – falsche Codes und fehlende Verifizierungen
            geben ebenfalls `200` zurück; prüfen Sie `status`, nicht den
            HTTP-Code. `email` ist nur bei abgeschlossenen Ergebnissen
            (`Approved`/`Declined`) ausgefüllt, `null` bei `Failed` und fehlt
            bei `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    Korrekter Code – saubere Adresse, vollständiger
                    E-Mail-Bericht
                  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: >-
                    Korrekter Code; Gefährdung durch ein Datenleck als Warnung
                    erfasst (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: >-
                    Falscher Code – der Benutzer kann es erneut versuchen;
                    request_id ist hier eine einmalige UUID
                  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: >-
                    Korrekter Code, aber die Adresse ist eine Wegwerfadresse und
                    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: >-
                    Keine ausstehende Verifizierung für diese Adresse in den
                    letzten 5 Minuten
                  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: >-
            Validierungsfehler – DRFs Feldfehler-Envelope: ein Array von
            Meldungen pro fehlerhaftem Feld.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Ungültige E-Mail-Adresse
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` ist nicht im Body enthalten'
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key`
            fehlt; ein falscher, widerrufener oder abgelaufener Schlüssel gibt
            `401` zurück. Prüfungen sind kostenlos, daher erfolgt hier keine
            Credit-Prüfung.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Kein `x-api-key`-Header, oder der Schlüssel ist
                    ungültig/widerrufen
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich
            ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel
            (Transaktionserstellungen und Ereignis-Ingestion haben ein separates
            Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Mehr als 300 Schreibanfragen in der aktuellen Minute
                  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: >-
            Bei `Approved`/`Declined`: die Sitzungs-ID der zugeordneten
            Verifizierung – identisch mit der von `POST /v3/email/send/`
            zurückgegebenen `request_id`. Bei `Failed` und `Expired or Not
            Found`: eine zufällige einmalige UUID, die später nicht
            nachgeschlagen werden kann.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — korrekter Code, kein zur Ablehnung führendes Risiko.
            `Declined` — endgültig: Ein zur Ablehnung führendes Risiko lag vor
            oder das Kontingent an Versuchen (3) wurde aufgebraucht. `Failed` —
            falscher Code, verbleibende Versuche vorhanden. `Expired or Not
            Found` — keine ausstehende Verifizierung für diese Adresse in den
            letzten 5 Minuten.
        message:
          type: string
          description: >-
            Lesbare Erklärung des Ergebnisses, einschließlich der verbleibenden
            Anzahl von Versuchen nach einem falschen Code.
        email:
          type: object
          nullable: true
          description: >-
            Vollständiger E-Mail-Bericht. Nur bei finalisierten Ergebnissen
            (`Approved`/`Declined`) vorhanden (nicht null); `null` bei `Failed`
            und nicht vorhanden bei `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Endgültiger Status der E-Mail-Verifizierung. Entspricht dem
                übergeordneten `status` für abgeschlossene Prüfungen.
            email:
              type: string
              format: email
              description: Die verifizierte E-Mail-Adresse.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true`, wenn die Adresse in bekannten Datenpannen vorkommt
                (Abfrage von Datenpannen-Erkenntnissen bei Abschluss
                ausgeführt).
            breaches:
              type: array
              description: >-
                Bis zu 5 der neuesten bekannten Datenlecks, die diese Adresse
                enthalten. Leeres Array (oder weggelassen), wenn `is_breached`
                den Wert `false` hat.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Breach-Identifikator.
                  domain:
                    type: string
                    description: >-
                      Domain des von der Sicherheitsverletzung betroffenen
                      Dienstes.
                  breach_date:
                    type: string
                    format: date
                    description: Datum, an dem der Verstoß auftrat.
                  breach_emails_count:
                    type: integer
                    description: Gesamtzahl der bei der Datenpanne offengelegten Konten.
                  description:
                    type: string
                    description: >-
                      Lesbare Beschreibung der Verletzung (kann HTML-Markup
                      enthalten).
                  logo_path:
                    type: string
                    description: >-
                      URL des Logos des von einer Datenschutzverletzung
                      betroffenen Dienstes.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Kategorien offengelegter Daten in snake_case (z. B.
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Gibt an, ob das Datenleck als legitim verifiziert wurde.
            is_disposable:
              type: boolean
              description: >-
                `true`, wenn die Domain zu einem bekannten Anbieter von
                Wegwerf-/Temporär-E-Mails gehört.
            is_undeliverable:
              type: boolean
              description: >-
                `true`, wenn die Adresse keine E-Mails empfangen kann
                (fehlgeschlagene Syntax- oder DNS/MX-Validierung oder die
                Nachricht wurde unzustellbar zurückgewiesen).
            verification_attempts:
              type: integer
              description: >-
                Anzahl der OTP-Sendungen für diese Verifizierung (1, oder 2 nach
                einem Wiederholungsversuch).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Wann der korrekte Code eingegeben wurde. `null`, wenn die
                Verifizierung nie genehmigt wurde.
            warnings:
              type: array
              description: >-
                Während der Verifizierung erfasste Risikowarnungen (Duplikat,
                kompromittiert, Einwegadresse, unzustellbar, Versuche
                überschritten, Sperrliste usw.). Leeres Array, wenn keine
                vorhanden sind.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: Funktion, die die Warnung erzeugt hat. Hier immer `EMAIL`.
                  risk:
                    type: string
                    description: Maschinenlesbarer Risiko-Code.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Risikospezifischer Kontext (z. B. die ID der duplizierten
                      Sitzung bei Duplikatsrisiken). `null`, wenn das Risiko
                      keine zusätzlichen Daten enthält.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Schweregrad. `error`-Risiken führen zur Ablehnung der
                      Verifizierung, `warning` markiert sie zur Prüfung,
                      `information` wird erfasst, ohne den Status zu
                      beeinflussen.
                  short_description:
                    type: string
                    description: >-
                      Für Menschen lesbare einzeilige Zusammenfassung des
                      Risikos.
                  long_description:
                    type: string
                    description: Lesbare Erklärung des Risikos.
            lifecycle:
              type: array
              description: >-
                Chronologischer Audit-Trail der Verifizierung. Der
                Ereignis-`type` ist einer von `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: Ereignistyp.
                  timestamp:
                    type: string
                    format: date-time
                    description: Wann das Ereignis stattgefunden hat.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Ereignisspezifische Payload. Sende-Ereignisse: `{status,
                      reason}`. Code-Eingabe-Ereignisse: `{code_tried, status}`.
                      Finale Status-Ereignisse: `null` oder `{reason}`, wenn
                      abgelehnt oder in Prüfung.
                  fee:
                    type: number
                    description: >-
                      Für dieses Ereignis abgerechneter USD-Betrag. Nur beim
                      ersten erfolgreichen Senden ungleich null; 0 bei
                      Wiederholungsversuchen, Code-Eingaben und
                      Statusereignissen.
            matches:
              type: array
              description: >-
                Andere Sitzungen Ihrer Anwendung (KYC, KYB oder API), bei denen
                dieselbe E-Mail-Adresse von einem anderen Benutzer verwendet
                wurde (unterschiedliche `vendor_data`). Bis zu 5 Einträge; ein
                synthetischer Sperrlisten-Treffer aus einem Listeneintrag wird
                vorangestellt, falls vorhanden (und nur, wenn keine aus einer
                Sitzung abgeleitete, auf der Sperrliste stehende E-Mail
                existiert) – aus Sitzungen abgeleitete Treffer behalten die
                Reihenfolge nach created_at bei. Leeres Array, wenn keine
                Treffer vorliegen.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      Sitzungs-ID der anderen Verifizierung, die diese
                      E-Mail-Adresse verwendet hat.
                  session_number:
                    type: integer
                    description: Benutzerfreundliche fortlaufende Nummer dieser Sitzung.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` dieser Sitzung.'
                  verification_date:
                    type: string
                    description: >-
                      Wann diese Sitzung erstellt wurde
                      (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: Die übereinstimmende E-Mail-Adresse.
                  status:
                    type: string
                    description: >-
                      Status dieser Sitzung (z. B. `Approved`, `Declined`, `In
                      Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Gibt an, ob die E-Mail-Adresse auf der Sperrliste Ihrer
                      Anwendung steht.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Für Sitzungen vom API-Typ: die eigenständige API, die sie
                      erstellt hat (z. B. `PHONE_VERIFICATION`); `null` für
                      reguläre Verifizierungssitzungen.
                  source:
                    type: string
                    description: >-
                      Wo die Übereinstimmung gefunden wurde. Normalerweise
                      `session`; ein Sperrlisten-Treffer über einen
                      Organisationslisteneintrag stellt eine synthetische
                      Übereinstimmung mit `source: "list_entry"` und Nullwerten
                      für `session_id`/`session_number` voran.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                E-Mail-Intelligence-Signale. Nur vorhanden, wenn
                `enable_enrichment` bei der Prüfung `true` war.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` der Sitzung der übereinstimmenden Verifizierung.
            `null` bei `Expired or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` der Sitzung der zugeordneten Verifizierung. `null` bei
            `Expired or Not Found`.
        created_at:
          type: string
          format: date-time
          description: Zeitstempel dieser Prüfungsantwort.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Social Footprint der E-Mail-Adresse: die Online-Plattformen, auf denen
        sie registriert ist. Nur vorhanden, wenn `enable_social` gesetzt war und
        die Prüfung abgeschlossen wurde. Jeder Zähler kann null sein, wenn dafür
        keine Daten zurückgegeben wurden. `profiles_registered: 0` bedeutet,
        dass die Plattformen geprüft wurden und die E-Mail-Adresse auf keiner
        davon gefunden wurde – eine gültige, abrechenbare Antwort und ein
        häufiges Signal für eine synthetische Identität.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: >-
            Plattformen, bei denen die E-Mail-Adresse nachweislich registriert
            ist.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Auf Registrierung geprüfte Plattformen.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plattformen, die einen zugehörigen Namen zurückgegeben haben.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plattformen, die ein Profilfoto zurückgegeben haben.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Kommunikationsplattformen mit erkannter Präsenz.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Unterschiedliche Plattformkategorien mit erkannter Präsenz.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Zusammengesetzter Indikator für digitale Reife, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indikator für die Profilreichhaltigkeit, 0–10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Mix aus kostenlosen vs. kostenpflichtigen Plattformen, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registrierungen auf kostenlosen Plattformen.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registrierungen auf rein kostenpflichtigen Plattformen.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registrierungen auf Freemium-Plattformen.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Vollständigkeit des WhatsApp-Profils. Nur für Telefonnummern; null
            für E-Mail-Adressen.
          example: Partial
        registered_platforms:
          type: array
          description: Plattformen, bei denen eine Registrierung bestätigt ist.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Geprüfte Plattformen mit negativem Ergebnis.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Anzahl der Registrierungen und Verhältnis pro Plattformkategorie.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Profildetails pro Plattform, geschlüsselt nach Plattform, sofern die
            Plattform diese bereitstellt.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Normalisierter E-Mail-Intelligence-Block. Nur vorhanden, wenn das
        Intelligence-Add-on für diese E-Mail ausgeführt wurde; falls vorhanden,
        wird er auch als `enrichment`-Alias mit identischen Werten
        bereitgestellt.
      properties:
        score:
          type: number
          nullable: true
          description: Normalisierter Risiko-Score von 0–100. Höher ist riskanter.
        deliverable:
          type: string
          nullable: true
          description: Zustellbarkeitsbereich (z. B. `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` oder `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Numerischer Breach-Risiko-Index.
        is_recent_breach:
          type: boolean
          nullable: true
          description: >-
            `true`, wenn die Adresse in einer kürzlich aufgetretenen Datenpanne
            vorkommt.
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true`, wenn die Adresse in vielen Datenpannen vorkommt.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true`, wenn die Domain ein Wegwerf-Anbieter ist.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true`, wenn die Domain ein Freemail-Anbieter ist.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true`, wenn die Adresse in bekannten Datenpannen vorkommt.'
        no_of_breaches:
          type: number
          nullable: true
          description: Anzahl bekannter Datenlecks, die die Adresse enthalten.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Stabiler Didit-Identifikator des Signals, zum Beispiel
                  `IR-5AC67A32`. Opak: danach gruppieren und filtern, nicht
                  parsen.
              value:
                nullable: true
                description: >-
                  Für ein Risiko-Flag (beispielsweise `voip`, `leaked`,
                  `disposable`, `spam_trap`): dessen Wert: ein boolescher Wert,
                  eine Stufe oder ein Datum. Null für einen bewerteten
                  Grundcode.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: >-
                  Gibt an, ob das Signal das Risiko erhöht oder das Vertrauen
                  gestärkt hat.
              message:
                type: string
                description: Lesbare Erklärung des Signals, auf Englisch.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Wie stark das Signal den Score beeinflusst hat, zum Beispiel
                  `low`, `medium` oder `high`.
          description: >-
            Signale, die den Score erklären, jeweils mit einem stabilen
            Didit-Code, einer Richtung, einer Nachricht und einer
            Auswirkungsstufe. Im Laufe der Zeit können neue Codes hinzukommen;
            weisen Sie unbekannte Codes daher nicht ab.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Plattform-Identifikator.
          example: whatsapp
        category:
          type: string
          description: >-
            Plattformkategorie, z. B. MESSAGING, SOCIAL_MEDIA, ECOMMERCE,
            PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` für weltweite Plattformen, `local` für regionsspezifische
            Plattformen.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: >-
            Plattformen in dieser Kategorie, bei denen eine Registrierung
            bestätigt ist.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Anteil der geprüften Plattformen der Kategorie mit einer
            Registrierung, 0.0-1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Profilname, sofern die Plattform diesen bereitstellt.
        photo:
          type: string
          nullable: true
          description: Profilfoto-URL, sofern die Plattform diese bereitstellt.
        about:
          type: string
          nullable: true
          description: Profil-Info-/Bio-Text, sofern die Plattform diesen bereitstellt.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Profilsichtbarkeit, sofern die Plattform diese bereitstellt.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Gibt an, ob das Profil ein Geschäftskonto ist, sofern die Plattform
            dies bereitstellt.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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