Webhooks
Let us call you instead of polling every minute.
Instead of polling, let us call you. Add a receiver under Settings → API or with POST /v1/webhooks, and pick the events you want. Try it with POST /v1/webhooks/:id/test before waiting for a real call.
Delivery
Deliveries are queued and retried with a growing pause. The same event is never sent twice — not even when the telephony provider reports a call as ended more than once.
If a delivery was given up while your server was down, find it in GET /v1/webhooks/:id/deliveries and send it again with POST /v1/webhooks/:id/redeliver — with the same id, so your own deduplication recognises it.
The envelope
Every delivery has the same outer shape. id is the delivery id and stays the same on a retry and a redelivery — use it to reject duplicates. created is seconds since 1970, set when the event happened, not when it was sent. The content is in data and depends on the event.
{
"id": "7d2c4f1a-…",
"event": "booking.created",
"created": 1758096131,
"data": { }
}The events
Every event a receiver can subscribe to. New fields may be added; existing ones are not renamed.
| Calls | Bookings | Contacts | Other |
|---|---|---|---|
call.completed | booking.created | contact.created | task.created |
call.missed | booking.rescheduled | contact.updated | sms.received |
booking.cancelled | contact.deleted | sms.failed | |
booking.completed | contact.recall_due | sms.opted_out | |
booking.no_show | |||
booking.reminder_due |
The full description of each event — and what data holds — is under the webhook endpoints in the reference.
