Saltar para o conteúdo principal
O relatório de Verificação de telefone regista o resultado completo de um desafio de OTP por telefone: para quem enviámos o código, que operadora e canal o processaram, quantas tentativas foram necessárias, se o número é descartável ou VoIP e quaisquer correspondências com a sua lista de bloqueio ou com sessões de outros utilizadores. Esta página documenta a estrutura JSON devolvida pelo endpoint de decisão para que possa analisar os resultados do OTP, os metadados da operadora e os sinalizadores de risco para cada número verificado.
Relatório de verificação de telefone da Didit a mostrar o resultado do OTP, metadados da operadora e sinalizadores de risco

Visão geral

É gerado um relatório de telefone sempre que um nó do fluxo executa a funcionalidade Verificação de telefone. Cada relatório representa um desafio de OTP para um número de telefone e contém:
  • O número de telefone dividido em prefixo, número nacional e formato E.164 completo, além do código de país ISO e do nome do país.
  • Metadados da operadora (name, type) obtidos a partir da rede de destino.
  • Sinalizadores de risco booleanos (is_disposable, is_virtual) derivados da análise do tipo de linha.
  • O canal de entrega efetivamente utilizado (verification_method) e a contagem de tentativas de envio de OTP.
  • Um registo cronológico em lifecycle[] de cada envio, nova tentativa, evento de entrega e tentativa de verificação de código.
  • Um array matches[] que apresenta o mesmo número noutras sessões — qualquer estado, em verificações de KYC, KYB e de API autónoma — ou na sua lista de bloqueio.
  • Um array warnings[] — eventos de risco emitidos durante a verificação (consulte Avisos de Verificação de telefone).
  • Um node_id que identifica qual o nó do grafo de fluxo que gerou o relatório (apenas em sessões V3).
Nos fluxos de verificação alojados, a Didit executa a troca de OTP por si. Para integrações diretas de API, o mesmo fluxo requer duas chamadas — POST /v3/phone/send/ para entregar o código e POST /v3/phone/check/ para validar o código introduzido pelo utilizador. Um OTP pendente é válido durante 5 minutos a partir do primeiro envio (novas tentativas não prolongam a janela). Nas sessões de fluxo, os utilizadores têm por predefinição 2 tentativas de envio de OTP (phone_max_retries) e 2 tentativas de introdução do código (phone_max_check_attempts) — ambas configuráveis por nó do fluxo; esgotar qualquer um dos limites finaliza o passo como Declined com VERIFICATION_CODE_ATTEMPTS_EXCEEDED. A API de telefone autónoma permite 3 tentativas de introdução do código por verificação.

Onde surge nas respostas da API

O endpoint de decisão (GET /v3/session/{sessionId}/decision/) devolve relatórios de telefone sob a chave de array no plural phone_verifications. O array contém uma entrada por nó de Verificação de telefone no grafo do fluxo — normalmente uma, mas fluxos de step-up podem produzir várias.
Um valor null significa que nenhum passo de Verificação de telefone foi ainda executado. Itere o array (em vez de ler phone_verifications[0]) quando o seu fluxo puder recolher mais do que um número de telefone.

Schema

O esquema canónico campo a campo encontra-se na página Modelos de dados.

Valores de estado

Tipos de eventos do ciclo de vida

lifecycle[] está ordenado cronologicamente. Cada evento tem type, timestamp, details e uma taxa faturável fee (quando aplicável): O payload de details depende da família de eventos:
  • Eventos de envio (PHONE_VERIFICATION_MESSAGE_SENT, PHONE_VERIFICATION_RETRY_MESSAGE_SENT, PHONE_VERIFICATION_BLOCKED) — { status, reason, channel, actual_channel }. status é Success, Retry ou Blocked; reason é null a menos que o envio tenha sido bloqueado (invalid_phone_number, repeated_attempts, suspicious, spam, unknown); channel é o canal solicitado e actual_channel o canal que efetivamente realizou a entrega (por exemplo, um envio por WhatsApp que recorreu a SMS como alternativa).
  • Eventos de entrega (PHONE_DELIVERY_DELIVERED, PHONE_DELIVERY_UNDELIVERABLE) — { channel, status } com status sendo delivered ou undeliverable.
  • Eventos de validação (VALID_CODE_ENTERED, INVALID_CODE_ENTERED) — { code_tried, status } com status sendo Approved, Declined, Failed ou Expired or Not Found.
  • Eventos de estado final — null, exceto PHONE_VERIFICATION_DECLINED / PHONE_VERIFICATION_IN_REVIEW, que incluem { "reason": "<risk code>" } (por exemplo, PHONE_NUMBER_IN_BLOCKLIST).
O campo fee num evento de envio corresponde ao preço total desse envio: o preço da operadora ou do WhatsApp mais a taxa Didit de $0.02, ou apenas a taxa Didit de $0.02 para um código WhatsApp enviado a partir do seu próprio número WhatsApp Business. É o preço estimado até que a entrega seja confirmada, passando depois a ser o montante faturado real. Apenas os envios com Blocked são garantidamente gratuitos: qualquer outro envio é cobrado quando a verificação é finalizada ou expira, mesmo que a entrega nunca tenha sido confirmada ou a mensagem não tenha podido ser entregue. Os eventos de entrega, validação e estado incluem sempre fee: 0.

Correspondências entre sessões

matches[] regista outras sessões na mesma aplicação onde o mesmo número foi observado — em verificações de KYC, KYB e na API autónoma, independentemente do respetivo estado — além de ocorrências em listas de bloqueio configuradas nas listas da API de gestão. As sessões que partilham o vendor_data da sessão atual são excluídas (o mesmo utilizador final não faz correspondência consigo próprio) e o array está limitado a 5 entradas. Quando o número está na sua lista de bloqueio mas nenhuma das sessões correspondentes se encontra na lista de bloqueio, uma entrada sintética com source: "list_entry" (com todos os campos de sessão a null) é colocada no início do array.

Exemplos

Aprovada — OTP por WhatsApp, operadora móvel

Recusada — número VoIP na lista de bloqueio

O utilizador introduziu um OTP válido, mas a finalização detetou o número na lista de bloqueio da aplicação (recusa automática) e sinalizou o tipo de linha VoIP (voip_number_action mantido como NO_ACTION, pelo que é registado como information). Dado que nenhuma sessão correspondente se encontra na lista de bloqueio, a ocorrência na lista de bloqueio surge como uma correspondência sintética list_entry.

Relacionado

Última modificação em 7 de novembro de 2026