POST /v1/otp/send HTTP/1.1 Host: api.tambua.me Authorization: Bearer $TAMBUA_KEY Content-Type: application/json { "phone": "+254712345678", "purpose": "login" }
One paste into Cursor, Claude or ChatGPT and your assistant knows the endpoints, auth, bulk body shape and channel rules. No SDK required — works with plain fetch / requests / cURL.
No SDK required, no SIM pools to provision, no carrier contracts. Use cURL if you want.
One endpoint, every channel. We pick the carrier route for the destination country.
POST /v1/otp/send phone="+254712345678" channel="sms"
Carrier-graded SMS, email, WhatsApp or voice — same payload, one signed receipt.
> "482910 is your Lendeka > verification code. > Expires in 5 minutes."
POST the code back. Get verified, expired, or attempts-left in a single response.
POST /v1/otp/verify id="tambua_otp_8f3a9c12" code="482910"
Set an ordered fallback for each app: SMS first, then WhatsApp, then Voice. One code, one token, one verify call.
POST /v1/otp/send # no channel: your journey runs { "phone": "+254712345678", "purpose": "login" }
201 Created
{
"otp_id": "tambua_otp_8f3a9c12",
"channel": "whatsapp",
"journey": {
"step": 2,
"steps": 3,
"attempts": [
{ "step": 1, "channel": "sms", "status": "failed" },
{ "step": 2, "channel": "whatsapp", "status": "sent" }
]
},
"otp_token": "…"
}Local routes in Kenya, with more African markets to follow. Auto carrier failover.
Transactional sending with sub-second deliverability.
Approved templates with native verification flows.
Spoken codes for landlines and accessibility.
Verify Kenyan users with an M-PESA PIN prompt confirmed by Safaricom — no code to type.
The user sends an SMS or places a missed call to verify themselves. Inbound, code-free.
Verification through the Telegram bot platform.
Session-based codes over USSD — no data plan needed.
Dedicated short codes for high-throughput sender IDs.
Live delivery rates, verification logs, per-environment balance and failure breakdowns. The console mirrors the API — what you see is what your code sees.
| Channel | Sent | Delivered |
|---|---|---|
| SMS | 8,105 | 99.1% |
| 4,421 | 99.4% | |
| 2,026 | 98.9% | |
| Voice | 1,474 | 97.8% |
| M-PESA | 1,658 | 99.7% |
| Reverse OTP | 737 | 99.2% |
Failures and warnings show up here with a fix.
codes delivered by a fallback channel in the last 24h that a single channel would have missed
POST'd as JSON with an HMAC signature. We retry failed deliveries with exponential backoff up to 24h, and you can replay any event from the dashboard.
POST https://yourapp.com/webhooks/tambua Content-Type: application/json X-Tambua-Signature: t=1716305544,v1=5257a8… X-Tambua-Event: otp.verified { "id": "tambua_evt_88f0a64", "type": "otp.verified", "created": "2026-05-25T14:32:24.110Z", "data": { "otp_id": "tambua_otp_8f3a9c12", "purpose": "login", "channel": "sms", "verified_at": "2026-05-25T14:32:24.108Z" } }
Test keys are free and need no card. The code comes back in the API response, so you can build and test without a phone.
# in your terminal, right now $ export TAMBUA_KEY=tambua_live_… $ curl -X POST https://api.tambua.me/v1/otp/send \ -H "Authorization: Bearer $TAMBUA_KEY" \ -d '[{"phone":"+254712345678"}]' → otp_8f3a9c12 sent · 142ms