api: 99.99%

OTPs without
the complexity.

Deliver OTPs across Africa in real time
in one request.

copy AI prompt
POST /v1/otp/send HTTP/1.1
Host: api.tambua.me
Authorization: Bearer $TAMBUA_KEY
Content-Type: application/json

[
  { "phone": "+254712345678", "purpose": "login",  "channel": "sms"      },
  { "phone": "+254712345679", "purpose": "signup", "channel": "whatsapp" },
  { "phone": "+233244000000", "purpose": "txn",    "channel": "voice"    },
  { "email": "user@example.com", "purpose": "login",  "channel": "email"    }
]
200 OK · 142msverified
id: "tambua_otp_8f3a9c12"
channel: "sms"
expires: "5m"
Trusted by African startups shipping at the edge
lendekakibuwazipaynorthdropkorogimidmoja
// AI SKILL

Skip the docs.
Brief your AI.

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.

tambua-api.prompt
Drop into your AI assistant's system prompt or skill folder
// QUICKSTART

As easy,
As send, see, tick.

No SDK required, no SIM pools to provision, no carrier contracts. Use cURL if you want.

01

Send the code

One endpoint, every channel. We pick the carrier route for the destination country.

POST /v1/otp/send
phone="+254712345678"
channel="sms"
02

User receives it

Carrier-graded SMS, email, WhatsApp or voice — same payload, one signed receipt.

> "482910 is your Lendeka
>  verification code.
>  Expires in 5 minutes."
03

Verify in one call

POST the code back. Get verified, expired, or attempts-left in a single response.

POST /v1/otp/verify
id="tambua_otp_8f3a9c12"
code="482910"
channel=sms

SMS

Local routes across every African market we ship in. Auto carrier failover.

channel=email

Email

Transactional sending with sub-second deliverability.

channel=whatsapp

WhatsApp

Approved templates with native verification flows.

channel=voice

Voice

Spoken codes for landlines and accessibility.

channel=mpesa

M-PESA

Verify Kenyan users with an M-PESA PIN prompt confirmed by Safaricom — no code to type.

channel=reverse

Reverse OTP

The user sends an SMS or places a missed call to verify themselves. Inbound, code-free.

coming soon

Telegram

Verification through the Telegram bot platform.

coming soon

USSD

Session-based codes over USSD — no data plan needed.

coming soon

Shortcode

Dedicated short codes for high-throughput sender IDs.

// CONSOLE

Every OTP, accounted for.

Live delivery rates, verification logs, per-environment balance and failure breakdowns. The console mirrors the API — what you see is what your code sees.

Overview
Verifications, delivery stats.
BalanceLive
KES 427.00
Delivery rate
98.6%
↑ 2.4% vs last 7d
Verification success
76.4%
↑ 6.7% vs last 7d
Delivery breakdown
Last 24 hours · 14 sent
100.0%DELIVERED
SMS14100.0%
Failure Logs
10 in last 24h
Code expired
10
Last code expired 18m ago
Verification logs
All 14Verified 3Failed 0Expired 10
PHONEPURPOSECHANNELVERIFICATIONDELIVERYDATE
+***0067loginSMSpendingdeliveredMay 25, 11:17 · 6m ago
+***8877loginSMSverifieddeliveredMay 25, 11:13 · 10m ago
+***0967loginSMSexpireddeliveredMay 25, 10:57 · 26m ago
+***7767loginSMSexpireddeliveredMay 25, 10:49 · 34m ago
+***7707loginSMSexpireddeliveredMay 25, 10:21 · 1h ago
// WEBHOOKS

Signed events.
Replay any time.

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.

otp.createdCode generated
otp.deliveredCarrier DLR
otp.verifiedUser entered code
otp.failedMax attempts
otp.expiredTTL elapsed
otp.undeliveredCarrier error
otp.verified · sample payload 200 OK
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"
  }
}

Send your first OTP
before this page reloads.

Sandbox keys are free. No card required. Test against the same routing and templates as production.

Get the AI prompt
# 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