SelanimDocs

Selanim Bulk SMS API

A REST API for sending SMS across every Tanzanian network, with delivery evidence you can hand to finance.

The API speaks JSON over HTTPS. Every request carries a bearer API key, every response includes a request id, and every message you send is reconcilable against your wallet.

v1 is stable. It will gain optional fields and new endpoints; it will not rename or remove one. Anything that would break a working integration goes to v2 instead — see the changelog for what counts as breaking.

text
Base URL   https://bulksmsapi.selanim.com/v1
Auth       Authorization: Bearer <SBS_API_KEY>
Format     application/json; charset=utf-8

Two ways to send

Everything in these docs is also available in the dashboard. The API is for the traffic you want automated — OTPs, receipts, tracking updates — while a one-off blast to a saved group is usually easier from the portal.

Start on a test key

A key beginning sbs_test_ runs the entire path — validation, the sender ID check, the message log, your delivery webhooks — without reaching an operator or costing anything. Every example in these docs works against one.

Start here

Send SMS

One endpoint for single messages and bulk blasts.

Read more

Authentication

Bearer keys, rotation and IP allowlisting.

Read more

Delivery webhooks

Get operator status on your own endpoint.

Read more

Contacts & groups

Build the audiences you send to.

Read more

Conventions

Phone numbers are accepted as 255XXXXXXXXX, +255XXXXXXXXX or 0XXXXXXXXX and are normalised to E.164 before dispatch. Timestamps are ISO 8601 in UTC. Money is expressed in the minor-unit-free integer form of the account currency (TZS has no minor unit).

Message length follows the GSM-7 standard: 160 characters for a single part, 153 per part once a message splits. Any character outside the GSM alphabet switches the whole message to UCS-2 (70 / 67 characters). The API returns the computed part count on every send so billing is never a surprise.

Lists are paged with page and pageSize and answer with a meta block. Request and response bodies are camelCase throughout. Unknown fields in a request body are refused rather than ignored, so a misspelled senderId is reported to you instead of quietly sending under the wrong name.