A single REST endpoint to send and verify one-time passcodes over SMS or WhatsApp. Direct carrier routing into the Kenyan mobile networks, M-Pesa-friendly billing, three lines of curl to integrate. Built for people who don't want to pay Twilio prices to verify a Kenyan phone number.
curl -X POST /api/v1/otp/send \ -H "Authorization: Bearer otp_live_..." \ -d '{"phone": "+254712345678", "channel": "whatsapp"}' # channel: "sms" (default) or "whatsapp" # → { "id": "ot_2k7x...", "expires_in": 300 }
Pick the channel per request. SMS goes direct to all Kenyan MNOs — no European routing hop. WhatsApp uses Meta’s authentication template, with one-tap autofill on Android.
M-Pesa top-up. No FX rounding, no card surprise. The only mainstream OTP API where you can pay your bill from Lipa na M-Pesa.
Rate-limited per phone, per IP, per prefix. Premium-rate destinations blocked outright. SMS-pumping fraud doesn't drain your balance overnight.
Two REST calls. The full integration is shorter than reading this page.
POST a phone number plus channel ('sms' or 'whatsapp'), get back an opaque request id. We generate a 6-digit code, hash it, dispatch via the chosen channel.
POST /api/v1/otp/send
{ "phone": "+254712345678",
"channel": "whatsapp" }
Your UI collects whatever the user types. We don't see it. You don't store it.
"Enter the 6-digit code we sent"
POST the request id and the code the user typed. We bcrypt-compare against the hash and return verified true/false.
POST /api/v1/otp/verify
{ "id": "ot_2k7x...",
"code": "486029" }
One number. Includes the SMS — no per-MNO surcharge surprise.
Drop your email and we'll auto-send your API keys, sandbox credits, and the first month's SMS at-cost — no waitlist, no approval queue.