Webhooks
Receive real-time notifications for message events.
Setting up webhooks
Per-message webhook
Include a webhook_url when sending:
{
"to": "+1234567890",
"message": "Hello!",
"webhook_url": "https://your-app.com/webhooks/sms"
} Global webhook
Configure in Dashboard → Settings → Webhooks for all messages.
Webhook payload
Ender sends a POST request with JSON body:
{
"event": "message.delivered",
"data": {
"id": "msg_abc123",
"status": "delivered",
"to": "+1234567890",
"device_id": "dev_xyz789",
"delivered_at": "2024-01-15T10:30:05Z"
},
"timestamp": "2024-01-15T10:30:05Z"
} Event types
| Event | Description |
|---|---|
message.queued | Message added to queue |
message.sent | Message sent by device |
message.delivered | Delivery confirmed |
message.failed | Message failed |
message.received | Incoming SMS received |
Verifying webhooks
Webhooks include a signature header:
X-Ender-Signature: sha256=abc123... Verify it using your webhook secret:
import hmac
import hashlib
def verify_signature(payload, signature, secret):
expected = hmac.new(
secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature) Retry policy
Failed webhooks are retried:
- 3 retries with exponential backoff
- Delays: 1min, 5min, 30min
- Webhook marked failed after all retries
Related
- Send SMS - Include webhook URL
- Message Status - Poll for status