Developer resources

API overview.

How a Send integration fits together. The full reference, API keys and sandbox come with your account.

01 / Getting started

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.

02 / Messages

A consistent message request.

RequestPOST /v1/messages
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.

FieldMeaningValidation
toRecipient phone number, device or email addressValidated for the destination and channel
channelsms, whatsapp, rcs, push, email or autoChecked against your account's channels
senderYour registered sender ID or numberMust belong to your account
message / templateFinal text, or a template with variablesEncoding and segments calculated for SMS
referenceYour own business referenceReturned on every event; not a substitute for idempotency
Response202 Accepted
{  "id": "msg_01K7S9QZ4M",  "status": "queued",  "channel": "whatsapp",  "fallback": ["sms"],  "reference": "order-1042-receipt"}
03 / Delivery

Accepted is not delivered.

Send separates request acceptance from delivery evidence. An unknown outcome stays visible until it can be reconciled.

StateMeaning
queuedAccepted for processing. No delivery claim yet.
submittedHanded to the operator or channel provider.
deliveredConfirmed by the channel's delivery report.
failed / expiredA final outcome from the channel or the platform.
unknownNo clear outcome yet. Reconcile before you retry.
04 / Webhooks

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.

Delivery eventJSON
{  "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.

05 / Errors

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.

06 / Resources

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.

Start free (opens in a new tab)

Larger volumes or a bank? Talk to sales