> ## 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-Verifizierungsbericht: Datenlecks & OTP-JSON

> E-Mail-Verifizierungsdaten von Didit auswerten: OTP-Status, Datenlecks, Wegwerf-Adressen, sitzungsübergreifende Matches und Risikowarnungen.

Der Bericht zur E-Mail-Verifizierung erfasst das vollständige Ergebnis einer E-Mail-OTP-Abfrage: an wen die Nachricht gesendet wurde, ob die Adresse eine Wegwerfadresse oder unzustellbar ist, ob sie in bekannten Datenlecks auftaucht, wie viele Versuche der Benutzer unternommen hat, sowie alle sitzungsübergreifenden Übereinstimmungen mit Ihrer Sperrliste oder anderen genehmigten Benutzern.

Diese Seite dokumentiert die JSON-Struktur, die vom Entscheidungs-Endpoint zurückgegeben wird, damit Sie OTP-Ergebnisse, die Gefährdung durch Datenlecks und Risiko-Flags für jede verifizierte Adresse verarbeiten können.

![Didit-E-Mail-Verifizierungsbericht mit OTP-Ergebnis, Datenleck-Daten und Risiko-Flags](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/email-verification-report.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=4d153b7d3d9d4c88bc3932466af7ed29)

## Übersicht

Ein E-Mail-Bericht wird jedes Mal erstellt, wenn ein Workflow-Knoten die Funktion zur E-Mail-Verifizierung ausführt. Jeder Bericht stellt eine OTP-Abfrage für eine Adresse dar und enthält:

* Die verifizierte `email`-Adresse.
* Boolesche Risiko-Flags (`is_breached`, `is_disposable`, `is_undeliverable`) und das unterstützende `breaches[]`-Array aus einer Datenbank für Informationen zu Datenlecks.
* Die Anzahl der OTP-Sendeversuche (`verification_attempts`) und den Zeitstempel der Genehmigung.
* Ein chronologisches `lifecycle[]`-Protokoll aller Sende-, Wiederholungs- und Code-Überprüfungsversuche.
* Ein `matches[]`-Array, das dieselbe Adresse bei anderen genehmigten E-Mail-Verifizierungen oder auf Ihrer Sperrliste anzeigt.
* Ein `warnings[]`-Array – Risikoereignisse, die während der Verifizierung ausgegeben wurden (siehe [Warnungen zur E-Mail-Verifizierung](https://docs.didit.me/de/core-technology/email-verification/warnings-email-verification.md)).
* Eine `node_id`, die identifiziert, welcher Workflow-Graph-Knoten den Bericht erstellt hat (nur V3-Sitzungen).

In gehosteten Workflow-Sitzungen läuft die OTP-Abfrage innerhalb der Didit-Verifizierungs-UI ab – Sie lesen das Ergebnis lediglich aus der Entscheidungs-Payload ab. Für Server-zu-Server-OTP ohne gehosteten Ablauf verwenden Sie die eigenständige E-Mail-API: [`POST /v3/email/send/`](https://docs.didit.me/de/standalone-apis/email-send) stellt den Code zu und [`POST /v3/email/check/`](https://docs.didit.me/de/standalone-apis/email-check) validiert die Eingabe des Benutzers; abgeschlossene eigenständige Verifizierungen werden über dasselbe Berichtsformat bereitgestellt.

Gehostete Sitzungen begrenzen den Benutzer standardmäßig auf **2 falsche Code-Eingaben** (`email_max_check_attempts`) und **2 OTP-Sendungen – die anfängliche Sendung plus ein erneuter Versand** (`email_max_retries`), für jeden Workflow-Knoten anpassbar. Das Überschreiten eines dieser Limits schließt den Schritt als `Declined` mit `EMAIL_CODE_ATTEMPTS_EXCEEDED` ab.

## Wo es in API-Antworten vorkommt

Der Entscheidungs-Endpoint (`GET /v3/session/{sessionId}/decision/`) gibt E-Mail-Berichte unter dem Array-Schlüssel im Plural **`email_verifications`** zurück. Das Array enthält einen Eintrag pro E-Mail-Verifizierungs-Knoten im Workflow-Graphen – typischerweise einen, aber Step-up-Abläufe können mehrere erzeugen.

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

Ein `null`-Wert bedeutet, dass noch kein E-Mail-Verifizierungsschritt ausgeführt wurde. Iterieren Sie über das Array (anstatt nur `email_verifications[0]` auszulesen), wenn Ihr Workflow mehr als eine E-Mail-Adresse erfassen kann.

## Schema

Das kanonische Feld-für-Feld-Schema befindet sich auf der Seite [Datenmodelle](https://docs.didit.me/de/reference/data-models.md#e-mail-verifizierung).

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

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

Eine unzustellbare Adresse — ungültige Syntax, eine nicht existente Domain, fehlende MX-Einträge oder eine fehlgeschlagene OTP-Zustellung — schließt den Schritt als **`Declined`** mit der automatischen Ablehnungswarnung `UNDELIVERABLE_EMAIL_DETECTED` ab. Die einzige Ausnahme: Wenn der Benutzer die Adresse selbst eingegeben hat (sie wurde bei der Sitzungserstellung nicht vorausgefüllt), gibt ein unzustellbarer Versand einen Inline-Fehler zurück, sodass er es mit einer anderen Adresse erneut versuchen kann, anstatt sofort abgelehnt zu werden.

### Statuswerte

| Status | Bedeutung |
| - | - |
| `Not Finished` | Der OTP-Versand wurde initiiert, die Verifizierung wurde jedoch noch nicht abgeschlossen. |
| `Approved` | Der Benutzer hat ein gültiges OTP eingegeben, und es wurde kein Risiko ausgelöst, das zu einer Ablehnung führte. |
| `Declined` | Eine automatische Ablehnungswarnung wurde ausgelöst (Sperrliste, unzustellbare Adresse, die zulässige Anzahl an Versuchen wurde überschritten) oder eine auf `DECLINE` konfigurierte Risiko-Aktion wurde ausgelöst. |
| `In Review` | Eine auf `REVIEW` konfigurierte Risiko-Aktion hat den Schritt zur manuellen Prüfung weitergeleitet. |
| `Expired` | Das 5-minütige OTP-Zeitfenster ist ohne gültigen Code abgelaufen — gilt für Verifizierungen, die über die Standalone-E-Mail-API erstellt wurden. |

### Lifecycle-Ereignistypen

`lifecycle[]` ist chronologisch sortiert. Jedes Ereignis hat `type`, `timestamp`, `details` und eine abrechenbare `fee` (sofern zutreffend):

| Ereignistyp | Ausgelöst, wenn |
| - | - |
| `EMAIL_VERIFICATION_MESSAGE_SENT` | Erster OTP-Sendeversuch — einschließlich Sendungen, die als unzustellbar zurückkommen. |
| `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT` | Nachfolgender OTP-Versand, nachdem der Benutzer ein erneutes Senden angefordert hat. |
| `VALID_CODE_ENTERED` | Der Benutzer hat den korrekten OTP-Code übermittelt. |
| `INVALID_CODE_ENTERED` | Der Benutzer hat einen falschen oder abgelaufenen OTP-Code übermittelt (zählt zum Limit). |
| `EMAIL_VERIFICATION_APPROVED` | Status auf Funktionsebene wurde auf `Approved` gesetzt. |
| `EMAIL_VERIFICATION_DECLINED` | Status auf Funktionsebene wurde auf `Declined` gesetzt. |
| `EMAIL_VERIFICATION_IN_REVIEW` | Status auf Funktionsebene wurde auf `In Review` gesetzt. |
| `EMAIL_VERIFICATION_EXPIRED` | Das OTP-Zeitfenster ist ohne gültigen Code abgelaufen (Standalone-E-Mail-API). |

Die `details`-Payload hängt von der Ereignisfamilie ab:

* **Sendeereignisse** (`EMAIL_VERIFICATION_MESSAGE_SENT`, `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`) — `{ status, reason }`. `status` ist `Success`, `Retry` oder `Undeliverable`; `reason` ist `null`, es sei denn, der Versand ist fehlgeschlagen (`email_can_not_be_delivered` oder `unknown` für nicht erkannte Legacy-Werte).
* **Prüfereignisse** (`VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`) — `{ code_tried, status }` mit `status` `Approved`, `Failed`, `Expired or Not Found` oder `Declined`.
* **Ereignisse zum finalen Status** — `null`, außer `EMAIL_VERIFICATION_DECLINED` / `EMAIL_VERIFICATION_IN_REVIEW`, die `{ "reason": "<risk code>" }` enthalten (z. B. `UNDELIVERABLE_EMAIL_DETECTED`).

Sendungen mit `status` `Success` oder `Undeliverable` erfassen die E-Mail-Verifizierungsgebühr von \$0.02; `Retry`-Sendungen, Prüfereignisse und Statusereignisse enthalten immer `fee: 0`.

### Sitzungsübergreifende Übereinstimmungen

`matches[]` erfasst dieselbe Adresse bei **zuvor genehmigten** E-Mail-Verifizierungen in derselben Anwendung — über KYC-, KYB- und Standalone-API-Sitzungen hinweg — sowie Sperrlisten-Treffer, die in den [Management-API-Listen](https://docs.didit.me/de/management-api/lists/overview.md) konfiguriert sind. Verifizierungen, die die `vendor_data` der aktuellen Sitzung teilen, werden ausgeschlossen (derselbe Endbenutzer stimmt nicht mit sich selbst überein); das Array ist auf **5** Einträge begrenzt, sortiert von alt nach neu. Wenn sich die Adresse auf Ihrer Sperrliste befindet, aber keine der übereinstimmenden Sitzungen auf der Sperrliste steht, wird dem Array ein synthetischer Eintrag mit `source: "list_entry"` (alle Sitzungsfelder `null`) vorangestellt.

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

## Beispiele

### Genehmigt — sauberes OTP mit einer Informationswarnung

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

### Abgelehnt — unzustellbare Adresse

Eine vorausgefüllte Adresse, die die Syntax- oder DNS-/MX-Validierung nicht besteht — oder deren OTP-E-Mail nicht zugestellt werden kann —, wird sofort als `Declined` abgeschlossen. Es erscheinen keine Code-Prüfereignisse, da den Benutzer nie ein Code erreicht hat.

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

### Abgelehnt — gesperrte Wegwerf-Mailbox

Der Benutzer hat die OTP-Verifizierung abgeschlossen, aber die Adresse stimmte mit Ihrer E-Mail-Sperrliste überein (automatische Ablehnung). Das Wegwerf-Flag wird ebenfalls gesetzt — hier auf der Stufe `information`, da `disposable_email_action` auf dem Standardwert `NO_ACTION` belassen wurde.

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

## Verwandte Themen

* [Übersicht über die E-Mail-Verifizierung](https://docs.didit.me/de/core-technology/email-verification/overview.md) — Funktionsweise und Preise.
* [Warnungen der E-Mail-Verifizierung](https://docs.didit.me/de/core-technology/email-verification/warnings-email-verification.md) — alle Risikocodes, Ablehnungsauslöser und konfigurierbare Aktionen.
* [Datenmodelle — E-Mail-Verifizierung](https://docs.didit.me/de/reference/data-models.md#e-mail-verifizierung) — kanonisches Feld-für-Feld-Schema.
* [E-Mail-API — OTP senden](https://docs.didit.me/de/standalone-apis/email-send.md) und [OTP prüfen](https://docs.didit.me/de/standalone-apis/email-check.md) — eigenständige Server-zu-Server-Endpoints.
* [Management-API — Listen](https://docs.didit.me/de/management-api/lists/overview.md) — verwalten Sie die E-Mail-Sperrliste, die `matches[]` mit `source: list_entry` speist.


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