Skip to main content

How tools work

When a caller says something that matches a tool’s trigger (defined in its description field), the agent fires that tool automatically mid-conversation. The key thing to understand: tools are attached to LLM models, not to agents directly.
One LLM model can have multiple tools. Every agent that uses that model inherits all its tools automatically. To give an agent a new tool, update the LLM model it is linked to — not the agent itself. If you haven’t built an agent yet, start with the Quickstart first.

Tool types

Whenever a tool talks to a third-party provider — send_sms, send_email, or schedule_calendar_event — you’ll need a credential_id pointing at an integration for that provider. api_call, transfer_call, extract_information, and end_call don’t need one.

Step 1 — Create a tool

api_call

OneInbox supports fully custom tools — define any action your agent should take by pointing it at an HTTP endpoint you control. The api_call tool type lets your agent call your own API mid-conversation to look up data, push to a CRM, trigger business logic, or take any other action your backend supports. There is no limit to what you can do: the agent extracts the right parameters from the conversation, calls your endpoint, and can use the response to decide what to say next.

Nested parameters (full JSON Schema)

parameters only supports a flat list of fields. If your endpoint needs nested objects, arrays, or enums, use parameters_schema instead — a raw JSON Schema object, validated server-side before save. Use one or the other, not both:

send_sms

Sends a text message when triggered. No credential_id needed — the SMS is sent from the same number used to make the call (your purchased OneInbox number or your Twilio/Telnyx number registered with OneInbox).
The SMS sends from the same number used for the call — make sure that number has SMS capability enabled. When purchasing a number via OneInbox or registering your own Twilio/Telnyx number, verify that it supports SMS before using this tool.
{{caller}} is a built-in variable that auto-resolves to the caller’s phone number at call time — the system fills it in automatically. Never ask the caller for their number just to include it in the message body.

send_email

Sends an email when triggered. Use this to deliver lead summaries to your sales team, send follow-up emails to callers, or notify someone when a key moment happens in a call.
Want every call to auto-send a summary SMS/email without a tool call? Set post_call_sms / post_call_email directly on the agent instead — see Agents. Tools fire mid-call based on a trigger; post-call config fires once, automatically, after every call ends.
{{email}} resolves from the dynamic_variables object passed when the call is initiated — for example "dynamic_variables": {"email": "caller@example.com"} in the outbound call request. Pass the caller’s email at dial time and use {{email}} anywhere in to, subject_template, or body_template to insert it automatically.

schedule_calendar_event

Books a calendar event when triggered. Use this when you want the agent to schedule a demo or follow-up meeting directly during the call.
The agent must collect the attendee’s name and email during the call — both are required by Cal.com to complete the booking. If the requested slot has no availability (e.g. outside your Cal.com working hours), the booking fails with HTTP 400.

transfer_call

Transfers the caller to a real phone number. Use this when the caller asks to speak with a human or needs to reach a specific team. OneInbox supports two transfer modes — cold (default) and warm.

Cold transfer

The default. The caller is transferred instantly — no briefing, no hold music. Use this when speed matters more than context handoff (e.g. routing to a general support queue).
Omitting transfer_config entirely is equivalent to transfer_config.mode: "cold".

Warm transfer

The agent calls the human first, gives them a briefing (caller’s name, reason for calling, any relevant context), then bridges the caller in once the human is ready. The caller hears hold music during the consult. Use this when the human needs context before picking up — e.g. transferring to a sales manager for a high-value lead.

extract_information

Silently captures structured data from the conversation as it happens — the agent doesn’t announce it to the caller. Use this to save lead qualification data, capture names and emails, or record key facts from the call.
The captured data is available in the call record after the call ends.

end_call

Hangs up the call cleanly. Use this at the end of a flow — after a booking, after the caller says goodbye, or when the agent has completed its task. Without this tool, the call continues until the silence timeout is reached.

Step 2 — Attach tools to your LLM model

Creating a tool makes it available in your account, but the agent can’t use it yet. You need to attach it to the LLM model linked to your agent. Use the llm_id from your agent’s create response — this is the AI brain that decides what to do during a call.
Every agent linked to this llm_id picks up the change immediately — no restart required.

Detach tools from a model

To remove tools from an LLM model without replacing the entire list, use remove_tool_ids:
You can add and remove tools in the same request — tool_ids adds, remove_tool_ids detaches.

Step 3 — Reference tools in your system prompt

The description on each tool is the trigger signal — the LLM reads it to decide when to fire the tool automatically. The system prompt gives the agent context and ordering for how to use tools in the flow. Reference tools by their name field (the name you set when creating the tool), not by tool ID. The LLM matches the name to the tool it has available and fires it at the right moment.
Write the description as a trigger condition (“Fire when the caller says X” or “Run once the caller has answered the qualifying questions”). The system prompt then reinforces the order and flow. Both are read by the LLM — the description drives when, the system prompt drives how.

Reading tool results after a call

After the call ends, the extracted data and tool activity appear in the call record. Stop the call first, wait a few seconds, then fetch:
messages and analysis are only available after the call ends — both are empty while the call is active.

Manage tools

List all tools

Retrieve every tool in your account. Useful for finding tool IDs when you need to attach or update them.

Update a tool

Change a tool’s name, description, or config. For example, update the trigger description to make the agent more (or less) sensitive to firing it.

Delete a tool

Remove a tool permanently. If the tool is attached to an LLM model, detach it first using remove_tool_ids (see Step 2 above), then delete it.

API reference

Create tool · List tools · Update tool · Delete tool