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
}

On this page