For Ugandan developers and SaaS
REST API with HTTP Basic Auth, JSON bodies, sub-5-second OTPs on MTN and Airtel, UGX pricing, Mobile Money top-ups. The same API our own dashboard uses.
HTTP Basic Auth keeps integration trivial. No SDK to install, no OAuth dance, no signed-URL ceremony. Send the apiKey as the Basic-Auth username and the apiSecret as the password.
Generate API keys from the dashboard — view your walletId next to them.
Revoke a key in one click if it leaks.
Per-key lastUsedAt timestamp so you can spot unused credentials.
All endpoints scope to your walletId — no risk of crossing into another account.
Wallet balance. Top up via Mobile Money. Send a single SMS. Send bulk. Send to a saved group. List send history. Create groups. Add contacts. Everything you'd hand-roll, already there.
POST /api/v1/sms/send — single or bulk, plain or array recipient.
POST /api/v1/account/topup — kicks off a Mobile Money charge.
GET /api/v1/account/balance — check wallet before sending.
POST /api/v1/groups + /api/v1/groups/{id}/contacts — manage saved groups.
GET /api/v1/sms/history — paginated send history per wallet.
Wallet writes are atomic and idempotent. Failed sends refund automatically. Rate limits are sane. You can use this for OTPs without worrying about double-charges or stuck balances.
Wallet charges are wrapped in a Postgres $transaction with a balance >= cost gate.
Refunds on provider failure inside the same request lifecycle.
Deposit idempotency on (id, status) so retry storms can't double-credit.
Per-request errors include machine-readable error codes for clean retries.
Features
apiKey + apiSecret. Show once, hash forever. Revoke from the dashboard.
Prioritized routing on MTN and Airtel for time-sensitive verification flows.
POST callbacks with per-recipient status. Use them to retry, escalate or report.
Top up the wallet from your own phone via the API. No card, no forex, no bank.
lastUsedAt on every key. Spot unused or compromised credentials in seconds.
No SDK required. The /dashboard/integration page hands you cURL with your live walletId.
FAQ
HTTP Basic Auth. Your API key is the username and your API secret is the password. Generate keys at /dashboard/integration and send them in the Authorization header as base64(key:secret).
Median end-to-end delivery is 3-5 seconds on MTN Uganda and 4-7 seconds on Airtel Uganda. Wesendall routes via prioritized SMS infrastructure for time-sensitive traffic.
Yes — register a webhook URL and we'll POST a delivery report per recipient (sent / delivered / failed) with the message ID. See the API docs at /dashboard/integration.
UGX 35 per SMS unit (160 chars). Long messages are split into multiple units and charged per unit. Volume rates drop to UGX 32. Top up your wallet with MTN MoMo or Airtel Money — no card required.
The API is a small REST surface — most teams use plain cURL or their language's HTTP client (Axios, requests, Guzzle, net/http). The /dashboard/integration page has copy-paste cURL samples templated with your live walletId.
Create an account, mint a key, hit the endpoint with cURL. The next message is yours.