> ## 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 de validação de código OTP por e-mail

> Valide OTPs de e-mail com POST /v3/email/check/ da Didit: sinais de violação, e-mails descartáveis e entregabilidade. Pagamento por utilização.

## Complemento de inteligência

Defina `enable_enrichment` como `true` para também executar a inteligência de e-mail sobre o endereço: uma pontuação de risco e o respetivo histórico de violações de dados.
O complemento é faturado a \$0.05 por pedido, ao preço de tabela, além do preço da verificação.
O pedido devolve `403` quando o seu saldo não cobre este valor.

Três campos determinam o efeito dos sinais.
Cada um pode ter o valor `NO_ACTION` (predefiniçã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 numa violação de dados conhecida e recente. |
| `frequent_email_breach_action` | O endereço aparece em muitas violações de dados conhecidas. |

Com `NO_ACTION`, o sinal continua a ser devolvido em `email.email_intelligence`, para que possa aplicar a sua própria regra.


## OpenAPI

````yaml pt/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/standalone-apis/email-send) e obtenha o resultado
        final da verificação juntamente com informações de inteligência sobre o
        e-mail: capacidade de entrega, exposição a violações de dados
        (`is_breached` e a lista `breaches` de uma base de dados de inteligência
        sobre violações de dados), deteção de fornecedores de e-mail
        descartáveis e utilização duplicada do endereço entre as suas sessões.


        **Como é encontrada a verificação.** A correspondência é feita pela sua
        aplicação juntamente com o endereço de `email` — `request_id` não é um
        parâmetro de entrada. A verificação pendente mais recente criada nos
        últimos **5 minutos** é verificada. Se não existir nenhuma (nunca
        enviada, já finalizada, não entregável no momento do envio ou com mais
        de 5 minutos), o endpoint devolve `200` com `status: "Expired or Not
        Found"`.


        **Limite de tentativas.** Cada verificação permite **3 tentativas de
        código**. Os primeiros dois códigos incorretos devolvem `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 devolve o relatório de e-mail completo.
        Os códigos são comparados sem distinção entre maiúsculas e minúsculas
        (relevante para envios de `alphanumeric_code`); apenas o código enviado
        mais recentemente é válido.


        **Resultados.** `Approved` — código correto e nenhum risco de recusa.
        `Declined` — terminal: o código estava correto, mas foi detetado um
        risco de recusa (uma ação `DECLINE` abaixo, um endereço incluído na
        lista de bloqueio ou o endereço foi considerado não entregável na
        finalização), ou o limite de tentativas esgotou-se. `Failed` — código
        incorreto, com tentativas restantes. `Expired or Not Found` — nada a
        verificar. Em `Approved`/`Declined`, o `request_id` é igual ao
        `request_id` do envio (o ID da sessão) e `email` inclui 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` decidem o que acontece quando o risco
        correspondente é detetado com um código correto: `DECLINE` altera o
        estado final para `Declined`; `NO_ACTION` (predefinição) regista o risco
        em `email.warnings` sem afetar o estado.


        **Faturação.** As verificações 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 na Business Console, consultável via `GET
        /v3/session/{sessionId}/decision/`) e aciona um webhook
        `status.updated`.


        **Sandbox.** As chaves de API de sandbox ignoram todo o processamento:
        qualquer código bem formatado (`123456` incluído) devolve um payload
        estático de `Approved` com um objeto `email` simplificado (`status`,
        `email`, `is_breached`, `is_disposable`, `is_undeliverable`); dados de
        entrada malformados continuam a devolver `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 devolvem `403`
        (`{"detail": "You do not have permission to perform this action."}`) —
        esta API nunca devolve `401`.


        **Limite de pedidos.** Limite partilhado de escrita de 300 pedidos/min
        por chave de API em todos os endpoints POST/PATCH/DELETE; exceder este
        limite devolve `429`.


        **Pegada social.** Defina `enable_social` como `true` para adicionar um
        bloco `email_social`: as plataformas online onde este endereço está
        registado, com contagens por categoria e todos 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 faturável. O bloco está ausente quando o suplemento
        não foi solicitado ou a verificação não pôde ser concluída, não sendo
        faturado nesse caso. A faturação adiciona uma unidade de `email_social`
        por pedido ao preço próprio 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 utilizado na chamada [`POST
                    /v3/email/send/`](/pt/standalone-apis/email-send)
                    correspondente. É isto que associa a verificação ao envio.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    O OTP que o utilizador final recebeu: 4–8 dígitos, ou 4–8
                    letras/dígitos quando `alphanumeric_code: true` foi
                    utilizado no momento do 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 utilizado e
                    aprovado por um utilizador diferente (apenas contam
                    verificações aprovadas anteriormente) (com um `vendor_data`
                    diferente) da sua aplicação. `DECLINE` altera o `status`
                    final para `Declined`; `NO_ACTION` regista 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 constar de fugas de dados
                    conhecidas (`email.is_breached`). `DECLINE` altera o
                    `status` final para `Declined`; `NO_ACTION` regista 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 fornecedor de
                    e-mail temporário/descartável (`email.is_disposable`).
                    `DECLINE` altera o `status` final para `Declined`;
                    `NO_ACTION` regista o risco em `email.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Quando `true`, executa também inteligência de e-mail sobre o
                    endereço: uma pontuação de risco e o respetivo histórico de
                    violações de dados. Faturado como uma unidade
                    `email_intelligence_api` por pedido ($0.05 ao preço de
                    tabela), além do próprio preço deste endpoint. O pedido
                    devolve `403` quando o seu saldo não for suficiente para
                    cobri-lo.
                  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` altera o `status` final para
                    `Declined`; `NO_ACTION` regista o sinal sem recusar. Apenas
                    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 surge numa violação de dados
                    conhecida recente. `DECLINE` altera o `status` final para
                    `Declined`; `NO_ACTION` regista o sinal sem recusar. Só
                    produz efeitos quando `enable_enrichment` for `true`.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o endereço surge em muitas violações de dados
                    conhecidas. `DECLINE` altera o `status` final para
                    `Declined`; `NO_ACTION` regista o sinal sem recusar. Só
                    produz efeitos quando `enable_enrichment` for `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Quando for true, consulta também a pegada social do
                    endereço: as plataformas de e-mail, redes sociais,
                    profissionais, de comércio eletrónico e de entretenimento
                    nas quais está registado. Faturado como uma unidade
                    `email_social` por pedido, além do preço do próprio
                    endpoint.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando a verificação da pegada social deteta que o
                    endereço não está registado em nenhuma das plataformas
                    abrangidas. Apenas NO_ACTION e DECLINE são aceites neste
                    endpoint; REVIEW está disponível na chave de configuração do
                    fluxo com o mesmo nome.
              required:
                - email
                - code
            examples:
              Default:
                summary: Registar quaisquer riscos, mas nunca recusar automaticamente
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: >-
                  Recusar automaticamente caixas de correio descartáveis e
                  comprometidas
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            Verificação concluída — códigos errados e verificações em falta
            também devolvem `200`; inspecione `status`, não o código HTTP.
            `email` é preenchido apenas em resultados finalizados
            (`Approved`/`Declined`), `null` em `Failed` e 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 completo de
                    e-mail
                  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 a uma violação de dados registada
                    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 utilizador pode tentar novamente; o
                    request_id aqui é um UUID de utilização única
                  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 erro de campo do DRF: um array de
            mensagens por campo com problemas.
          content:
            application/json:
              examples:
                Invalid email:
                  summary: Endereço de e-mail mal formatado
                  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. Devolvido quando o cabeçalho `x-api-key` está em
            falta; uma chave incorreta, revogada ou expirada devolve `401`. As
            verificações são gratuitas, pelo que não existe qualquer verificação
            de crédito aqui.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Sem 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 pedidos excedido. Os endpoints POST/PATCH/DELETE partilham
            um orçamento de 300 pedidos de escrita por minuto por chave de API
            (as criações de transações e a ingestão de eventos têm um orçamento
            separado de 600). 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 pedidos 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` devolvido por `POST
            /v3/email/send/`. Em `Failed` e `Expired or Not Found`: um UUID
            pontual aleatório que não pode ser consultado mais tarde.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — código correto, sem risco de recusa. `Declined` —
            terminal: um risco de recusa correspondeu ou o limite de tentativas
            (3) esgotou-se. `Failed` — código incorreto, tentativas restantes.
            `Expired or Not Found` — nenhuma 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) apenas 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: >-
                Estado final da verificação de e-mail. Corresponde ao `status`
                de nível superior para 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 surge em violações de dados conhecidas
                (pesquisa de informações sobre violações executada na
                finalização).
            breaches:
              type: array
              description: >-
                Até 5 violações conhecidas mais recentes que contêm este
                endereço. Array vazio (ou omitido) quando `is_breached` for
                `false`.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: Identificador da violação.
                  domain:
                    type: string
                    description: Domínio do serviço afetado pela violação.
                  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 na violação de dados.
                  description:
                    type: string
                    description: Descrição legível da violação (pode conter marcação HTML).
                  logo_path:
                    type: string
                    description: URL do logótipo do serviço comprometido.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      Categorias de dados expostos, em snake_case (por ex.,
                      `email_addresses`, `passwords`).
                  is_verified:
                    type: boolean
                    description: Indica se a violação foi verificada como legítima.
            is_disposable:
              type: boolean
              description: >-
                `true` quando o domínio pertence a um fornecedor conhecido de
                e-mail descartável/temporário.
            is_undeliverable:
              type: boolean
              description: >-
                `true` quando o endereço não pode receber correio (falha na
                validação de sintaxe ou 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
                tentar novamente).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quando o código correto foi introduzido. `null` se a verificação
                nunca tiver sido aprovada.
            warnings:
              type: array
              description: >-
                Avisos de risco registados durante a verificação (duplicado,
                violado, descartável, não entregue, tentativas excedidas, lista
                de bloqueio, etc.). Array vazio quando não existirem.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: Funcionalidade que gerou o aviso. Aqui é sempre `EMAIL`.
                  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 de sessão
                      duplicado para riscos de duplicado). `null` quando o risco
                      não contiver dados adicionais.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Gravidade. Os riscos `error` levam à recusa da
                      verificação, `warning` sinaliza-a para revisão e
                      `information` é registada sem afetar o estado.
                  short_description:
                    type: string
                    description: Resumo de uma linha legível por humanos sobre o risco.
                  long_description:
                    type: string
                    description: Explicação legível do risco.
            lifecycle:
              type: array
              description: >-
                Registo de auditoria cronológico da verificação. O `type` de
                evento é um dos seguintes: `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 aconteceu.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      Payload específico do evento. Eventos de envio: `{status,
                      reason}`. Eventos de introdução de código: `{code_tried,
                      status}`. Eventos de estado final: `null`, ou `{reason}`
                      quando recusada ou em análise.
                  fee:
                    type: number
                    description: >-
                      Montante em USD faturado por este evento. Diferente de
                      zero apenas no primeiro envio bem-sucedido; 0 para novas
                      tentativas, introduções de código e eventos de estado.
            matches:
              type: array
              description: >-
                Outras sessões da sua aplicação (KYC, KYB ou API) onde o mesmo
                endereço de e-mail foi utilizado por um utilizador diferente
                (`vendor_data` diferente). Até 5 entradas; uma correspondência
                sintética de lista de bloqueio de uma entrada de lista é
                adicionada no início quando presente (e apenas quando não
                existir nenhum e-mail na lista de bloqueio derivado da sessão) —
                as correspondências derivadas da sessão mantêm a ordem de
                created_at. Matriz vazia quando não existirem correspondências.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID de sessão da outra verificação que utilizou este
                      endereço de e-mail.
                  session_number:
                    type: integer
                    description: Número sequencial legível da 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 correspondido.
                  status:
                    type: string
                    description: >-
                      Estado dessa sessão (por exemplo, `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Indica 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 autónoma que a criou (por
                      exemplo, `PHONE_VERIFICATION`); `null` para sessões de
                      verificação normais.
                  source:
                    type: string
                    description: >-
                      Onde a correspondência foi encontrada. Habitualmente
                      `session`; uma ocorrência na lista de bloqueio através de
                      uma entrada de lista da organização prefixa 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. Presentes apenas quando
                `enable_enrichment` foi `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: Carimbo de data/hora desta resposta de verificação.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        Presença social do endereço de e-mail: as plataformas online em que está
        registado. Presente apenas quando `enable_social` foi definido e a
        verificação foi concluída. Cada contagem pode ser nula quando não foram
        devolvidos dados 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 onde o endereço de e-mail está confirmado como
            registado.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Plataformas avaliadas quanto ao registo.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Plataformas que devolveram um nome associado.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Plataformas que devolveram uma fotografia de perfil.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Plataformas de comunicação com presença detetada.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Categorias de plataforma distintas com presença detetada.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Indicador composto de maturidade digital, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Indicador do nível de detalhe do perfil, 0-10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Distribuição da plataforma gratuita vs paga, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Registos em plataformas gratuitas.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Registos em plataformas totalmente pagas.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Registos em plataformas freemium.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Grau de preenchimento do perfil do WhatsApp. Apenas para telefone;
            nulo para e-mail.
          example: Partial
        registered_platforms:
          type: array
          description: Plataformas onde o registo está 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 e proporção de registos por categoria de plataforma.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Detalhes de perfil por plataforma, indexados por plataforma, quando
            a plataforma os disponibiliza.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        Bloco de inteligência de e-mail normalizado. Presente apenas quando o
        suplemento 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-100. Mais alto é mais arriscado.
        deliverable:
          type: string
          nullable: true
          description: Faixa de capacidade de entrega (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 violação.
        is_recent_breach:
          type: boolean
          nullable: true
          description: '`true` quando o endereço surge numa violação recente.'
        is_frequent_breached:
          type: boolean
          nullable: true
          description: '`true` quando o endereço surge em muitas violações.'
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` quando o domínio é de um fornecedor descartável.'
        is_free_domain:
          type: boolean
          nullable: true
          description: '`true` quando o domínio é de um fornecedor de e-mail gratuito.'
        is_breached:
          type: boolean
          nullable: true
          description: '`true` quando o endereço surge em violações conhecidas.'
        no_of_breaches:
          type: number
          nullable: true
          description: Número de violações de dados conhecidas que contêm o endereço.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Identificador Didit estável do sinal, por exemplo
                  `IR-5AC67A32`. Opaco: agrupe e filtre por ele, não tente
                  analisá-lo.
              value:
                nullable: true
                description: >-
                  Para um sinalizador de risco (por exemplo, `voip`, `leaked`,
                  `disposable`, `spam_trap`), o respetivo 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 adicionou 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 influenciou a pontuação, por
                  exemplo `low`, `medium` ou `high`.
          description: >-
            Sinais que explicam a pontuação, cada um com um código Didit
            estável, uma direção, uma mensagem e um nível de impacto. Podem
            surgir novos códigos ao longo do tempo, pelo que não deve rejeitar
            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 mundiais, `local` para plataformas
            específicas de uma região.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: Plataformas nesta categoria onde o registo está confirmado.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Percentagem de plataformas verificadas da categoria com registo,
            0.0-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 fotografia de perfil, quando a plataforma o disponibiliza.
        about:
          type: string
          nullable: true
          description: >-
            Texto de biografia/apresentação 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 empresarial, quando a plataforma o
            disponibiliza.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, 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á
        incorreta, 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 o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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