> ## 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: violação e OTP JSON

> Analise respostas de Verificação de e-mail da Didit: ciclo de vida do OTP, exposição a violações, e-mails descartáveis e avisos de risco.

O relatório de Verificação de e-mail regista 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 consta de violações de dados conhecidas, quantas tentativas o utilizador realizou e quaisquer correspondências entre sessões com a sua lista de bloqueio ou outros utilizadores aprovados.

Esta página documenta a estrutura JSON devolvida pelo endpoint de decisão para que possa analisar resultados de OTP, exposição a violações de dados e sinalizadores de risco para cada endereço verificado.

![Relatório de verificação de e-mail da Didit a mostrar o resultado do OTP, dados de violações e sinalizadores 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

É gerado um relatório de e-mail sempre que um nó do fluxo executa a funcionalidade Verificação de e-mail. Cada relatório representa um desafio OTP para um endereço e contém:

* O endereço de `email` verificado.
* Sinalizadores de risco booleanos (`is_breached`, `is_disposable`, `is_undeliverable`) e o array de suporte `breaches[]` obtido a partir de uma base de dados de inteligência sobre violações de dados.
* A contagem de tentativas de envio de OTP (`verification_attempts`) e o timestamp de aprovação.
* Um registo cronológico `lifecycle[]` de cada tentativa de envio, nova tentativa e verificação de código.
* Um array `matches[]` que identifica o mesmo endereço noutras 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 de Verificação de e-mail](https://docs.didit.me/pt/core-technology/email-verification/warnings-email-verification.md)).
* Um `node_id` que identifica qual nó do grafo do fluxo gerou o relatório (apenas em sessões V3).

Em sessões de fluxo alojadas, o desafio OTP é executado dentro da interface de verificação da Didit — apenas precisa de ler o resultado a partir do payload de decisão. Para OTP de servidor para servidor sem um fluxo alojado, utilize a API de e-mail autónoma: [`POST /v3/email/send/`](https://docs.didit.me/pt/standalone-apis/email-send) entrega o código e [`POST /v3/email/check/`](https://docs.didit.me/pt/standalone-apis/email-check) valida a introdução do código pelo utilizador; as verificações autónomas finalizadas são apresentadas através da mesma estrutura de relatório.

As sessões alojadas limitam o utilizador a **2 introduções de código erradas** (`email_max_check_attempts`) e a **2 envios de OTP — o envio inicial mais um reenvio** (`email_max_retries`) por predefinição, configuráveis por nó do fluxo. Exceder qualquer um dos limites finaliza o passo como `Declined` com `EMAIL_CODE_ATTEMPTS_EXCEEDED`.

## Onde surge nas respostas da API

O endpoint de decisão (`GET /v3/session/{sessionId}/decision/`) devolve relatórios de e-mail com a chave de array no plural **`email_verifications`**. O array contém uma entrada por cada nó de Verificação de e-mail no grafo do fluxo — tipicamente uma, mas fluxos de escalamento 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 nenhum passo de Verificação de e-mail foi ainda executado. Itere sobre o array (em vez de ler `email_verifications[0]`) quando o seu fluxo puder recolher mais do que um endereço de e-mail.

## Esquema

O esquema canónico campo a campo encontra-se na página [Modelos de dados](https://docs.didit.me/pt/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 não entregável — sintaxe inválida, domínio inexistente, registos MX em falta ou falha na entrega do OTP — finaliza o passo como **`Declined`** com o aviso de recusa automática `UNDELIVERABLE_EMAIL_DETECTED`. A única exceção: quando o utilizador introduziu ele próprio o endereço (não foi pré-preenchido na criação da sessão), um envio que não possa ser entregue devolve um erro em linha para que possa tentar novamente com um endereço diferente em vez de ser recusado de imediato.

### Valores de estado

| Estado | Significado |
| - | - |
| `Not Finished` | O envio do OTP foi iniciado, mas a verificação ainda não foi finalizada. |
| `Approved` | O utilizador introduziu um OTP válido e não foi identificado nenhum risco que implicasse recusa. |
| `Declined` | Foi acionado um aviso de recusa automática (lista de bloqueio, endereço não entregável, tentativas excedidas) ou foi acionada uma ação de risco configurada para `DECLINE`. |
| `In Review` | Uma ação de risco configurada para `REVIEW` encaminhou o passo para revisão manual. |
| `Expired` | A janela de 5 minutos do OTP decorreu sem nenhum código válido — aplica-se a verificações criadas através da API de e-mail autónoma. |

### Tipos de eventos do ciclo de vida

`lifecycle[]` está 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 de OTP — incluindo envios devolvidos como não entregáveis. |
| `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT` | Envio de OTP subsequente após o utilizador solicitar um novo envio. |
| `VALID_CODE_ENTERED` | O utilizador submeteu o código OTP correto. |
| `INVALID_CODE_ENTERED` | O utilizador submeteu um código OTP incorreto ou expirado (conta para o limite máximo). |
| `EMAIL_VERIFICATION_APPROVED` | O estado ao nível da funcionalidade foi definido como `Approved`. |
| `EMAIL_VERIFICATION_DECLINED` | O estado ao nível da funcionalidade foi definido como `Declined`. |
| `EMAIL_VERIFICATION_IN_REVIEW` | O estado ao nível da funcionalidade foi definido como `In Review`. |
| `EMAIL_VERIFICATION_EXPIRED` | A janela do OTP decorreu sem um código válido (API de e-mail autónoma). |

O payload `details` depende da família de eventos:

* **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` `Approved`, `Failed`, `Expired or Not Found` ou `Declined`.
* **Eventos de estado final** — `null`, exceto `EMAIL_VERIFICATION_DECLINED` / `EMAIL_VERIFICATION_IN_REVIEW`, que contêm `{ "reason": "<risk code>" }` (por exemplo, `UNDELIVERABLE_EMAIL_DETECTED`).

Envios com `status` `Success` ou `Undeliverable` registam a taxa de \$0.02 de Verificação de e-mail; envios de `Retry`, eventos de verificação e eventos de estado contêm sempre `fee: 0`.

### Correspondências entre sessões

`matches[]` regista o mesmo endereço em verificações de e-mail **anteriormente aprovadas** na mesma aplicação — entre sessões de KYC, KYB e API autónoma — além de correspondências na lista de bloqueio configuradas nas [listas da API de gestão](https://docs.didit.me/pt/management-api/lists/overview.md). As verificações que partilham o `vendor_data` da sessão atual são excluídas (o mesmo utilizador final não corresponde a si próprio), o array está 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á na lista de bloqueio, uma entrada sintética com `source: "list_entry"` (todos os campos da sessão `null`) é acrescentada no 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

### Aprovada — OTP limpo com uma infraçã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": []
}
```

### Recusada — endereço não entregável

Um endereço pré-preenchido que falhe a validação de sintaxe ou de DNS (MX) — ou cujo e-mail com o OTP não possa ser entregue — finaliza imediatamente como `Declined`. Não surgem eventos de verificação de código, uma vez que nenhum código chegou ao utilizador.

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

### Recusada — caixa de correio descartável na lista de bloqueio

O utilizador concluiu a verificação por OTP, mas o endereço foi encontrado na sua lista de bloqueio de e-mails (recusa automática). O sinalizador de e-mail descartável também é ativado — neste caso ao nível de `information`, uma vez que `disposable_email_action` foi mantido no seu valor predefinido `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"
    }
  ]
}
```

## Conteúdo relacionado

* [Visão geral da Verificação de e-mail](https://docs.didit.me/pt/core-technology/email-verification/overview.md) — comportamento da funcionalidade e preços.
* [Avisos da Verificação de e-mail](https://docs.didit.me/pt/core-technology/email-verification/warnings-email-verification.md) — todos os códigos de risco, acionadores de recusa e ações configuráveis.
* [Modelos de dados — verificação de e-mail](https://docs.didit.me/pt/reference/data-models.md#verificação-de-e-mail) — esquema canónico campo a campo.
* [API de e-mail — Send OTP](https://docs.didit.me/pt/standalone-apis/email-send.md) e [Check OTP](https://docs.didit.me/pt/standalone-apis/email-check.md) — endpoints autónomos de servidor para servidor.
* [API de gestão — Listas](https://docs.didit.me/pt/management-api/lists/overview.md) — faça a gestão da 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.