Savaraflow
Open console
← Developers

Webhooks

Every status event, explained.

Pick a status to see when it’s sent, the exact payload your server receives and what to do with it. Then copy a signed test command to try your handler.

Delivered

The provider reported delivery to the handset or inbox.

Mark the notification as delivered in your system.

POST your-callback · message.status
{
  "id": "5b0e2f4c-9a1d-4f6e-8c3b-2d7a90e1c4f5",
  "type": "message.status",
  "messageId": "8c1f6a20-73b9-4e0d-a2f4-5c9e11d03b77",
  "contactId": "3f9d2c11-6b4a-4e8f-9d20-7c1e5a8b0f62",
  "channel": "SMS",
  "status": "delivered",
  "occurredAt": "2026-11-09T10:42:07.512Z"
}

Send a signed test to your own server

Your browser blocked signing. Open this page over HTTPS or localhost.

Signed in your browser. The secret never leaves this page. The timestamp is fixed, so turn off your freshness check while testing.

Payload

What every event contains.

id
The event ID. Also sent as X-Savara-Event. Use it to ignore duplicates.
type
Always message.status for status changes.
messageId
The ID returned when you sent the message.
contactId
The contact the message was sent to.
channel
SMS, WhatsApp or Email.
status
queued, sending, sent, delivered, read, failed or review.
occurredAt
When the status changed, in UTC.
Headers
X-Savara-Event, X-Savara-Timestamp and X-Savara-Signature (sha256=…).

Events can arrive out of order. Reply with any 2xx to acknowledge, and fetch GET /api/v1/messages/{id} when you need the current state. Test a signature

Register your callback.

Add an HTTPS callback and signing secret in the console.

Open the console

Choose what SavaraFlow can save on this device. You can change your choice here at any time.