How it works Features Pricing FAQ Try it free Sign in Start free →
REVERSE OTP

The first to do reverse OTP on WhatsApp and Telegram.

Your users send the message — your server doesn't. No per-message bills. No interception. No failed delivery. No bots.

Verify once.
Trust always.

Phone verification via WhatsApp, Telegram, SMS, or Email. No expensive per-message charges. Flat monthly pricing. Works worldwide.

Telegram ✉️ Email OTP 📱 SMS fallback
3Free channels
$0Per verification
99.9%Uptime
<1sResponse
akidotp — verify.js
// Start a verification session
 
const res = await fetch(
  'https://akidotp.com/api/mobileverify/start',
  { method: 'POST',
    headers: { 'X-API-Key': YOUR_KEY },
    body: JSON.stringify({
      phone: '+447911234567'
    }) }
);
 
{ "whatsappLink": "https://wa.me/...",
  "whatsappPersonalLink": "intent://...",
  "whatsappBusinessLink": "intent://...",
  "telegramLink": "https://t.me/..." }
// ✓ Android gets per-app links — no wrong-app mismatch

Live demo — no signup needed

Try a real verification now

Try WhatsApp or Telegram verification instantly — or verify your email with a real OTP code.

Enter your mobile number and tap a channel. The verification happens right here — no redirects.

🇪🇺 GDPR compliant. Your number is used only for this demo.

or

Simple by design

Up and running in minutes

No complex setup. No per-message billing. Just an API key and three steps.

01
🔑
Get your API key
Sign up free and get your key instantly. No credit card required.
02
📲
Start a verification session
Call our API with a phone number. We return deep links for WhatsApp and Telegram.
03
User sends the code
User taps the button. Their app opens with the code pre-filled. They tap send.
04
Verified instantly
Your app receives a real-time webhook. User is verified. No polling needed.

Why AkidOTP

Built different

Most verification APIs charge per SMS. We use the free messaging apps your users already have — with SMS as a last-resort fallback.

💬
WhatsApp verification
User sends a code via WhatsApp — the app they already have open all day. Near-zero cost to you. Works everywhere WhatsApp works. On Android, the API returns separate links for WhatsApp Personal and WhatsApp Business so users always open the right app — preventing number mismatch errors.
✈️
Telegram verification
Completely free. User sends code to our bot in one tap. Instant verification. Popular across the Middle East, Central Asia, and Europe.
✉️
Email OTP fallback
Always available. When users have neither WhatsApp nor Telegram, email OTP is the safety net. Free tier includes 1,000/month.
📱
SMS fallback
For the rare case where a user has no WhatsApp, Telegram, or email — SMS is the last resort. The user sends a pre-filled text message to verify their number. Available on Starter plans and above with monthly limits to keep your costs predictable.
💰
Flat monthly pricing
No per-message charges. No surprise bills at month end. Pay a flat fee and verify as many users as your plan allows.
🌍
Works worldwide
SMS delivery fails in many countries. WhatsApp and Telegram work everywhere. AkidOTP reaches users that traditional SMS providers cannot.
🔒
Secure by default
Phone number ownership verified at the messaging app level. Sessions expire in 2 minutes. Anti-forwarding checks built in.

Channel comparison

What your users pay per verification

AkidOTP charges you a flat monthly fee. But SMS costs your end users money from their carrier. That's why WhatsApp and Telegram are better — free for everyone.

Channel Cost to you Cost to your user Best for
💬 WhatsApp $0.00 Free MENA, Europe, Asia, Africa
✈️ Telegram $0.00 Free Central Asia, Eastern Europe, MENA
✉️ Email $0.00 Free Universal fallback
📱 SMS Included in plan ~$0.04–$0.23 Last resort — no apps, no email

Estimated international SMS cost per message for your users (paid by user to their carrier)

🇱🇾 Libya
~$0.23
🇸🇾 Syria
~$0.18
🇪🇬 Egypt
~$0.04
🇦🇪 UAE
~$0.17
🇸🇦 Saudi
~$0.20
🇲🇦 Morocco
~$0.25
🇹🇳 Tunisia
~$0.12
🇩🇿 Algeria
~$0.15
🇰🇼 Kuwait
~$0.10

Estimates based on standard carrier rates for international SMS. Actual costs vary by carrier, plan, and promotions. SMS costs are paid by your end user — not by you. WhatsApp and Telegram are always free for both sides.

Transparent pricing

Simple. Flat. No surprises.

Start free. Scale when ready. No per-message charges ever.

Free
$0/mo
Forever free
1,000 verifications/month
  • Email OTP
  • API access
  • API documentation
  • Community support
  • SMS verification
Get started
Most popular
Starter
$9/mo
Billed monthly
10,000 verifications/month
  • WhatsApp verification
  • Telegram verification
  • Email OTP
  • 📱 SMS fallback (50/month)
  • Usage dashboard
  • Priority support
Start free trial
Growth
$29/mo
Billed monthly
100,000 verifications/month
  • Everything in Starter
  • 📱 SMS fallback (200/month)
  • Webhook events
  • Analytics & logs
  • Dedicated support
Get started
Enterprise
Custom
Contact us
Unlimited
  • Everything in Growth
  • 📱 Unlimited SMS
  • Custom SLA
  • White-label API
  • On-premise option
  • 24/7 support
Talk to us
See how much you save vs Twilio → شاهد كم توفّر مقابل Twilio ←

Accepted Payment Methods

BTC
USDT
ADA

Secure payments · No card data stored · Crypto verified on-chain

Developer first

Integrate in 10 minutes

Three ways to integrate. Pick the one that fits your stack.

📋
Copy & paste snippet
Add verification to any website with a single HTML snippet. No build step required.
📦
npm install akidotp
Official JS SDK for Node.js, React, and Next.js. TypeScript included.
🌐
REST API — any language
Python, PHP, Ruby, Go, Dart — if it can make HTTP requests, it works.
verify.js
// Start verification — returns WhatsApp + Telegram links const res = await fetch('https://akidotp.com/api/mobileverify/start', { method: 'POST', headers: { 'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: '+447911234567' }) }); const data = await res.json(); // data.whatsappLink — universal (iOS, desktop, fallback) // data.whatsappPersonalLink — Android intent → WhatsApp Personal // data.whatsappBusinessLink — Android intent → WhatsApp Business // data.telegramLink — Telegram bot link const isAndroid = /android/i.test(navigator.userAgent); if (isAndroid && data.whatsappPersonalLink) {   // Show a chooser — let user pick Personal or Business WhatsApp   // This prevents "Number mismatch" on dual-WhatsApp devices   showWhatsAppChooser(data.whatsappPersonalLink, data.whatsappBusinessLink); } else {   // iOS / desktop — open universal link directly   window.open(data.whatsappLink, '_blank'); } // User taps, sends code, verified ✓

Android smart routing

Two WhatsApp apps. Zero confusion.

In the MENA region, many users have both WhatsApp Personal and WhatsApp Business installed on the same phone — often on different numbers. The AkidOTP API returns separate intent links for each app. Show your users a simple chooser and eliminate number mismatch failures entirely.

WHAT YOUR USERS SEE ON ANDROID
Choose your WhatsApp
Make sure to open the app linked to your number
📱
WhatsApp Personal
com.whatsapp
💼
WhatsApp Business
com.whatsapp.w4b
iOS users see a single button — only one WhatsApp exists on iOS
API returns 3 WhatsApp links
whatsappLink       → universal (iOS + desktop)
whatsappPersonalLink → Android: WhatsApp Personal
whatsappBusinessLink → Android: WhatsApp Business
Detect Android — show the right UI
const isAndroid = /android/i.test(navigator.userAgent);

if (isAndroid && data.whatsappPersonalLink) {
  // show 2-button chooser
  openPersonal(data.whatsappPersonalLink);
  openBusiness(data.whatsappBusinessLink);
} else {
  // iOS / desktop
  window.open(data.whatsappLink);
}
If app isn't installed — graceful fallback
If the user only has WhatsApp Personal and taps the Business button, Android automatically opens the universal wa.me link instead. Nothing breaks.

Developer FAQ

Frequently asked questions

Everything you need to integrate all four channels — WhatsApp, Telegram, SMS, and Email.

What is AkidOTP and how does verification work?

AkidOTP is a multi-channel verification API. You verify your own users' phone numbers and email addresses over four channels — WhatsApp, Telegram, SMS, and Email. Phone channels use a reverse flow (the user sends a code to AkidOTP); Email uses a forward flow (AkidOTP emails a code the user types back). You call one REST API with your API key and get the result by polling or webhook.

What's the difference between the reverse (WhatsApp/Telegram/SMS) and forward (Email) flows?

In the reverse flow (WhatsApp, Telegram, SMS) AkidOTP never sends a message to the user — you display a short code and the user sends that code to AkidOTP from their own device, which proves they own the number. In the forward flow (Email) AkidOTP emails a 6-digit code and the user types it back for you to confirm.

How do I get an API key and authenticate?

Create a developer account, then generate an API key from the dashboard (or via POST /api/auth/keys). Send it on every verification request in the X-API-Key header. No other identifier is needed — your account and plan are resolved from the key.

X-API-Key: YOUR_API_KEY
How do I verify a phone number via the WhatsApp API?

Call POST /api/mobileverify/start with the user's phone. The response gives you a 6-digit code, a socketRoom session handle, and a whatsappLink (wa.me deep link). Show the code and open the link so the user sends it to AkidOTP on WhatsApp, then read the result by polling the status endpoint or via webhook.

curl -X POST https://akidotp.com/api/mobileverify/start \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"+218912345678"}'
How do I verify a phone number via Telegram?

Use the same POST /api/mobileverify/start endpoint; the response includes a telegramLink (t.me bot link). The user opens it, taps Start, and shares their contact with the AkidOTP bot. Track the result with the same status endpoint or a webhook.

How do I verify a phone number via SMS?

Again call POST /api/mobileverify/start; if your plan includes SMS the response adds smsNumber, smsBody, and ready-made smsLink / smsLinkIOS deep links. The user taps the link (or texts the code to the number) to send it to AkidOTP. Get the result via polling or webhook.

How do I verify an email address?

Call POST /api/verify/email/send with phone and email to send a 6-digit code, then POST /api/verify/email/confirm with email and code. On success the response returns verified: true plus a signed JWT in the token field. Email is a synchronous check — it never fires a webhook.

POST /api/verify/email/send     {"phone":"+218912345678","email":"user@example.com"}
POST /api/verify/email/confirm  {"email":"user@example.com","code":"483920"}
→ {"verified":true,"phone":"...","email":"...","token":"JWT_TOKEN"}

Important: the email verification token proves email ownership only — it does not prove phone ownership. The token contains no phone claim; do not treat email verification as proof that the user owns any phone number.

How do I receive verification results — polling vs webhook — and how do I verify the webhook signature?

Two ways. Polling: GET /api/mobileverify/status?room=SOCKET_ROOM returns verified: true with the phone when done, or a pending / expired / mismatch state otherwise. Webhook: if you set a webhook URL on your key, AkidOTP POSTs a signed JSON notification on success.

Verify the webhook by computing HMAC-SHA256 of the raw request body with your key's webhook secret and comparing it to the X-AkidOTP-Signature header (hex). Email does not use webhooks — its result is returned synchronously.

X-AkidOTP-Signature = HMAC_SHA256(webhook_secret, raw_request_body)   // hex

The signed webhook is the authoritative, one-shot verification result — rely on it for authentication decisions. The /status polling endpoint is advisory: a verified result is served only briefly (single-use, with a short ~30s grace) and then withheld, so a stale poll cannot be replayed.

How do codes and limits work?

Codes are short-lived and expire after a few minutes. Email verification allows a limited number of attempts — after that the code is invalidated and you must request a new one. There is no separate resend endpoint: calling start again generates a fresh code and invalidates the previous one (start is not idempotent).

Which channels are available on each plan, and what are the limits?

Free: Email only, 1,000 verifications/month. Starter: all four channels, 10,000/month including 50 SMS. Growth: all four channels, 100,000/month including 200 SMS. Enterprise: all four channels, unlimited. Reverse channels (WhatsApp, Telegram, SMS) require Starter or higher; Email is on every plan. Your overall monthly limit and SMS allowance are enforced, and upgrades apply on your very next request.

What error responses should I handle?

Handle 401 for a missing or invalid API key, 403 when a channel isn't on your plan, 429 for rate-limit or monthly-limit exceeded, 400 for bad input (e.g. a missing phone), and 401 for an invalid or expired email code. Every error is JSON with an error message.

Is there a test mode?

There is no separate sandbox: integrate against the live endpoints and verify with your own phone or email. Email verification works on every plan (including Free), so it's the fastest way to test the full send → confirm flow end-to-end. Reverse channels require Starter or higher to test.

Ready to verify your
first user?

Start free. 1,000 verifications/month. No credit card needed.

Create free account Talk to sales