MobiReachMobiReach
☰ ◐ Sign in Get started free
</> DEVELOPER PLATFORM

An SMS API you'd actually want to use.

Send SMS and OTPs from your app, website, or internal system. Bearer tokens β€” never passwords in query strings. Signed webhooks, idempotency keys, a real sandbox, and predictable status codes.

code samples
curl -X POST https://mobireach.theanathoth.com/api/v1/sms/send \
  -H "Authorization: Bearer $MOBIREACH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"to": ["+256772123456"], "message": "Hello from MobiReach"}'
// Response
201 Created
{ "batch_id": "batch_311", "status": "queued",
  "messages": [{ "message_id": "msg_90211", "to": "+256772123456", "status": "queued" }], … }
// CORE ENDPOINTS

Everything is one REST call away.

Paths are relative to the base URL https://mobireach.theanathoth.com/api/v1.

POST
/sms/send
Send a single SMS or a bulk campaign.
POST
/otp/send
Generate and deliver a one-time code.
POST
/otp/verify
Validate a code within its expiry window.
GET
/messages/:message_id
Fetch delivery status and failure reason (the same id your webhooks carry).
GET
/batches/:batch_id
Progress of a whole send: delivered, failed, pending.
POST
/contacts
Sync contacts and groups from your system.
// OTP PRODUCT

Ship login codes this afternoon.

Two endpoints β€” send and verify. We handle 6-digit codes, single-use enforcement, 5–10 minute expiry, attempt limits, resend cooldowns, and fraud monitoring. You handle nothing.

βœ“ 6-digit, single-use codes with configurable expiry
βœ“ Attempt limits, resend cooldowns, per-number and per-key limits
βœ“ Automatic throttling on volume spikes, number-range bursts and never-verified codes
// 1. Send the code
POST /otp/send
{ "to": "+256772123456", "purpose": "login" }
β†’ { "request_id": "otp_8f2kq0x1…", "status": "sent", "expires_in": 300 }
// 2. Verify what the user typed
POST /otp/verify
{ "request_id": "otp_8f2kq0x1…", "code": "482910" }
β†’ { "verified": true, "status": "approved" }
// WEBHOOKS

Delivery events, pushed to you

Every status change hits your endpoint β€” signed (HMAC-SHA256 with a timestamp), retried with backoff, and visible in the delivery log with a redeliver button. Includes message id, batch id, status and failure reason.

POST your-app.com/webhooks
X-MobiReach-Signature: t=1759741203,v1=5f2b…
{ "id": "evt_k2m9x8…", "event": "message.delivered",
  "data": { "message_id": "msg_90211", "batch_id": "batch_311",
    "status": "delivered", "network": "mtn" } }
// API KEYS & SCOPES

Scoped keys, shown once

Generate a key, see it once, store only the hash. Rotate with a grace period or revoke anytime. Restrict each key to the scopes, IP ranges and rate limit it needs.

sms:send otp:send otp:verify contacts:read contacts:write reports:read balance:read sender_ids:read webhooks:write
{ }

Real sandbox

Test sends and delivery callbacks with sandbox keys β€” no credits spent, no real SMS sent. Flip to live with one switch.

πŸ“Š

Logs & rate limits

Inspect every request, response, latency, and webhook attempt. Transparent per-key rate limits (with a separate limit on the OTP endpoints), reported in X-RateLimit headers.

All systems normal

Public status page

Real-time delivery health, incident history, and uptime β€” so you always know what's happening before your users do.

Grab a sandbox key and build.

Free to start. No credits needed until you go live.