API reference
Messages, templates, verification, delivery states and errors in one reference.
Open the overviewThe same authentication, message model, templates, webhooks and delivery states across every channel. Build once, then expand without rebuilding your messaging stack.
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.
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" } }'{ "id": "msg_01K7S9QZ4M", "status": "queued", "channel": "whatsapp", "fallback": ["sms"], "reference": "order-1042-receipt"}Messages, templates, verification, delivery states and errors in one reference.
Open the overviewSigned delivery and reply events, retried until acknowledged, deduplicated by message id.
Read about webhooksTest keys for a safe sandbox, live keys when your sender is approved.
Get startedSend 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.
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.
{ "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"}Tell us about your stack and the messages you send. We will set up a sandbox with you.
Larger volumes or a bank? Talk to sales