Saltar al contenido principal
El informe de Verificación de teléfono recoge el resultado completo de un desafío OTP por teléfono: a quién enviamos el código, qué operador y qué canal lo gestionaron, cuántos intentos fueron necesarios, si el número es desechable o VoIP, y las coincidencias entre sesiones con tu lista de bloqueo o con sesiones de otros usuarios. Esta página documenta la estructura JSON que devuelve el endpoint de decisión, para que puedas procesar los resultados del desafío OTP, los metadatos del operador y los indicadores de riesgo de cada número verificado.
Informe de verificación de teléfono de Didit con el resultado del OTP, los metadatos del operador y los indicadores de riesgo

Descripción general

Se genera un informe de teléfono cada vez que un nodo de un flujo de verificación (workflow) ejecuta la función de Verificación de teléfono. Cada informe corresponde a un desafío OTP para un número de teléfono y contiene:
  • El número de teléfono desglosado en prefijo, número nacional y formato E.164 completo, junto con el código de país ISO y el nombre del país.
  • Metadatos del operador (name, type) obtenidos a partir de la red de destino.
  • Indicadores de riesgo booleanos (is_disposable, is_virtual) derivados del análisis del tipo de línea.
  • El canal de entrega utilizado realmente (verification_method) y el número de intentos de envío del OTP.
  • Un registro cronológico lifecycle[] de cada envío, reintento, evento de entrega e intento de comprobación del código.
  • Un array matches[] que muestra el mismo número en otras sesiones (con cualquier estado, en verificaciones KYC, KYB y de API independiente) o en tu lista de bloqueo.
  • Un array warnings[] con los eventos de riesgo emitidos durante la verificación (consulta Advertencias de Verificación de teléfono).
  • Un node_id que identifica qué nodo del grafo del flujo generó el informe (solo en sesiones V3).
En los flujos de verificación alojados, Didit gestiona el intercambio del OTP por ti. En las integraciones directas con la API, el mismo flujo se resuelve con dos llamadas: POST /v3/phone/send/ para enviar el código y POST /v3/phone/check/ para validar lo que introduce el usuario. Un OTP pendiente es válido durante 5 minutos desde el primer envío (los reintentos no amplían ese plazo). En las sesiones de flujo, los usuarios disponen por defecto de 2 intentos de envío del OTP (phone_max_retries) y 2 intentos de introducción del código (phone_max_check_attempts), ambos configurables por nodo del flujo; agotar cualquiera de los dos límites finaliza el paso como Declined con VERIFICATION_CODE_ATTEMPTS_EXCEEDED. La API de teléfono independiente permite 3 intentos de introducción del código por verificación.

Dónde aparece en las respuestas de la API

El endpoint de decisión (GET /v3/session/{sessionId}/decision/) devuelve los informes de verificación telefónica bajo la clave de array en plural phone_verifications. El array contiene una entrada por cada nodo de Verificación de teléfono del grafo del flujo; normalmente es una, pero los flujos de verificación reforzada pueden generar varias.
Un valor null significa que todavía no se ha ejecutado ningún paso de Verificación de teléfono. Recorre el array (en lugar de leer phone_verifications[0]) cuando tu flujo pueda recopilar más de un número de teléfono.

Esquema

El esquema canónico, campo por campo, está en la página Modelos de datos.

Valores de estado

Tipos de eventos del ciclo de vida

lifecycle[] está ordenado cronológicamente. Cada evento tiene type, timestamp, details y una fee facturable (cuando corresponde): El payload de details depende de la familia del evento:
  • Eventos de envío (PHONE_VERIFICATION_MESSAGE_SENT, PHONE_VERIFICATION_RETRY_MESSAGE_SENT, PHONE_VERIFICATION_BLOCKED): { status, reason, channel, actual_channel }. status es Success, Retry o Blocked; reason es null salvo que el envío se haya bloqueado (invalid_phone_number, repeated_attempts, suspicious, spam, unknown); channel es el canal solicitado y actual_channel el canal por el que se realizó la entrega (por ejemplo, un envío por WhatsApp que recurrió a SMS).
  • Eventos de entrega (PHONE_DELIVERY_DELIVERED, PHONE_DELIVERY_UNDELIVERABLE): { channel, status } con status delivered o undeliverable.
  • Eventos de comprobación (VALID_CODE_ENTERED, INVALID_CODE_ENTERED): { code_tried, status } con status Approved, Declined, Failed o Expired or Not Found.
  • Eventos de estado final: null, excepto PHONE_VERIFICATION_DECLINED / PHONE_VERIFICATION_IN_REVIEW, que incluyen { "reason": "<risk code>" } (por ejemplo, PHONE_NUMBER_IN_BLOCKLIST).
fee en un evento de envío es el precio total de ese envío: el precio del operador o de WhatsApp más la tarifa de Didit de $0.02, o solo la tarifa de Didit de $0.02 para un código de WhatsApp enviado desde tu propio número de WhatsApp Business. Es el precio estimado hasta que se confirma la entrega y, a partir de ese momento, el importe realmente facturado. Solo los envíos Blocked son gratuitos con garantía: cualquier otro envío se cobra cuando la verificación finaliza o expira, aunque nunca se haya confirmado la entrega o el mensaje no se haya podido entregar. Los eventos de entrega, de comprobación y de estado siempre incluyen fee: 0.

Coincidencias entre sesiones

matches[] registra otras sesiones de la misma aplicación en las que se vio el mismo número (en verificaciones KYC, KYB y mediante la API de teléfono independiente, sea cual sea su estado), además de las coincidencias con la lista de bloqueo configurada en las listas de la management API. Se excluyen las sesiones que comparten el vendor_data de la sesión actual (el mismo usuario final no coincide consigo mismo) y el array está limitado a 5 entradas. Cuando el número está en tu lista de bloqueo pero ninguna de las sesiones coincidentes está en ella, se antepone al array una entrada sintética con source: "list_entry" (con todos los campos de sesión en null).

Ejemplos

Aprobado: OTP por WhatsApp, operador móvil

Rechazado: número VoIP en la lista de bloqueo

El usuario introdujo un OTP válido, pero al finalizar se encontró el número en la lista de bloqueo de la aplicación (rechazo automático) y se marcó su tipo de línea VoIP (voip_number_action se dejó en NO_ACTION, por lo que se registra como information). Como ninguna sesión coincidente está en la lista de bloqueo, la coincidencia con la lista de bloqueo aparece como una coincidencia sintética list_entry.

Relacionado

Última modificación el 1 de noviembre de 2026