Verifique qualquer telefone. Em qualquer canal que eles atendam.
Envie um código único via SMS, WhatsApp, Telegram, RCS ou voz, o canal que o usuário realmente usa. Fallback automático entre canais, com pontuação de risco da operadora em cada chamada. A partir de $0.03 mais operadora.
Confiado por mais de 2.000 organizações em todo o mundo.
Cinco canais
SMS. WhatsApp. Telegram. RCS. Voz.
Um módulo, cinco formas de entrega. Tentamos novamente em vários canais até que o código
chegue, pontuamos o risco de troca de SIM e da operadora em cada chamada, e cobramos a partir de $0.03 mais
a operadora, o fluxo de trabalho é o mesmo.
Como funciona
Do cadastro ao usuário verificado em quatro passos.
Passo 01
Crie o fluxo de trabalho
Escolha as verificações que você precisa, ID, prova de vida, reconhecimento facial, sanções, endereço, idade, telefone, e-mail, perguntas personalizadas. Arraste-as para um fluxo no painel ou publique o mesmo fluxo na nossa API. Crie ramificações com base em condições, execute testes A/B, sem precisar de código.
Passo 02
Integre
Incorpore nativamente com nossos SDKs para Web, iOS, Android, React Native ou Flutter. Redirecione para uma página hospedada. Ou simplesmente envie um link ao seu usuário, por e-mail, SMS, WhatsApp, onde quiser. Escolha o que melhor se adapta à sua stack.
Passo 03
O usuário passa pelo fluxo
A Didit hospeda a câmera, as dicas de iluminação, a transição para o celular e a acessibilidade. Enquanto o usuário está no fluxo, pontuamos mais de 200 sinais de fraude em tempo real e verificamos cada campo em relação a fontes de dados confiáveis. O resultado sai em menos de dois segundos.
Passo 04
Você recebe os resultados
Webhooks assinados em tempo real mantêm seu banco de dados sincronizado no momento em que um usuário é aprovado, recusado ou enviado para revisão. Consulte a API sob demanda. Ou abra o console para inspecionar cada sessão, cada sinal e gerenciar casos do seu jeito.
Feito para desenvolvedores · Contra fraudes · Aberto por design
Seis funcionalidades. Uma feature flag. PHONE.
Cada funcionalidade é um toggle no mesmo módulo. Sem níveis de upsell, sem planos separados, sem chamadas adicionais. Ative-as por fluxo no console ou passe-as diretamente na chamada da API.
SMS, WhatsApp, Telegram, RCS e voz, tudo no mesmo módulo e fluxo de trabalho. Fixe um canal quando a política exigir (SMS obrigatório por regulador, mercados que priorizam WhatsApp como Brasil e Índia), ou deixe-nos escolher o canal de entrega mais barato.
Uma feature flag · Cinco canaisfeature: TELEFONE
SMSPadrão
WhatsAppBR / IN / MX
TelegramUE
RCSAndroid
VozFallback
02 · Roteamento
Fallback automático de canal quando um falha.
Bloqueios de SMS de operadoras, países com tarifas premium e falhas silenciosas são automaticamente contornados. Tentamos novamente no próximo canal de entrega sem que seu código precise tocar em nada, e informamos qual canal realmente entregou.
Roteamento automático de canaisPOST /v3/phone/send/
1SMSOperadora bloqueada
2WhatsAppEntregue
verification_methodwhatsapp
03 · Cobertura
Alcance global de telecomunicações. Entrega com reconhecimento de operadora.
Integrações multi-operadora por país, com roteamento ajustado aos hábitos locais, WhatsApp lidera no Brasil, Índia e México, Telegram e RCS lideram na UE, SMS lidera nos EUA. País, operadora e tipo de número são detectados automaticamente.
04 · Sinais de fraude
Mais do que um código único. Risco da operadora em cada chamada.
Cada verificação retorna o nome e tipo da operadora (celular, fixo, voz sobre IP), sinaliza números descartáveis e virtuais, e emite avisos explícitos para números de alto risco, duplicados ou bloqueados. Decida, revise ou aprove por categoria de risco.
05 · Conversão
SMS-only perde usuários. Multi-canal os mantém.
Quando o SMS falha, filtro da operadora, roaming, zona morta, queda na entregabilidade, provedores de canal único deixam os usuários esperando por um código que nunca chega. Nós os recuperamos no próximo canal e informamos qual canal entregou para que você possa ajustar o roteamento com dados reais.
Conclusão · 30 dias corridosQuanto maior, melhor
Somente SMS58%
+ WhatsApp79%
+ Fallback por voz93%
Ilustrativo, direcional, não um estudo.
06 · Preços
Pague por mensagem. A partir de $0.03 mais taxa da operadora.
$0.03 por verificação, mais uma taxa de operadora por país e canal repassada sem margem. Você só paga quando uma mensagem é enviada, abandonos antes da entrega não custam nada.
Taxas por mensagemA partir de $0.03
Estados UnidosSMS$0.03
BrasilWhatsApp$0.04
ÍndiaWhatsApp$0.05
Pague apenas quando a mensagem for enviada.
Integre
Dois endpoints. Mesmo JSON. Mesmo preço.
Escolha o fluxo hospedado quando quiser que a gente cuide da inserção do número, da UX do código e do reenvio. Escolha a API autônoma quando você gerencia a UX. Ambos retornam o mesmo relatório.
Cole o bloco abaixo no Claude Code, Cursor, Codex, Devin, Aider ou Replit Agent. Preencha sua stack. O agente provisiona o Didit, cria o fluxo de Verificação de Telefone, conecta o webhook e faz o deploy.
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
Conformidade por design
Abra um novo país com um clique. Nós fazemos o trabalho pesado.
Nós abrimos as subsidiárias locais, garantimos as licenças, realizamos os testes de penetração, obtemos as certificações e nos alinhamos a cada nova regulamentação. Para lançar verificações em um novo país, basta ativar uma chave. Mais de 220 países ativos, auditados e testados trimestralmente, o único provedor de identidade que um governo de um estado membro da UE formalmente considerou mais seguro do que a verificação presencial.
Canais de entrega, SMS, WhatsApp, Telegram, RCS, voz.
Automático
Roteamento de canais, escolhemos o caminho mais barato e entregável.
A partir de $0.03
Por verificação, mais repasse da operadora, sem margem.
Três planos, uma tabela de preços
Comece grátis. Pague pelo uso. Escale para Enterprise.
500 verificações gratuitas todo mês, para sempre. Pague conforme usar para produção. Contratos personalizados, residência de dados e SLAs (Service Level Agreements) no plano Enterprise.
Grátis
Grátis
$0 / mês. Não precisa de cartão de crédito.
Pacote KYC grátis (Verificação de ID + Prova de Vida Passiva + Comparação Facial + Análise de Dispositivo e IP), 500 / mês, todo mês
Comece grátis → pague apenas quando uma verificação for executada → desbloqueie o Enterprise para um contrato personalizado, SLA ou residência de dados.