Developers

Five channels.
One predictable API.

The same authentication, message model, templates, webhooks and delivery states across every channel. Build once, then expand without rebuilding your messaging stack.

Integrate in an afternoon

One request.
Your language.

Send a template to a customer and let Send pick the channel. Use an idempotency key so a retried request never creates a second billable message.

  • Bearer API keys scoped to your workspace
  • Idempotency keys on every send
  • channel: "auto" follows your fallback order
  • Accepted is not delivered: webhooks confirm the outcome
terminalPOST /v1/messages
curl https://api.send.co.tz/v1/messages \  -H "Authorization: Bearer $SEND_API_KEY" \  -H "Idempotency-Key: order-1042-receipt" \  -H "Content-Type: application/json" \  -d '{    "to": "+255700000000",    "channel": "auto",    "template": "payment_received",    "variables": { "amount": "75,000", "reference": "SD93K82" }  }'
202 Acceptedresponse
{  "id": "msg_01K7S9QZ4M",  "status": "queued",  "channel": "whatsapp",  "fallback": ["sms"],  "reference": "order-1042-receipt"}

API reference

Messages, templates, verification, delivery states and errors in one reference.

Open the overview

Webhooks

Signed delivery and reply events, retried until acknowledged, deduplicated by message id.

Read about webhooks

Sandbox and keys

Test keys for a safe sandbox, live keys when your sender is approved.

Get started
A clean integration boundary

Send on the surface.
Proven delivery at the core.

Send runs on the messaging infrastructure behind Malipopay. Credentials stay server-side, every request is scoped to your account, and delivery evidence comes back as one normalised event.

  • Existing Malipopay SMS integrations keep working
  • Approved sender IDs and message history carry over
  • Operator delivery reports become one event format
  • One billing ledger across channels
Your applicationServer-side call with your API key
Send APIAuthorisation, account scope, templates and routing
Channel deliveryOperators, WhatsApp, RCS, push and email
Delivery events

See every step
of every message.

Webhooks tell you which channels Send tried and which one delivered. Acknowledge quickly, process asynchronously, and never let an older event overwrite a final state.

message.queuedmessage.deliveredmessage.failedmessage.replied
Webhook 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"}

Ready to integrate?
Get your sandbox keys.

Tell us about your stack and the messages you send. We will set up a sandbox with you.

Talk to engineering

Larger volumes or a bank? Talk to sales