- A custom tool is an HTTP endpoint of yours. When the assistant decides to use it, Verbeo calls your
endpoint_urlwith the arguments the model filled in, and the assistant uses your answer in the conversation. Tool call webhooks describes exactly what your endpoint receives. - A native tool is one Verbeo runs itself:
end_callhangs up,transfer_callhands the call to a person,send_smstexts the caller.
agent_id. Listing tools always names the assistant.
Endpoints
Each kind is added and changed through its own routes, and each takes only its own fields: anything else in the body is ignored. A tool cannot change its kind or move to another assistant.
Listing is a
POST because a list query is a document: page, size and a search term, typed as themselves rather than coerced from a query string. It reads, and changes nothing.Tools and the assistant
An assistant uses a tool only while the tool’s id is in itsconfig.toolIds. These endpoints keep that list in step for you:
- Adding a tool appends its id to the assistant’s
toolIds. - Adding a native tool also switches it on in the assistant’s
config.nativeTools, and every later change to it is copied there. - Deleting a tool takes its id out of
toolIds, and switches a native tool off innativeTools.
nativeTools and the native endpoints here are two ways to change the same tool. The assistant names the settings in camelCase (staticDestination, smsContentType); these endpoints use the tool’s own field names (transfer_call_destination, sms_content_type). A send_sms tool’s Twilio credentials, and the timeout_seconds of a custom or send_sms tool, can only be set here; end_call and transfer_call always wait 30 seconds.
Secrets are never returned
No response carries a secret, whoever asks:- Every value in a custom tool’s
headerscomes back as"********". The header names are kept, so you can see which headers a tool sends. - A
send_smstool’stwilio_account_sidcomes back as"********"when one is saved, andnullwhen none is. - The Twilio auth token,
twilio_auth_token, is never returned at all.
"********" back keeps what is saved. You can read a tool, change what you need, and send it back whole without knowing its secrets:
The placeholder stands only for a value already saved under the same name. A create has nothing saved, so
"********" there is refused with 422 VALIDATION_FAILED:
"********" as its value is refused the same way on an update:
The tool object
A custom tool:send_sms tool with its own Twilio account:
null: a tool that is not a transfer reads transfer_call_mode as "static" or null, for example. Ignore them.
string
required
UUID of the tool.
string
required
UUID of the assistant the tool belongs to.
string
required
The name the model calls the tool by: yours for a custom tool,
end_call, send_sms or transfer_call for a native one. Unique within the assistant.string | null
required
What the model is told about the tool. Say when to use it.
boolean | null
required
true for a native tool. A custom tool reads false, or null if it was created long ago.string
required
A custom tool’s endpoint. A native tool reads
native:// and its name.string
required
GET or POST. A native tool reads POST.object | null
required
The headers sent with every request to a custom tool, each value
"********". A native tool reads {}.object | null
required
The JSON Schema of the arguments the model fills in.
null or {}: the tool takes no arguments. A native tool’s is set by Verbeo from its settings.number | null
required
How long Verbeo waits for the tool, 5–300 seconds.
30 unless you set it.string | null
required
Custom tools:
blocking (the assistant waits for the result) or non_blocking (the assistant keeps talking). null means blocking.string | null
required
Custom tools with
tool_behavior: "non_blocking": when_idle (said once the assistant has finished talking) or silent (never said). null means when_idle.string | null
required
send_sms: prompt (the assistant writes the message) or static (always sms_static_message).string | null
required
send_sms: the text a static SMS sends.string | null
required
send_sms: "********" when the tool has its own Twilio account saved, null when it does not.string | null
required
send_sms: the sender the SMS goes out from. null: Verbeo picks the sender, normally the number the call is on.string | null
required
transfer_call: static (always dials transfer_call_destination) or dynamic (the assistant chooses the number).string | null
required
transfer_call: the number a static transfer dials.string | null
required
transfer_call: cold or warm.string
required
ISO 8601 timestamp with microseconds and a UTC offset, e.g.
2026-01-15T10:30:00.123456+00:00.string
required
The last change, in the same format.
tool_behavior and result_scheduling take effect on assistants that run Gemini 3.8 Live; other models ignore them. Connect your backend with custom tools explains what the caller hears with each.
Who may do what
An API key acts as the owner of its workspace, so it may read, add, change and delete the tools of every assistant in that workspace. An assistant or a tool in another workspace answers404 NOT_FOUND, exactly like one that does not exist.
Authentication
Every endpoint takes a private workspace API key (vbr_…) as a Bearer token. Public widget keys (vbr_pub_…) are rejected with 403 FORBIDDEN: they ship inside web pages, where anyone can read them. See Authentication.