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

# API para verificar OTP de e-mail: validar código

> Valide códigos de uso único por e-mail na Didit com POST /v3/email/check/: sinais de vazamento, e-mail descartável e entregabilidade. Pague por uso.

## Complemento de inteligência

Defina `enable_enrichment` como `true` para também executar a análise de inteligência de e-mail do endereço: uma pontuação de risco e o histórico de vazamentos de dados.
O complemento é cobrado a \$0.05 por requisição pelo preço de tabela, além do preço da verificação.
A requisição retorna `403` quando o seu saldo não consegue cobrir o custo.

Três campos definem o que acontece com os sinais.
Cada um é `NO_ACTION` (o padrão) ou `DECLINE`, e cada um só tem efeito quando `enable_enrichment` é `true`.

| Campo | Recusa quando |
| - | - |
| `email_intelligence_score_action` | A pontuação de risco está acima do limiar. |
| `recent_email_breach_action` | O endereço aparece em um vazamento de dados conhecido e recente. |
| `frequent_email_breach_action` | O endereço aparece em muitos vazamentos de dados conhecidos. |

Com `NO_ACTION`, o sinal continua sendo retornado em `email.email_intelligence`, para que você possa aplicar a sua própria regra.


## OpenAPI

````yaml pt-br/openapi-25.json POST /v3/email/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: Verificar código de e-mail
      description: >-
        Verifique o OTP entregue por [`POST
        /v3/email/send/`](/pt-br/standalone-apis/email-send) e obtenha o
        resultado final da verificação junto com a inteligência de e-mail:
        capacidade de entrega, exposição a vazamentos (`is_breached` e a lista
        `breaches`, de um banco de dados de inteligência sobre vazamentos),
        detecção de provedores descartáveis e uso duplicado do endereço entre as
        suas sessões.


        **Como a verificação é localizada.** A correspondência é feita pela sua
        aplicação mais o endereço `email`; `request_id` não é um dado de
        entrada. É verificada a verificação pendente mais recente criada nos
        últimos **5 minutos**. Se não houver nenhuma (nunca enviada, já
        finalizada, impossível de entregar no momento do envio ou com mais de 5
        minutos), o endpoint retorna `200` com `status: "Expired or Not Found"`.


        **Limite de tentativas.** Cada verificação permite **3 tentativas de
        código**. Os dois primeiros códigos incorretos retornam `status:
        "Failed"` com as tentativas restantes e `email: null`; o terceiro código
        incorreto finaliza a verificação como `Declined` com um aviso
        `EMAIL_CODE_ATTEMPTS_EXCEEDED` e retorna o relatório de e-mail completo.
        Os códigos são comparados sem diferenciar maiúsculas de minúsculas
        (relevante para envios `alphanumeric_code`); apenas o código enviado
        mais recentemente é válido.


        **Resultados.** `Approved`: código correto e nenhum risco que leve à
        recusa. `Declined`: final; o código estava correto, mas houve
        correspondência com um risco que leva à recusa (uma ação `DECLINE`
        abaixo, um endereço na lista de bloqueio ou um endereço identificado
        como impossível de entregar na finalização), ou o limite de tentativas
        foi esgotado. `Failed`: código incorreto, com tentativas restantes.
        `Expired or Not Found`: não há nada a verificar. Em
        `Approved`/`Declined`, o `request_id` é igual ao `request_id` do envio
        (o ID da sessão) e `email` traz o relatório completo (`is_breached`,
        `breaches`, `is_disposable`, `is_undeliverable`, `warnings`,
        `lifecycle`, `matches`); em `Failed` e `Expired or Not Found`, o
        `request_id` é um UUID aleatório de uso único.


        **Ações de risco.** `duplicated_email_action`, `breached_email_action` e
        `disposable_email_action` definem o que acontece quando o risco
        correspondente é detectado com um código correto: `DECLINE` muda o
        status final para `Declined`; `NO_ACTION` (padrão) registra o risco em
        `email.warnings` sem afetar o status.


        **Faturamento.** As verificações de código são gratuitas: o crédito é
        consumido pelo envio bem-sucedido.


        **Persistência da sessão.** Uma verificação finalizada atualiza a sessão
        criada pelo envio (visível no Business Console e consultável via `GET
        /v3/session/{sessionId}/decision/`) e dispara um webhook
        `status.updated`.


        **Sandbox.** Chaves de API de sandbox ignoram todo o processamento:
        qualquer código bem formado (incluindo `123456`) retorna um payload
        estático `Approved` com um objeto `email` simplificado (`status`,
        `email`, `is_breached`, `is_disposable`, `is_undeliverable`); entradas
        malformadas continuam retornando `400`. Nada é persistido.


        **Autenticação.** Envie a chave de API da sua aplicação no cabeçalho
        `x-api-key`. Credenciais ausentes ou inválidas retornam `403`
        (`{"detail": "You do not have permission to perform this action."}`);
        esta API nunca retorna `401`.


        **Limite de requisições.** Cota de escrita compartilhada de 300
        requisições/min por chave de API entre todos os endpoints
        POST/PATCH/DELETE; ultrapassá-la retorna `429`.


        **Presença em redes sociais.** Defina `enable_social` como `true` para
        adicionar um bloco `email_social`: as plataformas online em que este
        endereço está cadastrado, com contagens por categoria e os detalhes de
        perfil disponíveis. `profiles_registered: 0` significa que as
        plataformas foram verificadas e o endereço não foi encontrado em nenhuma
        delas, uma resposta válida e cobrada. O bloco fica ausente quando o
        complemento não foi solicitado ou quando a verificação não pôde ser
        concluída, e nesse caso não é cobrado. O faturamento adiciona uma
        unidade `email_social` por requisição, além do preço deste endpoint.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    O mesmo endereço de e-mail usado na chamada correspondente a
                    [`POST /v3/email/send/`](/pt-br/standalone-apis/email-send).
                    É isso que vincula a verificação ao envio.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    O OTP que o usuário final recebeu: de 4 a 8 dígitos, ou de 4
                    a 8 letras/dígitos quando `alphanumeric_code: true` foi
                    usado no envio. A comparação não diferencia maiúsculas de
                    minúsculas.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando o mesmo endereço já foi usado e aprovado
                    por outro usuário (somente verificações aprovadas
                    anteriormente são consideradas) (`vendor_data` diferente) da
                    sua aplicação. `DECLINE` altera o `status` final para
                    `Declined`; `NO_ACTION` registra o risco em `email.warnings`
                    e preenche `email.matches`.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando o endereço aparece em vazamentos de dados
                    conhecidos (`email.is_breached`). `DECLINE` muda o `status`
                    final para `Declined`; `NO_ACTION` registra o risco em
                    `email.warnings`.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando o domínio pertence a um provedor de
                    e-mail descartável/temporário (`email.is_disposable`).
                    `DECLINE` altera o `status` final para `Declined`;
                    `NO_ACTION` registra o risco em `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Quando `true`, também executa a inteligência de e-mail no
                    endereço: uma pontuação de risco e o histórico de
                    vazamentos. Cobrado como uma unidade
                    `email_intelligence_api` por requisição ($0.05 pelo preço de
                    tabela), além do preço próprio deste endpoint. A requisição
                    retorna `403` quando o seu saldo não é suficiente para
                    cobri-la.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando a pontuação de risco da inteligência de e-mail
                    está acima do limiar. `DECLINE` muda o `status` final para
                    `Declined`; `NO_ACTION` registra o sinal sem recusar. Só tem
                    efeito quando `enable_enrichment` é `true`.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o endereço aparece em um vazamento de dados
                    conhecido e recente. `DECLINE` muda o `status` final para
                    `Declined`; `NO_ACTION` registra o sinal sem recusar. Só tem
                    efeito quando `enable_enrichment` é `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o endereço aparece em muitos vazamentos de dados
                    conhecidos. `DECLINE` muda o `status` final para `Declined`;
                    `NO_ACTION` registra o sinal sem recusar. Só tem efeito
                    quando `enable_enrichment` é `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Quando verdadeiro, também consulta a presença digital do
                    endereço: as plataformas de e-mail, redes sociais,
                    profissionais, e-commerce e entretenimento em que ele está
                    cadastrado. Cobrado como uma unidade `email_social` por
                    requisição, além do preço deste endpoint.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando a verificação de pegada social não encontra o
                    endereço registrado em nenhuma das plataformas que ela
                    cobre. Somente NO_ACTION e DECLINE são aceitos neste
                    endpoint; REVIEW está disponível na chave de configuração do
                    fluxo de mesmo nome.
              required:
                - email
                - code
            examples:
              Default:
                summary: Registrar todos os riscos, mas nunca recusar automaticamente
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: >-
                  Recusar automaticamente caixas de entrada descartáveis e
                  vazadas
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Verificação concluída — códigos incorretos e verificações
            inexistentes também retornam `200`; confira `status`, não o código
            HTTP. `email` é preenchido apenas em resultados finalizados
            (`Approved`/`Declined`), é `null` em `Failed` e fica ausente em
            `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: 'Código correto: endereço limpo, relatório de e-mail completo'
                  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: >-
                    Código correto; exposição em vazamento registrada como aviso
                    (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: >-
                    Código incorreto: o usuário pode tentar novamente; aqui o
                    request_id é um UUID de uso único
                  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: >-
                    Código correto, mas o endereço é descartável e
                    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: >-
                    Nenhuma verificação pendente para este endereço nos últimos
                    5 minutos
                  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: >-
            Erro de validação: envelope de erros de campo do DRF, com um array
            de mensagens por campo com problema.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Endereço de e-mail com formato inválido
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: '`code` não incluído no corpo'
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            Permissão negada. Retornado quando o cabeçalho `x-api-key` está
            ausente; uma chave incorreta, revogada ou expirada retorna `401`. As
            verificações são gratuitas, portanto não há checagem de créditos
            aqui.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Nenhum cabeçalho `x-api-key`, ou a chave é inválida/revogada
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            Limite de requisições excedido. Todos os endpoints POST/PATCH/DELETE
            compartilham uma cota de 300 requisições de escrita por minuto por
            chave de API. A resposta inclui os cabeçalhos `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` e `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Mais de 300 requisições de escrita no minuto atual
                  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: >-
            Em `Approved`/`Declined`: o ID da sessão da verificação
            correspondente, idêntico ao `request_id` retornado por `POST
            /v3/email/send/`. Em `Failed` e `Expired or Not Found`: um UUID
            aleatório de uso único que não pode ser consultado depois.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved`: código correto, sem risco que cause recusa. `Declined`:
            terminal; um risco que causa recusa foi identificado ou o limite de
            tentativas (3) foi esgotado. `Failed`: código errado, ainda restam
            tentativas. `Expired or Not Found`: não há verificação pendente para
            este endereço nos últimos 5 minutos.
        message:
          type: string
          description: >-
            Explicação legível do resultado, incluindo o número de tentativas
            restantes após um código incorreto.
        email:
          type: object
          nullable: true
          description: >-
            Relatório completo de e-mail. Presente (não nulo) somente em
            resultados finalizados (`Approved`/`Declined`); `null` em `Failed` e
            ausente em `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Status final da verificação de e-mail. Corresponde ao `status`
                de nível superior nas verificações finalizadas.
            email:
              type: string
              format: email
              description: O endereço de e-mail verificado.
              example: alice@example.com
            is_breached:
              type: boolean
              description: >-
                `true` quando o endereço aparece em vazamentos de dados
                conhecidos (consulta de inteligência sobre vazamentos executada
                na finalização).
            breaches:
              type: array
              description: >-
                Até 5 vazamentos conhecidos mais recentes que contêm este
                endereço. Array vazio (ou omitido) quando `is_breached` é
                `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Identificador do vazamento.
                  domain:
                    type: string
                    description: Domínio do serviço vazado.
                  breach_date:
                    type: string
                    format: date
                    description: Data em que a violação ocorreu.
                  breach_emails_count:
                    type: integer
                    description: Número total de contas expostas no vazamento.
                  description:
                    type: string
                    description: >-
                      Descrição legível do vazamento (pode conter marcação
                      HTML).
                  logo_path:
                    type: string
                    description: URL do logotipo do serviço vazado.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Categorias de dados expostos, em snake_case (por exemplo,
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Se o vazamento foi verificado como legítimo.
            is_disposable:
              type: boolean
              description: >-
                `true` quando o domínio pertence a um provedor conhecido de
                e-mail descartável/temporário.
            is_undeliverable:
              type: boolean
              description: >-
                `true` quando o endereço não pode receber e-mails (falha na
                validação de sintaxe ou de DNS/MX, ou a mensagem foi devolvida).
            verification_attempts:
              type: integer
              description: >-
                Número de envios de OTP para esta verificação (1, ou 2 após uma
                nova tentativa).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quando o código correto foi inserido. `null` se a verificação
                nunca foi aprovada.
            warnings:
              type: array
              description: >-
                Avisos de risco registrados durante a verificação (duplicado,
                vazado, descartável, não entregável, tentativas excedidas, lista
                de bloqueio etc.). Array vazio quando não há nenhum.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: Recurso que gerou o aviso. Sempre `EMAIL` aqui.
                  risk:
                    type: string
                    description: Código de risco legível por máquina.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Contexto específico do risco (por exemplo, o ID da sessão
                      duplicada para riscos de duplicidade). `null` quando o
                      risco não traz dados adicionais.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Severidade. Riscos `error` recusam a verificação,
                      `warning` a sinaliza para revisão e `information` é
                      registrado sem afetar o status.
                  short_description:
                    type: string
                    description: Resumo legível do risco em uma linha.
                  long_description:
                    type: string
                    description: Explicação legível do risco.
            lifecycle:
              type: array
              description: >-
                Trilha de auditoria cronológica da verificação. O `type` do
                evento é um destes: `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: Tipo de evento.
                  timestamp:
                    type: string
                    format: date-time
                    description: Quando o evento ocorreu.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload específico do evento. Eventos de envio: `{status,
                      reason}`. Eventos de inserção de código: `{code_tried,
                      status}`. Eventos de status final: `null`, ou `{reason}`
                      quando recusado ou em revisão.
                  fee:
                    type: number
                    description: >-
                      Valor em USD cobrado por este evento. Diferente de zero
                      apenas no primeiro envio bem-sucedido; 0 para novas
                      tentativas, inserções de código e eventos de status.
            matches:
              type: array
              description: >-
                Outras sessões da sua aplicação (KYC, KYB ou API) em que o mesmo
                endereço de e-mail foi usado por um usuário diferente
                (`vendor_data` diferente). Até 5 entradas; uma correspondência
                sintética de entrada da lista de bloqueio é adicionada no início
                quando presente (e somente quando não existe nenhum e-mail
                bloqueado derivado de sessão); as correspondências derivadas de
                sessões mantêm a ordem de created_at. Array vazio quando não há
                correspondências.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID da sessão da outra verificação que usou este endereço
                      de e-mail.
                  session_number:
                    type: integer
                    description: Número sequencial de fácil leitura dessa sessão.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` dessa sessão.'
                  verification_date:
                    type: string
                    description: Quando essa sessão foi criada (`YYYY-MM-DDTHH:MM:SSZ`).
                  email:
                    type: string
                    description: O endereço de e-mail correspondente.
                  status:
                    type: string
                    description: >-
                      Status dessa sessão (por exemplo, `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Se o endereço de e-mail está na lista de bloqueio da sua
                      aplicação.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Para sessões do tipo API, a API independente que a criou
                      (por exemplo, `PHONE_VERIFICATION`); `null` para sessões
                      de verificação comuns.
                  source:
                    type: string
                    description: >-
                      Onde a correspondência foi encontrada. Normalmente
                      `session`; uma ocorrência na lista de bloqueio por meio de
                      uma entrada de lista da organização adiciona no início uma
                      correspondência sintética com `source: "list_entry"` e
                      `session_id`/`session_number` nulos.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: >-
                Sinais de inteligência de e-mail. Presente apenas quando
                `enable_enrichment` era `true` na verificação.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` da sessão da verificação correspondente. `null` em
            `Expired or Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` da sessão da verificação correspondente. `null` em
            `Expired or Not Found`.
        created_at:
          type: string
          format: date-time
          description: Data e hora desta resposta de verificação.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Pegada social do endereço de e-mail: as plataformas online em que ele
        está cadastrado. Presente apenas quando `enable_social` foi definido e a
        verificação foi concluída. Qualquer contagem pode ser nula quando nenhum
        dado foi retornado para ela. `profiles_registered: 0` significa que as
        plataformas foram verificadas e o endereço de e-mail não foi encontrado
        em nenhuma delas: uma resposta válida, faturável e um sinal comum de
        identidade sintética.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: Plataformas em que o cadastro do endereço de e-mail foi confirmado.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plataformas avaliadas quanto a cadastro.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plataformas que retornaram um nome associado.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plataformas que retornaram uma foto de perfil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Plataformas de comunicação com presença detectada.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categorias distintas de plataforma com presença detectada.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicador composto de maturidade digital, de 0 a 10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicador de riqueza do perfil, de 0 a 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Combinação de plataformas gratuitas e pagas, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registros em plataformas gratuitas.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registros em plataformas totalmente pagas.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registros em plataformas freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Completude do perfil do WhatsApp. Apenas para telefone; null para
            e-mail.
          example: Partial
        registered_platforms:
          type: array
          description: Plataformas em que o cadastro foi confirmado.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Plataformas verificadas com resultado negativo.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Contagem de registros e proporção por categoria de plataforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detalhes do perfil por plataforma, indexados por plataforma, quando
            a plataforma os disponibiliza.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Bloco normalizado de inteligência de e-mail. Presente apenas quando o
        complemento de inteligência foi executado para este e-mail; quando
        presente, também é exposto como o alias `enrichment`, com valores
        idênticos.
      properties:
        score:
          type: number
          nullable: true
          description: >-
            Pontuação de risco normalizada de 0 a 100. Quanto maior, mais
            arriscado.
        deliverable:
          type: string
          nullable: true
          description: Faixa de entregabilidade (por exemplo, `high`).
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` ou `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: Índice numérico de risco de vazamento.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` quando o endereço aparece em um vazamento recente.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` quando o endereço aparece em muitos vazamentos.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` quando o domínio é um provedor descartável.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` quando o domínio é um provedor de e-mail gratuito.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` quando o endereço aparece em vazamentos conhecidos.'
        no_of_breaches:
          type: number
          nullable: true
          description: Número de vazamentos conhecidos que contêm o endereço.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificador estável da Didit para o sinal, por exemplo
                  `IR-5AC67A32`. Opaco: agrupe e filtre por ele, mas não o
                  interprete.
              value:
                nullable: true
                description: >-
                  Para um indicador de risco (por exemplo, `voip`, `leaked`,
                  `disposable`, `spam_trap`), o seu valor: um booleano, um nível
                  ou uma data. Nulo para um código de motivo com pontuação.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Se o sinal aumentou o risco ou acrescentou confiança.
              message:
                type: string
                description: Explicação legível do sinal, em inglês.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Com que intensidade o sinal alterou a pontuação, por exemplo
                  `low`, `medium` ou `high`.
          description: >-
            Sinais que explicam a pontuação, cada um com um código estável da
            Didit, uma direção, uma mensagem e um nível de impacto. Novos
            códigos podem surgir com o tempo, portanto não rejeite códigos
            desconhecidos.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Identificador da plataforma.
          example: whatsapp
        category:
          type: string
          description: >-
            Categoria da plataforma, por exemplo MESSAGING, SOCIAL_MEDIA,
            ECOMMERCE, PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: >-
            `global` para plataformas de alcance mundial, `local` para
            plataformas específicas de uma região.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: Plataformas desta categoria em que o cadastro foi confirmado.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Proporção das plataformas verificadas da categoria com cadastro, de
            0.0 a 1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Nome do perfil, quando a plataforma o disponibiliza.
        photo:
          type: string
          nullable: true
          description: URL da foto do perfil, quando a plataforma a disponibiliza.
        about:
          type: string
          nullable: true
          description: Texto "sobre"/bio do perfil, quando a plataforma o disponibiliza.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Visibilidade do perfil, quando a plataforma a disponibiliza.
        business_account:
          type: boolean
          nullable: true
          description: Se o perfil é uma conta comercial, quando a plataforma informa isso.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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