Webhooks

Webhooks overview

Signed HTTP callbacks the moment something happens, instead of polling the API

Webhooks push events to your own endpoint as they happen. A new lead, a booking, a visitor asking for a human: anything you would otherwise poll the API for arrives within a second or so.

Set one up

Add an endpoint

Go to Settings, Developer (owners only) and add an endpoint. The URL must be https in production and must not resolve to a private or link-local address; we check on every delivery, not just when you save.

Choose events and scope

Subscribe only to the events you handle; unsubscribed events are never sent. An endpoint is either workspace-wide or scoped to a single agent.

Keep the signing secret

You get back a signing secret, which is how you prove a delivery came from us. See Verifying signatures.

The envelope

Every delivery is a JSON POST with the same outer shape. Only data varies by event.

{
  "id": "3f1c…",
  "event_id": "b47e…",
  "event": "lead.created",
  "api_version": "2026-04-27",
  "created_at": "2026-08-26T10:00:00.000Z",
  "workspace_id": 42,
  "chatbot_id": 17,
  "data": {}
}
FieldMeaning
idThis delivery attempt. Stable across retries of the same attempt.
event_idThe logical event. Dedupe on this. Shared across endpoints, different across resends.
eventThe event name, e.g. lead.created.
api_versionPayload contract version. Currently 2026-04-27.
chatbot_idPresent when the event belongs to one agent.
dataThe event-specific body.

Headers

HeaderPurpose
X-HeySupport-SignatureHMAC-SHA256 of the raw body, as sha256=<hex>.
X-HeySupport-Delivery-IdMatches id. Unique per delivery attempt.
X-HeySupport-Event-IdMatches event_id. Use it to dedupe.
X-HeySupport-EventThe event name, so you can route without parsing.

Events

Delivery is at-least-once. The same event can arrive more than once, so make your handler idempotent on event_id. See Delivery and retries.

Next steps