Webhook events
The payload of every webhook event.
Every event has the same envelope. data depends on the event type. See Webhooks to register an endpoint and verify signatures.
{
"id": "evt_01M6MK2Q8YV4J3Z6Q1H0T7R5PA",
"type": "message.delivered",
"createdAt": "2026-11-05T00:48:01.902Z",
"data": {}
}message.sent
The message was handed to the network.
{
"id": "msg_01M6MJSBV7KXZGYK5TZGGA0P6R",
"to": "+233241234567",
"from": "MYSHOP",
"status": "sent",
"segments": 1,
"reference": "order-1042",
"batchId": null,
"errorCode": null
}message.delivered
The message reached the phone. Same fields as message.sent, plus refunded.
{
"id": "msg_01M6MJSBV7KXZGYK5TZGGA0P6R",
"to": "+233241234567",
"from": "MYSHOP",
"status": "delivered",
"segments": 1,
"reference": "order-1042",
"batchId": null,
"errorCode": null,
"refunded": false
}message.failed
The message ended as undelivered, failed or expired. errorCode gives the reason, and refunded says whether its cost was returned to your wallet.
{
"id": "msg_01M6MJSBV7KXZGYK5TZGGA0P6R",
"to": "+233241234567",
"from": "MYSHOP",
"status": "undelivered",
"segments": 1,
"reference": "order-1042",
"batchId": null,
"errorCode": "undelivered",
"refunded": false
}batch.completed
Every message in the batch has a final status.
{
"batchId": "bat_01M6MJSBW6TNFXDJ48HMRQXBPJ",
"reference": "promo-november",
"total": 2,
"rejected": 0,
"delivered": 2,
"failed": 0,
"completedAt": "2026-11-05T00:52:10.000Z"
}balance.low
Your balance fell below your alert threshold. Amounts are in GHS.
{ "balance": "9.96", "threshold": "10", "currency": "GHS" }sender_id.updated
A sender ID's review status changed.
{
"id": "4497468d-9d39-4bef-b7eb-23369ae9f52b",
"name": "MYSHOP",
"status": "approved",
"rejectionReason": null
}