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

# Relatório de verificação de e-mail: vazamentos e OTP

> Leia o relatório de verificação de e-mail da Didit: ciclo do OTP, vazamentos, e-mails descartáveis, duplicados entre sessões e avisos de risco.

O relatório de Verificação de e-mail registra o resultado completo de um desafio OTP por e-mail: para quem a mensagem foi enviada, se o endereço é descartável ou não entregável, se ele aparece em vazamentos de dados conhecidos, quantas tentativas o usuário fez e quaisquer correspondências com a sua lista de bloqueio ou com outros usuários aprovados em diferentes sessões.

Esta página documenta o formato JSON retornado pelo endpoint de decisão, para que você possa interpretar os resultados do OTP, a exposição a vazamentos e os indicadores de risco de cada endereço verificado.

![Relatório de verificação de e-mail da Didit mostrando o resultado do OTP, dados de vazamentos e indicadores de risco](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)

## Visão geral

Um relatório de e-mail é gerado sempre que um nó do fluxo de verificação (workflow) executa o recurso de Verificação de e-mail. Cada relatório representa um desafio OTP para um endereço e contém:

* O endereço `email` verificado.
* Indicadores de risco booleanos (`is_breached`, `is_disposable`, `is_undeliverable`) e o array `breaches[]` de apoio, obtido de um banco de dados de inteligência sobre vazamentos.
* O número de tentativas de envio do OTP (`verification_attempts`) e a data e hora da aprovação.
* Um registro cronológico `lifecycle[]` de cada envio, nova tentativa e tentativa de verificação do código.
* Um array `matches[]` que mostra o mesmo endereço em outras verificações de e-mail aprovadas ou na sua lista de bloqueio.
* Um array `warnings[]`: eventos de risco emitidos durante a verificação (consulte [Avisos da Verificação de e-mail](https://docs.didit.me/pt-br/core-technology/email-verification/warnings-email-verification.md)).
* Um `node_id` que identifica qual nó do grafo do fluxo gerou o relatório (somente sessões V3).

Em sessões de fluxo hospedadas, o desafio OTP é executado dentro da interface de verificação da Didit; você apenas lê o resultado no payload da decisão. Para OTP de servidor para servidor sem um fluxo hospedado, use a API de e-mail independente: [`POST /v3/email/send/`](https://docs.didit.me/pt-br/standalone-apis/email-send) envia o código e [`POST /v3/email/check/`](https://docs.didit.me/pt-br/standalone-apis/email-check) valida o código digitado pelo usuário. As verificações independentes finalizadas aparecem no mesmo formato de relatório.

Por padrão, as sessões hospedadas limitam o usuário a **2 tentativas incorretas de inserir o código** (`email_max_check_attempts`) e a **2 envios de OTP, o envio inicial mais um reenvio** (`email_max_retries`), e esses limites podem ser ajustados em cada nó do fluxo. Ultrapassar qualquer um dos limites finaliza a etapa como `Declined` com `EMAIL_CODE_ATTEMPTS_EXCEEDED`.

## Onde aparece nas respostas da API

O endpoint de decisão (`GET /v3/session/{sessionId}/decision/`) retorna os relatórios de e-mail na chave de array plural **`email_verifications`**. O array contém uma entrada por nó de Verificação de e-mail no grafo do fluxo. Normalmente há uma, mas fluxos com verificação adicional (step-up) podem gerar várias.

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

Um valor `null` significa que ainda não foi executada nenhuma etapa de Verificação de e-mail. Percorra o array (em vez de ler `email_verifications[0]`) quando o seu fluxo puder coletar mais de um endereço de e-mail.

## Schema

O schema canônico, campo por campo, está na página [Modelos de dados](https://docs.didit.me/pt-br/reference/data-models.md#verificação-de-e-mail).

```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
}
```

Um endereço que não pode receber e-mails (sintaxe inválida, domínio inexistente, registros MX ausentes ou falha no envio do OTP) finaliza a etapa como **`Declined`** com o aviso de recusa automática `UNDELIVERABLE_EMAIL_DETECTED`. A única exceção: quando o próprio usuário digitou o endereço (ele não foi pré-preenchido na criação da sessão), um envio não entregue retorna um erro inline para que ele possa tentar novamente com outro endereço em vez de ser recusado imediatamente.

### Valores de status

| Status | Significado |
| - | - |
| `Not Finished` | O envio do OTP foi iniciado, mas a verificação ainda não foi finalizada. |
| `Approved` | O usuário inseriu um OTP válido e nenhum risco de recusa foi identificado. |
| `Declined` | Um aviso de recusa automática foi disparado (lista de bloqueio, endereço sem entrega, tentativas excedidas) ou uma ação de risco configurada como `DECLINE` foi acionada. |
| `In Review` | Uma ação de risco configurada como `REVIEW` encaminhou a etapa para revisão manual. |
| `Expired` | A janela de 5 minutos do OTP terminou sem um código válido. Aplica-se a verificações criadas pela API de e-mail independente. |

### Tipos de evento do ciclo de vida

`lifecycle[]` é ordenado cronologicamente. Cada evento tem `type`, `timestamp`, `details` e uma `fee` faturável (quando aplicável):

| Tipo de evento | Emitido quando |
| - | - |
| `EMAIL_VERIFICATION_MESSAGE_SENT` | Primeira tentativa de envio do OTP, incluindo envios não entregáveis. |
| `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT` | Envio posterior do OTP depois que o usuário solicitou o reenvio. |
| `VALID_CODE_ENTERED` | O usuário enviou o código OTP correto. |
| `INVALID_CODE_ENTERED` | O usuário enviou um código OTP errado ou expirado (conta para o limite). |
| `EMAIL_VERIFICATION_APPROVED` | O status no nível do recurso foi definido como `Approved`. |
| `EMAIL_VERIFICATION_DECLINED` | O status no nível do recurso foi definido como `Declined`. |
| `EMAIL_VERIFICATION_IN_REVIEW` | O status no nível do recurso foi definido como `In Review`. |
| `EMAIL_VERIFICATION_EXPIRED` | A janela do OTP terminou sem um código válido (API de e-mail independente). |

O payload de `details` depende da família do evento:

* **Eventos de envio** (`EMAIL_VERIFICATION_MESSAGE_SENT`, `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`): `{ status, reason }`. `status` é `Success`, `Retry` ou `Undeliverable`; `reason` é `null`, a menos que o envio tenha falhado (`email_can_not_be_delivered`, ou `unknown` para valores legados não reconhecidos).
* **Eventos de verificação** (`VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`): `{ code_tried, status }` com `status` igual a `Approved`, `Failed`, `Expired or Not Found` ou `Declined`.
* **Eventos de status final**: `null`, exceto `EMAIL_VERIFICATION_DECLINED` / `EMAIL_VERIFICATION_IN_REVIEW`, que trazem `{ "reason": "<risk code>" }` (por exemplo, `UNDELIVERABLE_EMAIL_DETECTED`).

Envios com `status` `Success` ou `Undeliverable` registram a taxa de \$0.02 da Verificação de e-mail; envios `Retry`, eventos de verificação e eventos de status sempre trazem `fee: 0`.

### Correspondências entre sessões

`matches[]` registra o mesmo endereço em verificações de e-mail **aprovadas anteriormente** na mesma aplicação (em sessões de KYC, KYB e da API independente), além de ocorrências na lista de bloqueio configurada nas [listas da management API](https://docs.didit.me/pt-br/management-api/lists/overview.md). Verificações que compartilham o `vendor_data` da sessão atual são excluídas (o mesmo usuário final não gera correspondência consigo mesmo), e o array é limitado a **5** entradas, ordenadas da mais antiga para a mais recente. Quando o endereço está na sua lista de bloqueio, mas nenhuma das sessões correspondentes está bloqueada, uma entrada sintética com `source: "list_entry"` (com todos os campos de sessão `null`) é adicionada ao início do array.

```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
}
```

## Exemplos

### Aprovado: OTP sem problemas com uma violação informativa

```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": []
}
```

### Recusado: endereço não entregável

Um endereço pré-preenchido que falha na validação de sintaxe ou de DNS (MX), ou cujo e-mail com o OTP não pode ser entregue, é finalizado imediatamente como `Declined`. Não aparecem eventos de verificação de código porque nenhum código chegou ao usuário.

```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": []
}
```

### Recusado: caixa de e-mail descartável na lista de bloqueio

O usuário concluiu o OTP, mas o endereço constava na sua lista de bloqueio de e-mails (recusa automática). O e-mail também é sinalizado como descartável, aqui no nível `information`, porque `disposable_email_action` permanece no padrão `NO_ACTION`.

```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"
    }
  ]
}
```

## Relacionados

* [Visão geral da Verificação de e-mail](https://docs.didit.me/pt-br/core-technology/email-verification/overview.md): comportamento do recurso e preços.
* [Avisos da Verificação de e-mail](https://docs.didit.me/pt-br/core-technology/email-verification/warnings-email-verification.md): todos os códigos de risco, gatilhos de recusa e ações configuráveis.
* [Modelos de dados: verificação de e-mail](https://docs.didit.me/pt-br/reference/data-models.md#verificação-de-e-mail): schema canônico, campo por campo.
* [API de e-mail: enviar OTP](https://docs.didit.me/pt-br/standalone-apis/email-send.md) e [verificar OTP](https://docs.didit.me/pt-br/standalone-apis/email-check.md): endpoints independentes para comunicação entre servidores.
* [Management API: listas](https://docs.didit.me/pt-br/management-api/lists/overview.md): gerencie a lista de bloqueio de e-mails que alimenta `matches[]` com `source: list_entry`.


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