POST request to a server URL you configure. Your server performs the action — querying a database, booking an appointment, looking up a record — and returns a result that the LLM uses to continue the conversation.
Request reference
When the LLM triggers a tool, the platform sends aPOST request to the configured serverUrl.
Request body fields
Requests are delivered asHTTP POST with Content-Type: application/json. Any headers you configured are included on every request.
| Field | Type | Description |
|---|---|---|
type | string | Always "tool_webhook" |
name | string | The name of the tool being called |
callId | string | UUID identifying the current call |
transport | object | Information about how the call was connected |
parameters | object | The arguments the LLM passed to the tool, matching your schema |
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, or "anonymous" if the caller withheld their number |
SIP transport example
SIP transport example
SIP transport — anonymous caller
SIP transport — anonymous caller
WebSocket transport example
WebSocket transport example
Full request example
Response
Return the tool result as a plain-text or JSON string in the HTTP response body. The LLM receives this string as the tool result and uses it to continue the conversation. If your server returns an error status code, the LLM receives a generic error string instead of the response body.Configuration
Each tool webhook has the following fields:| Field | Required | Description |
|---|---|---|
name | Yes | The tool name the LLM sees |
serverUrl | Yes | The URL to POST to when the tool is called |
schema | Yes | The tool specification in OpenAI function format |
headers | No | Static HTTP headers added to every outgoing request |
Schema format
Theschema field follows the OpenAI function specification format. It defines the tool name, description, and the parameters the LLM can pass.
string, integer, number, boolean, object, array.
What’s configurable
| Part of the request | Configurable | Notes |
|---|---|---|
| URL | Yes | Fixed at configuration time |
| HTTP headers | Yes | Static key/value pairs, fixed at configuration time |
| Body | Partially | Structure is fixed (type, name, callId, transport, parameters); the content of parameters is indirectly configurable via the schema |
Setting up
Tool Webhooks are configured per Assistant or Agent as LLM Extensions.Dashboard
- Open the Assistant or Agent you want to configure.
- Navigate to the LLM Extensions (LLM Erweiterungen) section.
- Click Add (Hinzufügen) and select the extension type tool_webhook.
- Enter the tool name, server URL, schema (OpenAI function format), and any HTTP headers.
- Save. The tool webhook is now active for all future calls on that Assistant or Agent.
REST API
Tool webhooks are managed through the Assistant and Agent endpoints using theextensions array. The examples below use the Assistant path — the Agent path follows the exact same structure.
Read extensions — GET /{assistantId}
Read extensions — GET /{assistantId}
Retrieve the full Assistant configuration including its extensions.The Each extension object:
extensions array in the response:| Field | Type | Description |
|---|---|---|
id | string | UUID of the extension instance |
type | string | "tool_webhook" |
parameters.name | string | The tool name the LLM sees |
parameters.serverUrl | string | The target URL for outgoing requests |
parameters.schema | string | The tool specification as a JSON string |
parameters.headers | object | Static HTTP headers as key/value pairs |
Create with extensions — POST /assistants
Create with extensions — POST /assistants
Include Returns the full Assistant object including the assigned extension
extensions in the request body when creating an Assistant. Omit the id — it is assigned by the platform.id values.Update extensions — PUT /{assistantId}
Update extensions — PUT /{assistantId}
The
In this example:
PUT endpoint replaces the entire extensions array. The behaviour depends on whether id is included for each extension:| Scenario | What to do |
|---|---|
| Update an existing extension’s fields | Include the extension’s id with the updated values |
| Add a new extension | Omit the id field |
| Remove an extension | Leave it out of the array |
- The
book_appointmentwebhook with the givenidis updated with the new URL and token. - The
check_availabilityentry has noid, so a new extension is created. - Any previously existing extensions 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 extensions are identical.