Skip to main content
A tool is something your agent can do during a call besides talking: look up an order, book in your own system, open a page in your app. The agent decides when to use one from its description, fills in the parameters from the conversation, and tells the caller what came back. Connected apps (HubSpot, Stripe and the rest) are tools too: see MCP integrations. The built-ins (ending the call, transfers, booking appointments) are always there when switched on, and an agent whose knowledge base has files gets search_knowledge to look things up in them. The console does all of this under Tools, and on each agent’s page under Tools.

Create a webhook tool

Write the description for the agent: what the tool does and when to use it. Describe every parameter too; the agent reads those to know what to fill in. Then give it to an agent:

What your endpoint receives

  • The arguments as the JSON body, or as query parameters for GET and DELETE. Nothing else is wrapped around them, so an existing API or a Zapier, Make or n8n catch hook works as it is.
  • Headers saying what it is about:
Answer with JSON or text, within the timeout (10 seconds by default, up to 30). The caller hears silence while the agent waits, so keep it quick. The first 4,000 characters go back to the agent. An error status or a timeout is turned into a sentence the agent can say, such as “I could not check that right now”.

Verify the signature

Requests are only signed once you have a signing secret: create one with POST /v1/webhook/rotate-secret or on the console’s webhook settings.

Test it

The request is exactly what a call sends, signature included. The answer shows the status, the time it took, and what the agent would hear.

Client tools

A client tool runs in the caller’s app. During a realtime session the server sends tool.call with the arguments; your code does the thing and answers with tool.result. Phone calls have no app, so client tools are never offered on them.
wait_for_result: false tells the agent “done” at once, which suits actions like opening a page. Leave it true (the default) when the agent needs what your app returns.

In your app (browser SDK)

Whatever a handler returns goes back to the agent (text, or anything JSON-serialisable). Throw to tell it the action failed. A tool with no handler is answered with an error, and the agent carries on without it.

On your website (your agent’s mascot)

The website widget is your agent’s mascot. data-mascot is the mascot’s public_id, from the agent’s mascot field once sharing is on (see Mascots).
With WixzelMascot.mount(element, { mascot, tools }) you can pass the handlers to one agent’s mascot instead.

Limits

  • Up to 20 of your own tools per agent, and 40 tools in all with connected apps.
  • Up to 20 tool calls in one call.
  • Tool names: letters, digits and underscores, starting with a letter, unique in the account.
  • Up to 30 parameters, three levels deep.
  • Header values are encrypted and never returned; only their names are.
  • Webhook URLs must be public https or http on port 443 or 80.

On the call record

Every tool call is on the call: GET /v1/calls/{id} lists tool_calls with the tool, its kind (webhook, client, integration or knowledge), the arguments with long values cut, whether it worked and how long it took. The console shows them on the call’s timeline.