Skip to main content
The platform POSTs signed events to your endpoints. A workspace on the legacy path has one URL; on /api/v2 you manage several through /api/v2/webhooks/endpoints, each with its own secret and its own subscription list. Those operations are in the Runtime API reference.

What actually fires

Twenty-three event types are emitted by the platform today:
The catalogue is larger than that, and the difference still matters. GET /api/v2/webhooks/catalogue/ returns 32 event types. Nine are registered and never emitted: conversation.completed, the agent.run.* family, document.processing.started, knowledge.updated, call.started, call.failed and usage.threshold_reached.Two of those are easy to miscount. call.failed appears in the platform’s source only as an inbound name — one of the events the telephony provider sends us — and is never emitted outward. document.processing.started has no call site at all.Those seven are declarations of intent, not promises you can build on. Subscribing to one is accepted and you will simply never hear from it. Do not put a timeout around waiting for one.
Read the catalogue from code rather than hardcoding a list. It is the one source that moves when the platform does, and an event graduating from declared to emitted is not something you will be told about.

Verifying a delivery

X-Impel-Signature is canonical. X-Tegain-Signature is sent alongside it with an identical value, for receivers configured before the Impel Labs rename — a signature check that starts failing looks, from your side, exactly like a webhook that stopped arriving. Signed string is {timestamp}.{raw body}, HMAC-SHA256 with the endpoint secret.
The header can carry more than one v1. During a secret rotation we sign with both keys, so a parser that keeps only one value rejects every delivery for the length of the overlap window — which is precisely when you are least able to afford it. Accept if any v1 matches.
Verify against the raw bytes, not a re-serialised object. The platform signs exactly what it sends.
The v1 prefix versions the scheme, not the key. A future v2= can appear beside it, and a parser that ignores prefixes it does not know keeps working.

Delivery behaviour

Be idempotent on X-Impel-Event-Id. It is stable across our retries, so a receiver keyed on it is safe against both an honest retry and a captured replay — and we retry deliberately, so every correct receiver needs this anyway. X-Impel-Delivery-Id changes per attempt and is the right key only if you want to detect an exact replay. Deliveries are readable and replayable through the API — GET /api/v2/webhooks/deliveries, and replay by delivery or by event — as well as from the dashboard.
Webhooks require a plan that includes them; without it, events are silently not enqueued.