Verifica cualquier teléfono. En cualquier canal que respondan.
Envía un código de un solo uso por SMS, WhatsApp, Telegram, RCS o voz, el canal que el usuario prefiera. Retorno automático entre canales, con puntuación de riesgo del operador en cada llamada. Desde 0,03 $ más operador.
Con la confianza de más de 2.000 organizaciones en todo el mundo.
Cinco canales
SMS. WhatsApp. Telegram. RCS. Voz.
Un módulo, cinco vías de entrega. Reintentamos en todos los canales hasta que el código
llega, puntuamos el riesgo de intercambio de SIM y de operador en cada llamada, y facturamos desde 0,03 $
más operador, con el mismo flujo de trabajo.
Cómo funciona
Del registro al usuario verificado en cuatro pasos.
Paso 01
Crea el flujo de trabajo
Elige las verificaciones que necesites: identidad, prueba de vida, coincidencia facial, sanciones, dirección, edad, teléfono, email, preguntas personalizadas. Arrástralas a un flujo en el panel de control o envíalas a nuestra API. Crea ramificaciones según condiciones, haz pruebas A/B, sin necesidad de código.
Paso 02
Integra
Intégralo de forma nativa con nuestros SDK para Web, iOS, Android, React Native o Flutter. Redirige a una página alojada. O simplemente envía a tu usuario un enlace por email, SMS, WhatsApp, donde quieras. Elige lo que mejor se adapte a tu stack.
Paso 03
El usuario completa el flujo
Didit gestiona la cámara, las indicaciones de iluminación, la transferencia móvil y la accesibilidad. Mientras el usuario está en el flujo, puntuamos más de 200 señales de fraude en tiempo real y verificamos cada campo con fuentes de datos autorizadas. Resultados en menos de dos segundos.
Paso 04
Recibes los resultados
Los webhooks firmados en tiempo real mantienen tu base de datos sincronizada al instante en que un usuario es aprobado, rechazado o enviado a revisión. Consulta la API bajo demanda. O abre la consola para inspeccionar cada sesión, cada señal y gestionar los casos a tu manera.
Diseñado para desarrolladores · Creado contra el fraude · Abierto por diseño
Seis funcionalidades. Un solo feature flag. PHONE.
Cada funcionalidad es un interruptor en el mismo módulo. Sin niveles de venta adicionales, sin planes separados, sin llamadas extra. Actívalas por flujo de trabajo en la consola o pásalas directamente en la llamada a la API.
SMS, WhatsApp, Telegram, RCS y voz, todo en el mismo módulo y flujo de trabajo. Fija un canal cuando la política lo exija (SMS obligatorio por regulador, mercados donde WhatsApp es prioritario como Brasil e India), o déjanos elegir el salto de entrega más económico.
Una feature flag · Cinco canalesfeature: TELÉFONO
SMSPor defecto
WhatsAppBR / IN / MX
TelegramUE
RCSAndroid
VozFallback
02 · Enrutamiento
Fallback automático de canal si uno falla.
Los bloqueos de SMS de operadores, los países con tarifas premium y los fallos silenciosos se evitan automáticamente. Reintentamos en el siguiente canal disponible sin que tu código tenga que hacer nada, y te decimos qué canal fue el que realmente entregó el mensaje.
Enrutamiento automático de canalesPOST /v3/phone/send/
1SMSOperador bloqueado
2WhatsAppEntregado
verification_methodwhatsapp
03 · Cobertura
Alcance global de telecomunicaciones. Entrega inteligente por operador.
Integraciones multioperador por país, con enrutamiento adaptado a los hábitos locales: WhatsApp es líder en Brasil, India y México; Telegram y RCS en la UE; SMS en EE. UU. El país, el operador y el tipo de número se detectan automáticamente.
04 · Señales de fraude
Más que un código de un solo uso. Riesgo de operador en cada llamada.
Cada verificación devuelve el nombre y tipo de operador (móvil, fijo, voz sobre IP), marca los números desechables y virtuales, y emite advertencias explícitas para números de alto riesgo, duplicados o en listas negras. Decide, revisa o aprueba según la categoría de riesgo.
05 · Conversión
Solo SMS hace que los usuarios se pierdan. Multicanal los retiene.
Cuando el SMS falla (filtro del operador, roaming, zona sin cobertura, disminución de la entregabilidad), los proveedores de un solo canal dejan a los usuarios esperando un código que nunca llega. Nosotros los recuperamos en el siguiente salto y te informamos qué canal lo entregó para que puedas ajustar el enrutamiento con datos reales.
Finalización · Promedio de 30 díasCuanto más alto, mejor
Solo SMS58%
+ WhatsApp79%
+ Fallback de voz93%
Ilustrativo, orientativo, no un estudio.
06 · Precios
Paga por mensaje. Desde $0.03 más operador.
$0.03 por verificación, más una tarifa de operador por país y canal que se traslada sin recargos. Solo pagas cuando se envía un mensaje; los abandonos antes de la entrega no cuestan nada.
Tarifas por mensajeDesde $0.03
Estados UnidosSMS$0.03
BrasilWhatsApp$0.04
IndiaWhatsApp$0.05
Paga solo cuando se envía un mensaje.
Integra
Dos endpoints. El mismo JSON. El mismo precio.
Elige el flujo alojado si quieres que nosotros nos encarguemos de la entrada del número, la UX del código y el reenvío. Elige la API independiente si tú controlas la UX. Ambas devuelven el mismo informe.
Lanza la verificación telefónica con un solo prompt.
Pega el siguiente bloque en Claude Code, Cursor, Codex, Devin, Aider o Replit Agent. Rellena tu stack. El agente provisiona Didit, crea el flujo de verificación telefónica, conecta el webhook y lo lanza.
didit-integration-prompt.md
# Didit Phone Verification — integrate in 5 minutes
You are integrating Didit's Phone Verification module into <my_stack>.
Follow these steps exactly. Every URL, header, and enum value below is
canonical — do not paraphrase or "improve" them.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Or provision programmatically: POST https://apx.didit.me/auth/v2/programmatic/register/
(returns an API key bound to the workspace + application).
## 2. Two integration paths — pick one
### Path A — Workflow Builder (hosted UI)
Best when you want Didit to handle phone collection, country prefix UX,
channel routing, OTP entry, resend buttons, mobile/desktop handoff, and
accessibility for you.
1. Create a workflow that contains the PHONE feature:
POST https://verification.didit.me/v3/workflows/
Authorization header: x-api-key: <your-api-key>
Body: workflow_label, features array with the single entry
{ feature: "PHONE" } (UPPERCASE — strict enum)
Optional config: preferred_channel ("SMS" | "WHATSAPP" | "TELEGRAM" |
"RCS" | "VIBER" | "CALL"), code_validity_seconds, max_code_attempts
(default 2), max_resend_requests_per_24h (default 2).
2. Create a verification session for an end user:
POST https://verification.didit.me/v3/session/
Body: workflow_id (from step 1), vendor_data (your own user id),
optional contact_details.phone in E.164 format
(e.g. "+14155552671") to pre-fill and lock the number.
Response: session_url — redirect the user to it.
3. Listen for webhook callbacks (see "Webhooks" below).
### Path B — Standalone server-to-server API
Best when you already own the phone-entry UX (mobile SDK, native
onboarding app, reseller pipeline) and want Didit to handle OTP delivery
+ risk scoring only. Two endpoints, called in sequence:
Step 1 — Send the code:
POST https://verification.didit.me/v3/phone/send/
Content-Type: application/json
Body fields:
- phone_number (required, string, E.164 format e.g. "+14155552671")
- channel (optional — "SMS" | "WHATSAPP" | "TELEGRAM" | "RCS" |
"VIBER" | "CALL". Omit to let Didit pick the best
available channel for the destination country and
carrier — automatic fallback routing.)
- vendor_data (optional, your user id for cross-session linkage)
Step 2 — Check the code:
POST https://verification.didit.me/v3/phone/check/
Content-Type: application/json
Body fields:
- phone_number (required, same E.164 number)
- code (required, the OTP the user typed)
- vendor_data (optional, same user id used in Step 1)
Response: JSON report — status, verification_method (the channel that
actually delivered), carrier object, is_disposable, is_virtual, warnings
array.
## 3. Channel routing — how the automatic fallback works
When channel is omitted on /v3/phone/send/, Didit picks the cheapest
+ most-deliverable channel for the destination:
- SMS where deliverable and lowest cost (most countries)
- WhatsApp in BR / IN / MX and other WhatsApp-dense markets
- Telegram / RCS / Viber where carrier-side SMS is blocked or premium
- CALL (voice OTP) as last-resort fallback when text channels fail
Each retry attempt may switch channels — the final delivery channel is
returned as verification_method in the report.
## 4. Webhooks (Path A only — Path B returns synchronously)
- Register a webhook destination once via
POST https://verification.didit.me/v3/webhook/destinations/
Body: url, subscribed_events: ["session.verified", "session.review_started",
"session.declined"]
- Response includes secret_shared_key — store it.
- Every webhook delivery carries an X-Signature-V2 header you MUST verify
before trusting the payload. HMAC-SHA256 verification MUST run against the raw body bytes (the raw payload as Didit sent it) BEFORE any JSON parsing — re-serialising the parsed body changes whitespace and key order, which invalidates the signature.Algorithm:
1. sortKeys(payload) recursively
2. shortenFloats (truncate trailing zeros after the decimal point)
3. JSON.stringify the result
4. HMAC-SHA256 with the secret_shared_key
5. Hex-encode, compare to the X-Signature-V2 header.
## 5. Reading the report (both paths return the same phone object)
- status: "Approved" | "Declined" | "In Review" | "Not Finished"
- phone_number_prefix: country prefix in international format ("+34")
- phone_number: subscriber number without the prefix
- full_number: full E.164 string ("+34600600600")
- country_code: ISO 3166-1 alpha-2 ("ES")
- country_name: full country name
- carrier: { name, type: "mobile" | "landline" | "voip" | "unknown" }
- is_disposable: boolean — temporary or throwaway number
- is_virtual: boolean — VoIP or virtual provider
- verification_method: the channel that actually delivered the code
("sms" | "whatsapp" | "viber" | "telegram" | "call")
- verification_attempts: number of code-entry tries
- verified_at: ISO 8601 timestamp
- warnings: Array<{ risk, log_type, short_description, long_description }>
Auto-decline risks (always enforced by Didit, not configurable):
- VERIFICATION_CODE_ATTEMPTS_EXCEEDED
- HIGH_RISK_PHONE_NUMBER
- PHONE_NUMBER_IN_BLOCKLIST
Configurable risks (action per workflow — Decline, Review, or Approve):
- DISPOSABLE_NUMBER_DETECTED
- VOIP_NUMBER_DETECTED
- DUPLICATED_PHONE_NUMBER
## 6. Attempt limits (defaults — overridable per workflow)
- Max code-entry attempts: 2 per session
- Max resend requests: 2 per phone number per 24 hours
- Code validity: 5 minutes from send
Hitting either limit fires VERIFICATION_CODE_ATTEMPTS_EXCEEDED and
auto-declines the session.
## 7. Hard rules — do not change
- Base URL for /v3/* endpoints is verification.didit.me (NOT apx.didit.me).
- Feature enum is UPPERCASE: PHONE, ID_VERIFICATION, LIVENESS, FACE_MATCH,
AML, IP_ANALYSIS.
- Channel enum is UPPERCASE on input ("SMS", "WHATSAPP", "TELEGRAM",
"RCS", "VIBER", "CALL") and lowercase on output ("sms", "whatsapp",
"telegram", "rcs", "viber", "call").
- All phone numbers go in and come out as E.164 strings — including
the leading "+" and country prefix.
- Auth header is x-api-key (lowercase, hyphenated).
- Webhook signature header is X-Signature-V2 (NOT X-Signature).
- Always verify webhook signatures before trusting payload data.
- Status casing matches exactly: "Approved", "Declined", "In Review",
"Not Finished" (title-cased, space-separated).
## 8. Pricing reference (public)
- Didit fee: $0.03 per verification (the cheapest channel; some
channels and countries cost more — see didit.me/pricing for the
per-country, per-channel table).
- Carrier fee: variable by country and channel, billed as a
pass-through with no Didit markup.
- You only pay when a message is SENT. If the user abandons before
delivery, you are not charged.
## 9. Verify your integration
- Sandbox starts on signup at https://business.didit.me — no separate flag.
- Sandbox numbers: deterministic E.164 numbers return Approved by default;
trigger Declined with the canonical "high-risk" sandbox number.
- Switch to live: flip the application's environment toggle in console.
When in doubt: https://docs.didit.me/core-technology/phone-verification/overview
Cumplimiento por diseño
Abre un nuevo país en un clic. Nosotros hacemos el trabajo duro.
Abrimos las filiales locales, aseguramos las licencias, realizamos las pruebas de penetración, obtenemos las certificaciones y nos alineamos con cada nueva regulación. Para lanzar verificaciones en un nuevo país, activa un interruptor. Más de 220 países en vivo, auditados y probados trimestralmente, el único proveedor de identidad que un gobierno de un estado miembro de la UE ha calificado formalmente como más seguro que la verificación presencial.
Canales de entrega: SMS, WhatsApp, Telegram, RCS, voz.
Automático
Enrutamiento de canales: elegimos el salto de entrega más económico.
Desde $0.03
Por verificación, más el coste del operador (sin recargos).
Tres niveles, una lista de precios
Empieza gratis. Paga por uso. Escala a Enterprise.
500 verificaciones gratuitas cada mes, para siempre. Pago por uso para producción. Contratos personalizados, residencia de datos y SLAs (Acuerdos de Nivel de Servicio) en Enterprise.
Gratis
Gratis
$0 / mes. No se requiere tarjeta de crédito.
Paquete KYC gratuito (Verificación de ID + Prueba de vida pasiva + Coincidencia facial + Análisis de dispositivo e IP), 500 / mes, cada mes