Quickstart
From zero to a delivered message in four steps.
Rather click than type?
1. Get an API key
Sign in to the portal, open Developer API and copy your live key. Keys look like sbs_live_… and grant full access to your account, so store them in your secret manager — never in client-side code or version control.
export SBS_API_KEY="sbs_live_7f4c9a2e1d8b45f0a3c6e9d2b7f1a4c8"2. Check your balance
A quick sanity check that your key works and your wallet is funded.
curl -X GET "https://bulksmsapi.selanim.com/v1/wallet/balance" \
-H "Authorization: Bearer $SBS_API_KEY"Needs: curl, on every machine already.
{ "balance": 12480, "currency": "TZS", "lowBalanceThreshold": 500 }3. Send a message
Use an approved sender ID. If yours is still pending, the request is rejected with sender_id_not_approved.
curl -X POST "https://bulksmsapi.selanim.com/v1/sms/send" \
-H "Authorization: Bearer $SBS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"senderId": "SELANIM",
"to": [
"255712345678"
],
"message": "Karibu Selanim Bulk SMS!"
}'Needs: curl, on every machine already.
A successful call returns 202 Accepted with a per-recipient breakdown:
{
"requestId": "REQ-90021",
"parts": 1,
"cost": 15,
"currency": "TZS",
"messages": [
{
"id": "SM-88f2c1",
"to": "+255712345678",
"network": "Vodacom",
"status": "queued"
}
]
}4. Receive the delivery report
Register a webhook URL and we POST every status change as the operator reports it — usually within a few seconds.
{
"event": "message.delivered",
"messageId": "SM-88f2c1",
"to": "+255712345678",
"network": "Vodacom",
"status": "delivered",
"deliveredAt": "2026-08-17T09:12:44Z"
}Test without spending credit
sbs_test_ instead. Every example on this page works against one: the request is validated, the sender ID is checked, the message is written to your log, and a simulated delivery report fires against your webhook — but nothing reaches an operator and nothing is billed. Send to 255740000001 to force a delivered report, or 255740000002 to force a failure.Prefer the dashboard?

