API overview.
How a Send integration fits together. The full reference, API keys and sandbox come with your account.
Call Send from your server.
Create an API key in your workspace and keep it on your server. Your backend authenticates your user, decides what to send and calls Send. Test keys work in the sandbox; live keys work once your sender is approved.
Never put an API key in browser or mobile app code.
A consistent message request.
POST /v1/messagesAuthorization: Bearer sk_test_••••••••Idempotency-Key: order-1042-receipt{ "to": "+255700000000", "channel": "sms", "sender": "Send", "message": "Your payment has been received.", "reference": "order-1042"}Use a server-generated idempotency key for each logical send. A network timeout must not create a second billable message when the request is retried.
| Field | Meaning | Validation |
|---|---|---|
| to | Recipient phone number, device or email address | Validated for the destination and channel |
| channel | sms, whatsapp, rcs, push, email or auto | Checked against your account's channels |
| sender | Your registered sender ID or number | Must belong to your account |
| message / template | Final text, or a template with variables | Encoding and segments calculated for SMS |
| reference | Your own business reference | Returned on every event; not a substitute for idempotency |
{ "id": "msg_01K7S9QZ4M", "status": "queued", "channel": "whatsapp", "fallback": ["sms"], "reference": "order-1042-receipt"}Accepted is not delivered.
Send separates request acceptance from delivery evidence. An unknown outcome stays visible until it can be reconciled.
| State | Meaning |
|---|---|
| queued | Accepted for processing. No delivery claim yet. |
| submitted | Handed to the operator or channel provider. |
| delivered | Confirmed by the channel's delivery report. |
| failed / expired | A final outcome from the channel or the platform. |
| unknown | No clear outcome yet. Reconcile before you retry. |
A reliable delivery history.
Verify each event's signature, acknowledge promptly, process asynchronously and deduplicate by message id. Do not let an older event overwrite a final message state.
{ "event": "message.delivered", "message_id": "msg_01K7S9QZ4M", "channel": "sms", "attempts": [ { "channel": "whatsapp", "status": "unavailable" }, { "channel": "sms", "status": "delivered" } ], "occurred_at": "2026-09-17T09:41:00+03:00"}Delivery and read status are different things. SMS never reports a read receipt, so Send never invents one.
Make failures actionable.
Errors fall into clear categories: invalid destination, unapproved sender, insufficient credit, rate limit and channel unavailable. Your reference is preserved for support, and provider internals stay out of customer-facing responses.
Some operators pause promotional SMS overnight. Send reports the reason on the message so you can reschedule instead of retrying blindly.
What comes with your account.
The full API reference, a Postman collection, REST examples in Node.js, PHP, Python, Java and Flutter, release notes and an operational status page.
Your next connection
starts with Send.
Create your account in a minute. Prepaid in shillings, no card needed, and our team is one message away.
Larger volumes or a bank? Talk to sales