← 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.