REST API · Delivery receipts · South Africa

Messaging,
simplified.

Bulk SMS with a REST API. Send to one number or five hundred, schedule ahead, get delivery receipts pushed to your server, and read back exactly what each message cost, broken down by network.

Networks we price
What it does

Everything below is in the product today

With a page in the console for each of it. No add-ons, no upgrade wall.

Send in bulk

Up to 500 messages a request. Each one is checked and priced on its own, so a bad number is reported back to you and skipped rather than failing the batch.

Know what arrived

Delivery receipts come back from the network and are pushed to your server, signed and retried. expired and undelivered arrive as separate outcomes, so you can retry the first and drop the second.

Schedule and brand

Book a send up to three months ahead and it waits as a database row, not a timer. Set a sender ID of up to 11 characters, and the console tells you which routes can carry one.

Honour opt-outs

One suppression list, checked on every send: the API, the console, a group, a reply from the inbox. A reply of STOP adds the sender to it.

Two-way conversations

Replies are matched to the account that last messaged that handset, and threaded with what you sent, so a conversation reads in order.

Split it across teams

Give a team its own credentials and its own credit balance. Each sub account sees only its own messages, groups and opt-outs.

Built for developers

One endpoint, a response you can trust

Authenticate with a bearer token, post a batch, and read back the cost, the parts and a fault report naming anything that could not be sent. No SDK required.

The cost, itemised. Every response carries a per-network breakdown of what you were charged. Receipts pushed to you. Signed webhooks, retried up to six times until your server answers with a 2xx. Refusals come back named. A number we will not send to is reported with its reason, and never billed.
POST /v3/BulkMessages
$ curl -X POST https://your-host/v3/BulkMessages \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{ "messages": [ { "destination": "0821234567",
                          "content": "Your code is 4821" } ] }'

// 200 OK
{
  "statusCode": 200,
  "sendResponse": {
    "eventId": 4821,
    "messages": 1,
    "parts": 1,
    "cost": 0.28,
    "costBreakdown": [ { "network": "Vodacom",
                         "quantity": 1, "cost": 0.28 } ],
    "remainingBalance": 9971.72,
    "sample": "Your code is 4821",
    "errorReport": { "noNetwork": 0, "noContents": 0,
                     "contentToLong": 0, "duplicates": 0,
                     "optedOuts": 0, "faults": [] }
  },
  "errors": []
}
500
Messages per request
3 mo.
Schedule ahead
6
Webhook delivery attempts
11
Sender ID characters
Made for South African senders

Opt-out, signatures and scoped keys

Opt-out first

Opt-out is first class. One suppression list is checked on every send — the API, the console, a group, a reply — and a STOP reply adds the sender to it.

Signed webhooks

Every receipt is signed over a canonical string that includes the timestamp, so your server can verify it came from us and reject a replay.

Scoped credentials

Sub accounts isolate messages, groups and opt-outs, each with its own key and its own credit balance. A sub account cannot see a sibling's traffic.

Pricing

Pay per message, priced per network

Top up credit and spend it as you send. What a message costs depends on the network it goes to, and you see the figure before you are charged.

Common questions

How am I charged?

You hold credit and each message is priced against the recipient's network when you send. The response itemises what you were charged, network by network, and a message we refuse is never billed.

Do you support two-way SMS?

Replies are stored and threaded against the account that last messaged that handset, and shown in the console inbox. There is no webhook for an inbound message yet.

Can I set a custom sender ID?

Yes, up to 11 characters. Whether it survives depends on the route: the Vodacom route cannot carry one, so those messages keep the gateway's own sender, and the console says so on the send page.

What about failed messages?

expired and undelivered come back as separate outcomes, so you can retry the first and drop the second without guessing.

Start sending in minutes

Create an account, get credentials, and post your first batch. Start with 50 free credits, no card required.