POST request with a JSON payload to every URL registered on that Assistant or Agent. Use them to trigger workflows, sync conversation data, send transcripts to your CRM, or any other external integration.
Hook types
| Type | Fires when |
|---|---|
call_started | The call is connected and audio has begun |
call_concluded | The call has ended — includes the full conversation transcript, summaries, and call recording |
Delivery
Request format
Webhooks are delivered asHTTP POST requests with Content-Type: application/json. Fields whose value is null are omitted from the payload.
Retry behaviour
The platform guarantees at-least-once delivery. If your endpoint returns an HTTP error status or does not respond within 30 seconds, the delivery is retried automatically.| Attempt | Backoff before next retry |
|---|---|
| 1 | 1 minute |
| 2 | 2 minutes |
| 3 | 4 minutes |
| 4 | 8 minutes |
| 5 | 16 minutes |
| … | Doubles each time, capped at 24 hours |
| 20 | Final attempt — permanently marked FAILED |
Delivery states
| Status | Meaning |
|---|---|
PENDING | Awaiting delivery or scheduled for a retry |
SUCCEEDED | Delivered successfully (2xx response received) |
FAILED | All 20 attempts exhausted without success |
Idempotency
Because deliveries are retried, your endpoint may receive the same event more than once. Use the
callId field as an idempotency key on your side.Payload reference
Shared fields
Every event payload contains these top-level fields.| Field | Type | Description |
|---|---|---|
type | string | The event type: call_started or call_concluded |
callId | string | UUID that uniquely identifies this call |
transport | object | null | Information about how the call was connected |
Transport object
| Field | Type | Present when |
|---|---|---|
type | string | Always — "sip" or "websocket" |
calledNumber | string | SIP only — the number that was dialled |
callingNumber | string | SIP only — the caller’s number |
SIP transport example
SIP transport example
WebSocket transport example
WebSocket transport example
call_started
Fired immediately when the call is connected.
Fields
| Field | Type | Description |
|---|---|---|
type | string | "call_started" |
callId | string | UUID of the call |
startedAt | number | null | Call start time — Unix timestamp in milliseconds |
transport | object | null | Transport info |
call_concluded
Fired after the call ends. Contains the complete conversation history, LLM-generated summaries, and an optional call recording.
Fields
| Field | Type | Description |
|---|---|---|
type | string | "call_concluded" |
callId | string | UUID of the call |
startedAt | number | null | Call start time — Unix timestamp in milliseconds |
endedAt | number | null | Call end time — Unix timestamp in milliseconds |
shortSummary | string | null | Short LLM-generated summary of the call |
summary | string | null | Full LLM-generated summary of the call |
callRecording | string | null | Base64-encoded audio recording of the entire call |
transport | object | null | Transport info |
messages | array | Ordered conversation history |
Messages
Themessages array contains every turn of the conversation in chronological order. Each element has a type discriminator field.
Shared message fields
| Field | Type | Description |
|---|---|---|
type | string | Message type: text, audio, tool_call, or tool_result |
role | string | Who produced this message |
timestamp | number | Unix timestamp in milliseconds |
| Role | Description |
|---|---|
USER | Speech input from the human caller |
ASSISTANT | Response generated by the AI assistant |
SYSTEM | An internal system-level message |
TOOL_CALL | A tool invocation initiated by the LLM |
TOOL_CALL_RESULT | The result returned by a tool |
UNKNOWN | Role could not be determined |
text
text
Represents a spoken utterance transcribed to text — from the caller (
USER) or the assistant (ASSISTANT).| Field | Type | Description |
|---|---|---|
type | string | "text" |
role | string | USER, ASSISTANT, SYSTEM, or UNKNOWN |
timestamp | number | Unix timestamp in milliseconds |
text | string | Transcribed or generated text content |
audio
audio
Represents a message that exists only as raw audio with no transcription available.
| Field | Type | Description |
|---|---|---|
type | string | "audio" |
role | string | USER, ASSISTANT, SYSTEM, or UNKNOWN |
timestamp | number | Unix timestamp in milliseconds |
audio | string | Base64-encoded raw audio data |
tool_call
tool_call
Recorded when the LLM decides to invoke a tool during the conversation.
| Field | Type | Description |
|---|---|---|
type | string | "tool_call" |
role | string | Always "TOOL_CALL" |
timestamp | number | Unix timestamp in milliseconds |
callId | string | Correlates this call with its result |
toolName | string | The name of the tool that was invoked |
parameters | object | The arguments passed to the tool by the LLM |
tool_result
tool_result
Recorded when a tool returns its result back to the LLM.
| Field | Type | Description |
|---|---|---|
type | string | "tool_result" |
role | string | Always "TOOL_CALL_RESULT" |
timestamp | number | Unix timestamp in milliseconds |
callId | string | Matches the callId of the originating tool call |
toolName | string | The name of the tool that produced the result |
text | string | The tool’s return value as a plain string |
Configuration
Call Event Hooks are configured per Assistant or Agent — they are not a standalone resource.Dashboard
- Open the Assistant or Agent you want to configure.
- Navigate to the Event Hooks section.
- Click Add Hook (Hinzufügen), select the hook type, and enter your target URL.
- Save. The hook is now active for all future calls on that Assistant or Agent.
REST API
Hooks are managed through the Assistant and Agent endpoints. The examples below use the Assistant path — the Agent path follows the exact same structure.Read hooks — GET /{assistantId}
Read hooks — GET /{assistantId}
Retrieve the full Assistant configuration including its hooks.The Each hook object:
callEventHooks array in the response:| Field | Type | Description |
|---|---|---|
id | string | UUID of the hook instance |
type | string | "call_started" or "call_concluded" |
parameters.url | string | The target URL for this hook |
Create hooks — POST /assistants
Create hooks — POST /assistants
Include Returns the full Assistant object including the assigned hook
callEventHooks in the request body when creating an Assistant. Omit the id — it is assigned by the platform.id values.Update hooks — PUT /{assistantId}
Update hooks — PUT /{assistantId}
The
In this example:
PUT endpoint replaces the entire callEventHooks array. The behaviour depends on whether id is included for each hook:| Scenario | What to do |
|---|---|
| Update an existing hook’s URL | Include the hook’s id with the new url |
| Add a new hook | Omit the id field |
| Remove a hook | Leave it out of the array |
- The
call_startedhook with the givenidis updated with the new URL. - The
call_concludedentry has noid, so a new hook is created. - Any previously existing hooks not listed are removed.
200 OK with an empty success body.The same operations apply to Agents at
/api/v1/vendors/{vendorId}/organizations/{organizationId}/agents/{agentId}. The request and response shapes for callEventHooks are identical.