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