> ## 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 Check Phone OTP: validar código SMS

> Valide OTP de telefone com POST /v3/phone/check/ da Didit e detecte operadora, número virtual e descartável. Pagamento por uso, sem mínimos mensais.

## Lidar com indisponibilidade do provedor

Se o provedor de telefonia estiver temporariamente indisponível, este endpoint retorna `502` com um código estável e legível por máquina:

```json theme={null}
{
  "detail": "The phone verification provider is temporarily unavailable.",
  "code": "phone_provider_unavailable"
}
```

Trate esta resposta como passível de nova tentativa. Use um backoff curto e mostre ao usuário uma mensagem de serviço temporariamente indisponível, em vez de pedir que ele altere um número de telefone ou código válido.

## Complemento de inteligência

Defina `enable_enrichment` como `true` para também executar a inteligência telefônica do número: uma pontuação de risco, o tipo de linha, se o número foi portado recentemente e um índice de confiança.
O complemento é cobrado a \$0.05 por requisição, segundo o preço de tabela, além do preço da verificação.
A requisição retorna `403` quando seu saldo não for suficiente para cobrir o custo.

Quatro campos definem como os sinais são tratados.
Cada um é `NO_ACTION` (o padrão) ou `DECLINE`, e cada um só tem efeito quando `enable_enrichment` é `true`.

| Campo | Recusa quando |
| - | - |
| `phone_intelligence_score_action` | A pontuação de risco está acima do limiar. |
| `phone_type_risk_action` | O número é de um tipo de linha de alto risco. |
| `recent_port_action` | O número foi portado para outra operadora recentemente. |
| `low_phone_trust_action` | O índice de confiança é igual ou inferior ao limiar. |

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


## OpenAPI

````yaml pt-br/openapi-25.json POST /v3/phone/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/phone/check/:
    post:
      tags:
        - Standalone APIs
      summary: Verificar código de telefone
      description: >-
        Verifique o OTP enviado por [`POST
        /v3/phone/send/`](/pt-br/standalone-apis/phone-send) e obtenha o
        resultado final da verificação junto com a inteligência do telefone:
        nome da operadora e tipo de linha, indicadores de número virtual (VoIP)
        e descartável, e uso duplicado do número entre as suas sessões.


        **Como a checagem encontra a verificação.** A correspondência é feita
        pela sua aplicação mais o `phone_number` em formato E.164; o
        `request_id` não é uma entrada. A verificação pendente mais recente
        criada nos últimos **5 minutos** é a que é checada. Se não houver
        nenhuma (nunca enviada, já finalizada 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 errados retornam `status: "Failed"`
        com as tentativas restantes e `phone: null`; o terceiro código errado
        finaliza a verificação como `Declined` com um aviso
        `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` e retorna o relatório completo do
        telefone.


        **Resultados.** `Approved`: código correto e nenhum risco que leve à
        recusa. `Declined`: definitivo; o código estava correto, mas houve
        correspondência com um risco que leva à recusa (uma ação `DECLINE`
        abaixo, um número na lista de bloqueio ou de alto risco), ou as
        tentativas se esgotaram. `Failed`: código errado, ainda com tentativas
        restantes. `Expired or Not Found`: nada a checar. Em
        `Approved`/`Declined`, o `request_id` é igual ao `request_id` do envio
        (o id da sessão) e `phone` traz o relatório completo (`carrier`,
        `is_virtual`, `is_disposable`, `warnings`, `lifecycle`, `matches`); em
        `Failed` e `Expired or Not Found`, o `request_id` é um UUID aleatório
        avulso.


        **Ações de risco.** `duplicated_phone_number_action`,
        `disposable_number_action` e `voip_number_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 `phone.warnings` sem afetar o status.


        **Faturamento.** As checagens são gratuitas; a entrega é cobrada no
        envio (consulte [Preços da Verificação de
        telefone](/pt-br/getting-started/phone-verification-pricing)).


        **Persistência da sessão.** Uma checagem 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.** As chaves de API de sandbox ignoram todo o processamento:
        qualquer código bem formado (de 4 a 8 dígitos, incluindo `123456`)
        retorna um payload estático `Approved` com um objeto `phone`
        simplificado e plano (`status`, `phone_number`, `country_code`,
        `carrier_name`, `line_type`, `flags`); 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`.


        **Limites de requisições.** Cota de escrita compartilhada de 300
        requisições/min por chave de API, mais o limite antiabuso do provedor
        upstream de 4 tentativas por número por hora; exceder qualquer um deles
        retorna `429`.


        **Presença em redes sociais.** Defina `enable_social` como `true` para
        adicionar um bloco `phone_social`: as plataformas online em que este
        número está cadastrado, com contagens por categoria e os detalhes de
        perfil disponíveis. `profiles_registered: 0` significa que as
        plataformas foram checadas e o número não foi encontrado em nenhuma
        delas, uma resposta válida e cobrável. O bloco fica ausente quando o
        complemento não foi solicitado ou quando a checagem não pôde ser
        concluída, e nesse caso não é cobrado. O faturamento adiciona uma
        unidade `phone_social` por requisição, além do preço deste endpoint.
      operationId: post_v3phone_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    O mesmo número de telefone usado na chamada correspondente a
                    [`POST /v3/phone/send/`](/pt-br/standalone-apis/phone-send),
                    no formato E.164. É isso que vincula a verificação ao envio.
                  example: '+14155552671'
                code:
                  type: string
                  minLength: 4
                  maxLength: 8
                  pattern: ^[0-9]{4,8}$
                  description: >-
                    O OTP que o usuário final recebeu. Deve ter de 4 a 8 dígitos
                    numéricos — qualquer outro valor retorna `400` sem consumir
                    uma tentativa. Um código bem formado, mas incorreto, retorna
                    `200` com `status: "Failed"` e consome uma das 3 tentativas.
                  example: '123456'
                duplicated_phone_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando o mesmo número já foi usado por outro
                    usuário (`vendor_data` diferente) da sua aplicação.
                    `DECLINE` altera o `status` final para `Declined`;
                    `NO_ACTION` registra o risco em `phone.warnings` e preenche
                    `phone.matches`.
                disposable_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando a consulta à operadora sinaliza o número
                    como linha temporária/descartável (`phone.is_disposable`).
                    `DECLINE` muda o `status` final para `Declined`; `NO_ACTION`
                    registra o risco em `phone.warnings`.
                voip_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    O que fazer quando a consulta à operadora informa um tipo de
                    linha virtual — `voip`, `isp` ou `vpn` (`phone.is_virtual`).
                    `DECLINE` muda o `status` final para `Declined`; `NO_ACTION`
                    registra o risco em `phone.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Quando `true`, também executa a inteligência de telefone no
                    número: uma pontuação de risco, o tipo de linha, se o número
                    foi portado recentemente e um índice de confiança. Cobrado
                    como uma unidade `phone_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
                phone_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 telefone
                    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`.
                phone_type_risk_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o número é de um tipo de linha de alto risco.
                    `DECLINE` muda o `status` final para `Declined`; `NO_ACTION`
                    registra o sinal sem recusar. Só tem efeito quando
                    `enable_enrichment` é `true`.
                recent_port_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o número foi portado para outra operadora
                    recentemente. `DECLINE` muda o `status` final para
                    `Declined`; `NO_ACTION` registra o sinal sem recusar. Só tem
                    efeito quando `enable_enrichment` é `true`.
                low_phone_trust_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Ação quando o índice de confiança da inteligência de
                    telefone está igual ou abaixo do limiar. `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
                    número: as plataformas de mensagens, redes sociais,
                    e-commerce e profissionais em que ele está cadastrado.
                    Cobrado como uma unidade `phone_social` por requisição, além
                    do preço deste endpoint.
                  example: true
                phone_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
                    número 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:
                - phone_number
                - code
            examples:
              Default:
                summary: Registrar todos os riscos, mas nunca recusar automaticamente
                value:
                  phone_number: '+14155552671'
                  code: '123456'
              Strict risk policy:
                summary: Recusar automaticamente linhas VoIP e descartáveis
                value:
                  phone_number: '+14155552671'
                  code: '123456'
                  voip_number_action: DECLINE
                  disposable_number_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. `phone` é 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/PhoneVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    Código correto: relatório de telefone completo com
                    operadora, ciclo de vida e correspondências
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    phone:
                      status: Approved
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: PHONE_DELIVERY_DELIVERED
                          timestamp: '2026-06-12T01:23:43.118220+00:00'
                          details:
                            channel: whatsapp
                            status: delivered
                          fee: 0
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_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'
                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'
                    phone: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (max attempts):
                  summary: >-
                    Terceiro código incorreto: verificação finalizada como
                    Recusada
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Declined
                    message: >-
                      The verification code is incorrect. Maximum attempts
                      reached.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: null
                      warnings:
                        - feature: PHONE
                          risk: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          additional_data: null
                          log_type: error
                          short_description: Verification code attempts exceeded
                          long_description: >-
                            The system detected that the phone number has
                            exceeded the maximum number of verification code
                            attempts.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:01.118220+00:00'
                          details:
                            code_tried: '111111'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:21.512340+00:00'
                          details:
                            code_tried: '222222'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '333333'
                            status: Failed
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Declined (risk policy):
                  summary: >-
                    Código correto, mas a linha é VoIP e
                    voip_number_action=DECLINE
                  value:
                    request_id: 7f1c9d2e-44a1-4b6e-9a3e-5b8e6f1c2d3a
                    status: Declined
                    message: The verification code is correct.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '5005550006'
                      full_number: '+15005550006'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: CLEC LLC
                        type: voip
                      is_disposable: false
                      is_virtual: true
                      verification_method: sms
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: PHONE
                          risk: VOIP_NUMBER_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: VoIP number detected
                          long_description: >-
                            The system detected that the phone number is a VoIP
                            number, which is not allowed.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: sms
                          fee: 0.0509
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VOIP_NUMBER_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 número nos últimos 5
                    minutos
                  value:
                    request_id: 69cc35c6-280a-47a6-ab8c-4f32abc02ed0
                    status: Expired or Not Found
                    message: No pending phone verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:47.311323+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 code format:
                  summary: '`code` não tem de 4 a 8 dígitos numéricos'
                  value:
                    code:
                      - Invalid code format. Enter 4 to 8 numeric digits.
                Invalid phone number:
                  summary: '`phone_number` não está em um formato E.164 válido'
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Invalid action:
                  summary: Ações de risco aceitam apenas NO_ACTION ou DECLINE
                  value:
                    voip_number_action:
                      - '"REVIEW" is not a valid choice.'
        '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. Além disso, um teto antiabuso de 4 tentativas de
            verificação por número de telefone por hora é aplicado na origem. A
            resposta inclui os cabeçalhos `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` e `Retry-After`.
            Observação: os cabeçalhos `X-RateLimit-*`/`Retry-After` acompanham
            apenas o 429 do limite de escrita de 300/min; o 429 do teto por
            número não inclui cabeçalhos de limite de requisições.
          content:
            application/json:
              examples:
                Per-number cap:
                  summary: >-
                    Mais de 4 tentativas de verificação para o mesmo número na
                    última hora
                  value:
                    detail: >-
                      Maximum verification attempts reached for this phone
                      number. Only 4 authentication attempts are allowed per
                      hour. Try again later or use a different number.
                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
        '500':
          description: >-
            Falha inesperada ao verificar o código no provedor que não
            corresponde a uma indisponibilidade conhecida do provedor. É seguro
            tentar novamente; o limite de tentativas só é consumido por
            verificações concluídas.
          content:
            application/json:
              examples:
                Provider error:
                  summary: Não foi possível concluir a verificação do código
                  value:
                    detail: Error checking phone verification
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '502':
          description: >-
            O provedor de verificação de telefone está temporariamente
            indisponível - uma resposta 5xx, timeout ou falha de conexão que
            persistiu após as novas tentativas automáticas. É seguro tentar
            novamente; o limite de tentativas não é consumido.
          content:
            application/json:
              examples:
                Provider outage:
                  summary: O provedor não respondeu à requisição de verificação
                  value:
                    detail: >-
                      Phone verification is temporarily unavailable. Please try
                      again shortly.
                    code: phone_provider_unavailable
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/phone/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "code": "123456",
                "voip_number_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.check_code(
                phone_number="+14155552671",
                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.phone.checkCode({
              phone_number: "+14155552671",
              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.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\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.PhoneCheckCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .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->phone->checkCode([
                'phone_number' => '+14155552671',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.phone.check_code(
              phone_number: "+14155552671",
              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.Phone.CheckCodeAsync(new
            PhoneCheckCodeParams

            {
                PhoneNumber = "+14155552671",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationCheckResponse:
      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/phone/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 número 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.
        phone:
          type: object
          nullable: true
          description: >-
            Relatório completo do telefone. 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 telefone. Corresponde ao `status`
                de nível superior nas verificações finalizadas.
            phone_number_prefix:
              type: string
              description: >-
                Código de discagem do país com `+` no início (por exemplo,
                `+1`).
              example: '+1'
            phone_number:
              type: string
              description: Número nacional sem o código de discagem do país.
              example: '4155552671'
            full_number:
              type: string
              description: Número completo no formato E.164.
              example: '+14155552671'
            country_code:
              type: string
              nullable: true
              description: País do número, no formato ISO 3166-1 alpha-2.
              example: US
            country_name:
              type: string
              description: Nome completo do país derivado de `country_code`.
              example: United States
            carrier:
              type: object
              description: >-
                Rede que atende o número atualmente, obtida pela consulta à
                operadora executada na finalização.
              properties:
                name:
                  type: string
                  description: >-
                    Nome da operadora. String vazia quando a consulta não
                    conseguiu identificá-la.
                type:
                  type: string
                  description: >-
                    Tipo de linha informado pela consulta: `mobile`,
                    `fixed_line`, `voip`, `isp`, `vpn`, `toll_free`,
                    `premium_rate`, `pager`, `payphone`, `satellite`, `service`,
                    `shared_cost`, `short_codes_commercial`, `calling_cards`,
                    `local_rate`, `universal_access`, `voice_mail`, `other` ou
                    `unknown`.
            is_disposable:
              type: boolean
              description: >-
                `true` quando o número pertence a um serviço de números
                temporários/descartáveis.
            is_virtual:
              type: boolean
              description: >-
                `true` quando o tipo de linha é virtual (`voip`, `isp` ou
                `vpn`).
            verification_method:
              type: string
              description: >-
                Canal que efetivamente entregou o OTP, depois que a entrega é
                confirmada (por exemplo, `whatsapp`, `sms`); até lá, o canal
                solicitado.
            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,
                descartável, VoIP, 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 `PHONE` 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: `PHONE_VERIFICATION_MESSAGE_SENT`,
                `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`,
                `PHONE_VERIFICATION_BLOCKED`, `PHONE_DELIVERY_DELIVERED`,
                `PHONE_DELIVERY_UNDELIVERABLE`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `PHONE_VERIFICATION_APPROVED`,
                `PHONE_VERIFICATION_DECLINED`, `PHONE_VERIFICATION_IN_REVIEW`,
                `PHONE_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, channel, actual_channel}` (`actual_channel` é
                      preenchido quando a entrega é confirmada). Eventos de
                      entrega: `{channel, status}`. 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 em eventos de envio (o preço da entrega); 0 para
                      inserções de código, confirmações de entrega e eventos de
                      status.
            matches:
              type: array
              description: >-
                Outras sessões da sua aplicação (KYC, KYB ou API) em que o mesmo
                número de telefone foi usado por um usuário diferente
                (`vendor_data` diferente). Até 5 entradas, com uma
                correspondência sintética de entrada da lista de bloqueio em
                primeiro lugar quando houver (as correspondências derivadas de
                sessões mantêm a ordem da consulta). 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 número de
                      telefone.
                  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`).
                  phone_number:
                    type: string
                    description: O número de telefone correspondente.
                  status:
                    type: string
                    description: >-
                      Status dessa sessão (por exemplo, `Approved`, `Declined`,
                      `In Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Se o número de telefone 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.
            phone_social:
              $ref: '#/components/schemas/PhoneSocialFootprint'
            phone_intelligence:
              allOf:
                - $ref: '#/components/schemas/PhoneIntelligence'
              description: >-
                Sinais de inteligência de telefone. 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.
    PhoneSocialFootprint:
      type: object
      nullable: true
      description: >-
        Pegada social do número de telefone: 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 número de telefone 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 número de telefone 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'
    PhoneIntelligence:
      type: object
      description: >-
        Bloco normalizado de inteligência de telefone. Presente apenas quando o
        complemento de inteligência foi executado para esta consulta; quando
        presente, também é exposto sob 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.
        phone_type_risk:
          type: string
          nullable: true
          description: '`Low`, `Medium` ou `High`, derivado da pontuação.'
        phone_trust_index:
          type: number
          nullable: true
          description: >-
            Inverso da pontuação, para painéis em que valores mais altos são
            melhores.
        network_stability_index:
          type: number
          nullable: true
          description: Estabilidade da rede da linha.
        is_disposable:
          type: boolean
          nullable: true
          description: '`true` quando o número parece descartável ou virtual.'
        is_ported:
          type: boolean
          nullable: true
          description: '`true` quando o número mudou de operadora.'
        is_recently_ported:
          type: boolean
          nullable: true
          description: '`true` quando a portabilidade ocorreu recentemente.'
        carrier_type:
          type: string
          nullable: true
          description: >-
            Classificação da linha informada pela consulta (por exemplo,
            `mobile`).
        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.