Skip to main content
Custom tools let your agent reach into your own backend during a live call. The caller says something — “What’s the status of my order?” or “Book me for Thursday at 2 PM” — the agent decides which tool to call, builds the arguments from the conversation, sends a POST to your HTTPS endpoint, and speaks the result back to the caller within seconds. No human intervention, no call transfers required. Typical uses include customer lookups, appointment booking, CRM updates, inventory checks, and knowledge base queries.

How a tool call works

By default the caller waits in real time throughout this flow, so keep your handler fast. For slow tools, see While the tool runs.

Add a tool in the Agent Editor

In the dashboard, open your agent and navigate to Tools → Add Tool. Fill in the following fields:
  • Tool name — a snake_case identifier the AI uses internally (e.g. lookup_customer, book_appointment). Keep it short and descriptive.
  • Description — plain-English instructions that tell the AI when to call this tool. Be explicit. Start with “Call this tool when…” and list trigger phrases. The description is how the AI decides whether to invoke the tool.
  • HTTP method — use POST for writes and lookups that need call context; use GET for simple lookups.
  • Endpoint URL — your endpoint’s full URL, https:// (recommended) or http://.
  • Headers — add auth headers here (e.g. Authorization: Bearer your-secret). They are sent verbatim on every request.
  • Argument schema — define the arguments the AI should extract from the conversation (see below).
  • While this tool runs / When the result arrives — whether the agent waits for your endpoint or keeps talking, and when it gives the result (see While the tool runs).
  • Timeout (seconds) — how long Verbeo waits for your endpoint (5–300 s, default 30 s).
The description is the single most important field. A vague description like “Look up customer info” leads to the AI calling the tool at the wrong time or not at all. A precise description like “Call this tool at the start of every call to look up the customer by their phone number” gives the AI a clear trigger.

While the tool runs

Two settings on each custom tool control how the conversation continues while your endpoint works. They apply to agents on Gemini 3.8 Live. While this tool runs When the result arrives (only with Keep talking)
  • Gemini 3.1 ignores these settings. They are kept on the tool and apply once the agent runs on Gemini 3.8 Live.
  • Built-in tools (end call, transfer, SMS, voicemail, calendar, knowledge base) are managed by Verbeo and have no such settings.
With Keep talking, when the caller speaks again while your endpoint is still working and the same tool is then called with different details, only the newest result is given. That covers a correction (“no, order 222”) but also an addition (“and order 222 too”): the earlier result stays in the conversation, and the agent gives it if the caller asks. Both requests reach your endpoint and both are completed, so keep it idempotent (see Security recommendations).
With Don’t say it, the agent has already confirmed the request, so a failure (a non-2xx response or a timeout) is never announced: it is added to the conversation silently, like a success. Use it only where a silent failure is acceptable, and check your endpoint’s own logs.
A request with Keep talking that is still running when the call ends is allowed to finish (up to its timeout, at most 30 seconds after the call). The call’s call_analyzed webhook may be sent before it finishes; such a tool then appears in tools[] without a result.

Argument schema

The argument schema tells the AI what data to extract from the conversation and pass to your endpoint. Each argument has: Writing good argument descriptions:
Avoid one-word descriptions like “date” — the AI will guess, and often guess wrong.

Implement your endpoint

Your handler receives a POST with the tool_invoked event envelope. Parse payload.args for the extracted arguments and payload.call for call metadata including the live transcript. Here is a minimal Node.js/Express example that handles an appointment booking tool:

Response format

Return JSON within the tool’s timeout. Your response shapes what the agent says next. Examples:
Always return valid JSON, even on failure. An empty body or non-JSON response is treated as an error — the agent apologizes and the call continues without the tool result.

The tool_invoked webhook payload

This is the full payload your endpoint receives on every tool invocation:
payload.args contains exactly the arguments you defined in the schema. payload.call gives you the current call state including the live transcript and any dynamic variables you passed at call creation.

Timeout and error handling

If your real operation takes more than a few seconds:
  • On Gemini 3.8 Live, set the tool to Keep talking (see While the tool runs): the caller can keep talking to the agent while your endpoint works, and the agent gives the result when it arrives. The agent does not fill the silence on its own if the caller says nothing.
  • On Gemini 3.1 (where the setting is ignored), return an immediate holding message and handle the result asynchronously:
Then use a follow-up action (SMS, callback, or the next conversational turn) to close the loop.

Security recommendations

  • Add an auth header — configure a shared secret in the tool’s Headers field (e.g. Authorization: Bearer your-secret). Verbeo sends it verbatim on every request. Reject any request missing it.
  • Use HTTPS — every request carries the tool’s headers, your keys included. An http:// endpoint is accepted, but it sends them unencrypted.
  • Be idempotent — network conditions can duplicate requests. Deduplicate by call_id + tool_name + args. If you have already processed an identical invocation, return the same response.
  • Handle PII carefully — payload.call.transcript may contain names, phone numbers, and other personal data. Only log or forward it to systems that meet your privacy requirements.

Tool invocations in post-call data

Every tool call during a call appears in the call_analyzed webhook event — in payload.data.tools[] with the full args, result, and timestamp, and inline in payload.data.transcript[] with role: "tool". This gives you a complete audit trail of what the agent did on every call.