Skip to main content
Workspace webhooks send an HTTPS POST to your server when something happens in the workspace, such as a call ending. Add endpoints in Workspace settings → Webhooks. Owners and members can add, edit, rotate and delete them; owners, members and viewers can read the delivery log.

Conversation initiation

The same page has a separate Conversation initiation client data webhook card. It sets the default endpoint agents can use to look up caller context before a phone conversation starts. Each agent must turn it on in Settings → Security, where it can also override the endpoint. Initiation waits for a JSON response; it does not use the event delivery queue or the event signing secret. See Personalization for the request, response, headers, override permissions and failure behavior.

Event endpoints

Each endpoint has:
  • URL: a public HTTPS address on port 443. Private and local addresses are refused, and the address is checked again before every delivery.
  • Events: the event types it receives. Leave every box empty to receive all events, including types added later.
  • Enabled: a disabled endpoint receives nothing. Deliveries queued for it while it is disabled fail and can be resent later.
  • Signing secret: a whsec_ secret shown once, when the endpoint is created or the secret is rotated.
A workspace can have 10 endpoints.

Events

Every request body is one event:
version changes only for a breaking change to the envelope or an event’s data. New fields can appear in data at any time, so ignore fields you do not know.

call.ended

Sent once per call, after the call is closed and, for outbound calls, after its outcome is read from the transcript. A call that closes without the agent reporting it, for example one that dropped, is sent within about ten minutes. It reaches only endpoints that were enabled and subscribed to the event when the call ended: turning an endpoint back on, or adding an event to its filter, never replays calls from before the change.

call.transferred

Sent once when a teammate joins a call and the agent stops talking.

conversation.analyzed

Sent after extraction, sentiment, topics and search indexing finish for a conversation. The result and event are committed together. A worker retry cannot queue the same event twice; a manual rerun creates a new analysis ID. Only enabled endpoints subscribed at completion receive the event.
source is CONVERSATION_LOG or CHANNEL_CONVERSATION. conversationId is Centillion’s stored conversation ID, not the external chat session ID. Read values, rationales and trajectory from GET /api/v2/agents/{agentId}/analysis/{conversationId}?source={source} with a workspace API key. This event contains a summary, not the transcript or all extracted values.

conversation.evaluated

Sent after one criterion finishes. Data includes agentId, conversationId, source, evaluationId, criterionId, criterionName and rationale. Binary criteria include result (success, failure or unknown). Numeric criteria include score, which is null when the evidence is insufficient. An empty transcript returns result: "unknown". Each evaluation ID is emitted once; a manual rerun creates a new ID. The analysis endpoint returns the scoring configuration and latest result for every criterion.

Headers and signatures

Requests follow the Standard Webhooks specification, so any of its open-source verification libraries works. The HMAC key is the part of the secret after whsec_, base64-decoded. Verify the raw body exactly as received, before parsing it, and reject timestamps more than five minutes from your clock.

Rotating the secret

Rotate secret issues a new secret at once. For the next 24 hours every request is signed with both the new and the previous secret, so a receiver that holds either one keeps accepting deliveries while you update it. After 24 hours only the new secret signs. Rotating again within those 24 hours replaces the previous secret with the one you are rotating away from, so the oldest secret stops signing at once.

Retries and the delivery log

Answer with any 2xx status within 8 seconds. A timeout, a network error, 408, 425, 429 or any 5xx is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours, 14 hours, 20 hours and 20 hours: ten attempts over about three days. A Retry-After header on a retried status is honoured, up to 6 hours. Any other status, such as 400 or 410, is not retried. The log under the endpoints lists the last 30 days of deliveries for the selected endpoint: event, status, attempts and the status code your server returned. Resend sends a delivered or failed event again with the same webhook-id and body. If that attempt fails with a retried status, the event keeps retrying on the schedule above until the delivery has used its ten attempts; a delivery that already used them gets exactly one more.
Last modified on November 2, 2026