@omnidim-ai/mcp-server
Provides the ability to import phone numbers from Twilio for use in the OmniDimension platform.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@omnidim-ai/mcp-servercreate a new voice agent named SupportBot"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@omnidim-ai/mcp-server
Local stdio Model Context Protocol server for OmniDimension. Drive voice agents, dispatch calls, and manage knowledge bases from Claude, Cursor, Windsurf, or any MCP-compatible client.
Looking for the hosted OAuth variant? Use https://mcp.omnidim.io/mcp instead. The hosted server is the recommended path for Claude Desktop, Claude.ai, and any client that supports HTTP MCP.
Quick start
npx -y @omnidim-ai/mcp-server setupReuses a saved API key from ~/.config/omnidim/credentials if one exists, otherwise prompts for a new one and validates it. Then installs the server in any detected MCP client (Claude Code, Claude Desktop, Cursor, Windsurf). Get an API key at omnidim.io/api-management.
Related MCP server: mcp-model-proxy
Manual install
Claude Code
claude mcp add omnidim -- npx -y @omnidim-ai/mcp-serverClaude Desktop, Cursor, Windsurf
Add this block to your MCP client config:
{
"mcpServers": {
"omnidim": {
"command": "npx",
"args": ["-y", "@omnidim-ai/mcp-server"],
"env": {
"OMNIDIM_API_KEY": "your_api_key_here"
}
}
}
}Get your API key from omnidim.io/api-management.
Config file locations:
Client | Path |
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Cursor |
|
Windsurf |
|
Tools
Surface | Tools |
Agents | create, update, list, get, delete |
Calls | dispatch, list logs, get log |
Bulk calls | create, fetch, get, actions, cancel, live status |
Knowledge base | list, upload, attach, detach, delete |
Phone numbers | list, attach, detach, import (Twilio, Exotel, SIP) |
Providers | list LLMs, list voices, list STT, list TTS |
Reseller | child orgs, users, credits (reseller accounts only) |
Full API reference: docs.omnidim.io.
Local development
git clone https://github.com/Omnidim/omnidim-mcp-server
cd omnidim-mcp-server
npm install
npm run build
OMNIDIM_API_KEY=sk_... npm startInspect tools and call them interactively:
OMNIDIM_API_KEY=sk_... npx @modelcontextprotocol/inspector node build/index.jsTelemetry
Anonymous usage data is sent to help us improve the package: package version, Node version, OS family, install count, session boots, tool names, and setup or crash outcomes as short error categories (e.g. config_write_error, http_500). No API keys, no tool inputs/outputs, no error messages, no file paths, no personal info.
Disable with:
npx -y @omnidim-ai/mcp-server telemetry disableFull field-by-field breakdown and other opt-out options in TELEMETRY.md.
Troubleshooting
Run the diagnostics command to see versions, detected clients, backend reachability, and recent errors:
npx -y @omnidim-ai/mcp-server doctorIt never prints your API key. A local log of errors is kept at ~/.config/omnidim/logs/mcp.log (stays on your machine, never sent).
Reporting issues
See ISSUES.md for how to file bug reports, request features, or get help. Paste the doctor output into your report.
License
Available Tools
79 toolsactivateWorkflowADestructiveInspect
Turn the published workflow on, so real events run it. Use it to resume a workflow you paused with deactivateWorkflow.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, destructive state change, so the safety bar is covered. The description adds genuinely useful context beyond that: activation makes live/production events execute the workflow. It doesn't mention permissions, idempotency, or the effect on in-flight events.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, effect stated first and the sibling routing second. Nothing redundant; the parenthetical tag is the only filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-toggle with no output schema and full annotation coverage, the description covers purpose, effect, and the sibling pairing. Only the implicit publish prerequisite and error/return behavior are unstated, which is acceptable here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema already documents workflow_id fully. The description adds no format or constraint detail beyond what the schema supplies; baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (turn the published workflow on) plus the observable effect ('so real events run it'), and names the inverse sibling deactivateWorkflow. It does not, however, distinguish itself from publishWorkflow or testWorkflow, which an agent could plausibly confuse with activation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it ('resume a workflow you paused with deactivateWorkflow'), naming the counterpart tool. It stops short of when-not guidance — e.g., that the workflow must already be published, or that publishWorkflow is the tool for a draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addBulkCallContactADestructiveInspect
Push a single contact into a dynamic bulk-call campaign in real time. Dynamic campaigns are created from the dashboard (Bulk Call
Create New Campaign > Dynamic Campaign) and stay alive waiting for contacts, so this webhook is how you feed them from a CRM, form, or automation platform. The contact is queued immediately, and the campaign starts calling it as soon as it is within operating hours.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ID of the dynamic campaign to add the contact to. | |
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly=false, destructive=true), the description adds that the contact is 'queued immediately, and the campaign starts calling it as soon as it is within operating hours,' revealing real-time queueing and scheduling behavior. It also explains the lifecycle of dynamic campaigns, which is valuable context not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main action. The second sentence adds essential context about dynamic campaigns and the webhook use case, and the final sentence covers behavior. No filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with nested objects and no output schema, the description covers the workflow well: dynamic campaign creation, webhook feeding, queueing, and operating hours. It doesn't mention response format or error scenarios, but the annotations and schema provide sufficient context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the tool description adds no additional parameter-level meaning beyond what the schema already provides. Baseline 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: 'Push a single contact into a dynamic bulk-call campaign in real time.' It distinguishes this from siblings by explaining that dynamic campaigns are created from the dashboard and this webhook is how you feed them from a CRM, form, or automation platform, clearly separating it from bulk-call creation or management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear when-to-use context: dynamic campaigns stay alive waiting for contacts, so this is the webhook to feed them from external platforms. However, it does not explicitly name alternative tools or state when not to use it, stopping short of full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addBulkCallContactsADestructiveInspect
Add up to 1000 contacts to a campaign in one request.
This is the batch form of Add contact to dynamic campaign. Prefer it whenever you have more than a handful: one request of 500 contacts is far cheaper than 500 requests, on your side and ours.
Repeated numbers are kept, not merged. If the same number appears twice with different variables, it is called twice, because two rows for one number usually means two real reasons to call.
Rows that fail validation are reported in rejected and the rest are
still added, so a single bad number does not lose the batch. A row that
is missing a column the campaign's call_conditions need is reported in
rejected; the condition values themselves are not evaluated on this
route.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Id of the bulk call campaign. | |
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (destructiveHint=true, openWorldHint=true), and the description adds genuinely non-obvious behavior: duplicates are kept rather than merged and result in two calls, and per-row validation failures land in `rejected` while the rest of the batch still succeeds. The gap is timing: it never says whether added contacts are dialed immediately or queued until startBulkCall, which matters for a destructive bulk operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and limit, then layered by decision relevance (positioning, then data semantics, then failure semantics). Every sentence carries information, though the trailing '(Tags: Bulk calls)' is pure noise and the prose runs slightly long for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the right thing by naming the `rejected` field and explaining partial-success semantics. It also resolves the nested `custom_variables`/`metadata` distinction against the sibling tool. The one unresolved item is when the queued calls actually fire.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot: the limit of 1000, the divergence from createBulkCall's `contact_list` naming, and the crucial caveat that required columns depend on the campaign's `call_conditions` (which are not evaluated on this route). That last point changes how an agent must build the payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource and scope ('Add up to 1000 contacts to a campaign in one request'), and explicitly positions itself against two siblings: the singular 'Add contact to dynamic campaign' and the differently-shaped 'Create bulk call'. An agent can route between them without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule ('Prefer it whenever you have more than a handful') with the reason (one request of 500 is cheaper than 500 requests) and names the singular alternative for small batches. The when-to-use decision is fully resolved in the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addBulkCallNumberAInspect
Add one of your numbers to the campaign's rotation pool. Works while the campaign is running, which is how you bring in a fresh number when the pool is running out of healthy ones.
The number must belong to you and must not already be in the pool. A number with no agent attached gets this campaign's agent attached automatically; a number attached to a different agent is refused.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses meaningful side effects and validation behavior: automatic agent attachment for unassigned numbers, refusal for numbers attached to a different agent, and the not-already-in-pool requirement. This is exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action, followed by a pragmatic use context and necessary constraints in a compact, scannable structure. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description fully covers operation, when it is useful, prerequisites, side effects, and refusal behavior. The source of phone_number_id is already in the schema, so everything needed to call the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both bulk_call_id and phone_number_id are already documented. The description reinforces that phone_number_id must be one of the user's numbers but adds no new format or source details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Add one of your numbers to the campaign's rotation pool.' It clearly scopes the operation to your numbers and distinguishes it from contact-add or generic number-management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete use case—bringing in a fresh number while the campaign is running when the pool lacks healthy numbers—and states eligibility rules. It stops short of naming sibling alternatives or explicit when-not-to-use cases, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addPostCallActionAInspect
Add one post-call action to the agent. The agent's other actions are not changed. Send an Idempotency-Key header to make a retry safe: the same key and body return the action the first request added.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| requestBody | Yes | The JSON request body. | |
| Idempotency-Key | No | Any unique string. A retry with the same key and body adds nothing new. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false and destructive=false, so the safety profile is covered. The description adds real value beyond them: it discloses that existing actions are untouched by the add, and it explains the Idempotency-Key retry contract (same key and body returns the prior-added action, adding nothing new). It stops short of noting auth requirements or per-channel side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, then the non-destructive scope, then the retry detail. Nothing is wasted; the trailing '(Tags: Agents)' is the only extraneous token.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover the mutation safety profile and the schema fully documents every field, so an agent has what it needs to call this correctly. There is no output schema, and the description only gestures at the return value via the idempotency sentence; a note on prerequisites (existing agent) would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents agent_id, the request body, and the Idempotency-Key header in depth, so the baseline is 3. The description restates the idempotency semantics but adds no format, constraint, or channel-specific meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Add one post-call action to the agent' — and the qualifier 'one' clarifies it is a single-action operation, not a bulk one. It does not explicitly name the sibling updatePostCallAction or listPostCallActions, so sibling differentiation rests on the verb alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Add' versus the sibling 'update'/'delete' names make the intent inferable, but there is no statement of when to prefer this over updatePostCallAction, no prerequisite (the agent must exist), and no exclusions. The 'other actions are not changed' note hints at scope but is not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attachKnowledgeBaseFilesBInspect
Attach multiple knowledge-base files to an agent. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive mutation. However, the description adds no extra behavioral context: it doesn't disclose whether attaching files replaces existing attachments or appends to them, whether it requires the agent to exist, or what side effects occur. The description simply restates the core action without additional nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately conveys the purpose. The parenthetical tag 'Knowledge base' is slightly redundant but harmless. There is no waste or filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the schema provides parameter details, the description is incomplete for a mutation tool. It does not explain whether the operation is additive or replacing, what happens to existing file attachments, or what the response indicates. There is no output schema to fall back on. Given the complexity and lack of behavioral detail, the description leaves important gaps for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters, including descriptions for agent_id, file_ids, and when_to_use. The tool description adds no additional parameter meaning beyond the schema. According to the rubric, with high schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Attach multiple knowledge-base files to an agent.' It identifies the resource (knowledge-base files), the target (an agent), and the operation (attach). This distinguishes it from sibling tools like detachKnowledgeBaseFiles, uploadKnowledgeBaseFile, and listKnowledgeBaseFiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as uploadKnowledgeBaseFile for uploading new files or detachKnowledgeBaseFiles for removing attachments. It only includes a 'Knowledge base' tag, which hints at context but does not explicitly state prerequisites, exclusions, or alternative scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attachPhoneNumberCInspect
Attach a phone number to an existing agent. (Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only the word 'existing' as a prerequisite hint; it says nothing about whether the phone number must be unassigned, whether prior bindings are replaced, or what errors occur if the agent or number is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and target, so it is efficient. The trailing '(Tags: Phone numbers)' artifact is metadata noise that earns no place in the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-object mutation with fully documented parameters and no output schema, the description is minimally adequate. It leaves the return value and failure/prerequisite behavior unstated, which matters for a state-changing call that binds a purchased resource to an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — agent_id and phone_number_id each carry their own schema descriptions — so the baseline of 3 applies. The description adds no format, ID-type, or constraint detail beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (attach) and resource (phone number) plus the target (an existing agent), so the action is unambiguous. It does not explicitly differentiate itself from the inverse sibling detachPhoneNumber, but the name and phrasing make the direction obvious without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over alternatives such as purchasePhoneNumber, importTwilioNumber, or detachPhoneNumber, and no stated prerequisites. The only usage signal is the implied 'attaching to an existing agent', which restates the purpose rather than routing the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulkCallActionsAInspect
Pause, resume, or reschedule a running campaign. (Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only and not destructive. The description adds the specific action types (pause/resume/reschedule) and the scope 'running campaign,' but it does not disclose side effects, permission requirements, or rate limits. It complements annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the core action list immediately clear. The trailing '(Tags: Bulk calls)' is somewhat redundant and adds little value, but it does not detract significantly from the overall clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the schema covers parameter details, the description lacks important contextual information for a complex mutation tool: it does not clarify that 'reschedule' requires additional parameters (new_scheduled_datetime) or mention what happens after the operation (e.g., return value or side effects on the campaign). The description is adequate but under-specified for a tool with a nested request body and action-dependent parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full descriptions for all parameters, including the action enum and the conditional fields (new_timezone, new_scheduled_datetime). The description adds no additional parameter-level detail beyond what the schema already documents, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Pause, resume, or reschedule a running campaign.' It uses specific verbs and identifies the resource (a campaign), and it distinguishes itself from sibling tools like cancelBulkCall and fetchBulkCalls by focusing on control actions rather than listing or canceling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, such as cancelBulkCall. The phrase 'running campaign' implies a precondition, but there is no mention of when not to use it or when another tool would be more appropriate. Usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancelBulkCallADestructiveInspect
Cancel a scheduled bulk-call campaign. A campaign that is already running, or is still a draft, is refused. (Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description adds valuable context beyond that: the operation targets scheduled campaigns and is refused for running or draft campaigns. This tells the agent the state constraints. It doesn't explain side effects on contacts or notifications, but with annotations the bar is lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core purpose and followed by the precondition. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with annotations covering safety and a clear precondition, the description is nearly complete. It could mention whether cancellation is reversible or what happens to scheduled contacts, but no output schema exists so return values needn't be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully described in the schema. The description adds no additional syntax or meaning about bulk_call_id beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel) and resource (scheduled bulk-call campaign), which distinguishes it from siblings like startBulkCall, retryBulkCall, and getBulkCall.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the tool will be refused (already running or still a draft), giving clear conditions for when it can be used. It doesn't name an alternative sibling for those cases, but the preconditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canUploadFileARead-onlyInspect
Check whether a file can be uploaded based on size and type. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description aligns by using 'Check'. It adds a small amount of context by specifying that eligibility depends on size and type, but it does not disclose behavior such as response format, limits, or whether it checks workspace restrictions. With annotations present, the bar is lower, and the description provides only minimal additional value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence plus a tag. Every word earns its place, and the structure is clean and front-loaded with the verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the schema covers parameters well, but the description lacks details about the expected output or any size limit knowledge. Since there is no output schema, the agent does not know whether the response is a boolean, a reason, or a status. It is complete enough for a basic check, but missing context that could affect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; file_size and file_type have descriptive text including 'Only pdf is accepted.' The description's mention of 'size and type' duplicates what the schema already provides. No additional parameter meaning is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Check whether a file can be uploaded based on size and type.' It uses a specific verb (Check) and resource (a file) and specifies criteria (size and type). This distinguishes it from sibling tools like uploadKnowledgeBaseFile, which performs the actual upload.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for validation before upload but does not explicitly state when to use it versus alternatives. It lacks an explicit mention of uploadKnowledgeBaseFile or any exclusions. The context is clear enough for an agent to infer, but there is no direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createAgentAInspect
Create a new agent with the provided configuration. The full config supports transcriber, model, voice, web search, transfer, end-call conditions, post-call actions (email, webhook, Omni CRM, Cloud WhatsApp, or a workflow), ambient background track, initial ringing sound, and multilingual support.
Voicemail detection is an access-gated feature that we turn on per account. If it isn't enabled for yours yet, request access before configuring the
voicemailobject.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| Idempotency-Key | No | Your own unique key for this agent, for example a fresh UUID. Send the same key when you retry. If the first request already created the agent, you get that agent back instead of a second one, so a request that timed out is safe to repeat. The same key with a different request body is refused. Keys are kept for 24 hours. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the access-gating constraint on voicemail, which is useful context beyond the annotations, but says nothing about mutation side effects such as whether an existing agent with the same name is rejected, or the idempotency/safe-retry behavior. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, the capability list follows, and the access-gate caveat is placed after the relevant mention of voicemail. Slightly long given that the feature list duplicates the schema, but each part is readable and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a large create tool with a very rich nested schema and no output schema, the description usefully orients the caller by naming every major configuration area and flagging the one gated feature. It is close to complete; the missing piece is any note about required fields (name, context_breakdown) or conflict behavior, both of which the agent must infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across both parameters, so the schema already carries full parameter documentation (including the Idempotency-Key semantics). The description's enumeration of config areas mirrors the schema rather than adding format, required-field, or interaction detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new agent with the provided configuration') and then enumerates the configurable surface (transcriber, model, voice, web search, transfer, end-call, post-call actions, background track, ringing, multilingual). It never names or distinguishes itself from close siblings like updateAgent, createAgentVersion, or deleteAgent, so an agent gets a clear purpose but no routing signal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one genuine prerequisite (voicemail detection is access-gated on a per-account basis, request access before configuring the `voicemail` object), which is real usage guidance. It stops there: no statement of when to call this instead of updateAgent, whether name uniqueness is required, or what happens on conflict, so it is implied rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createAgentVersionBInspect
Save the agent's current configuration as a named version. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds the concept of taking a snapshot of current configuration, which is useful but does not elaborate on side effects (e.g., whether it overwrites an existing version with the same name, limits on versions, or permissions required). It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with a tag, which is very concise. It wastes no words, but the tag '(Tags: Agents)' adds little value. The information is front-loaded, but slightly more detail could be added without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required parameters, no output schema), the description is mostly adequate. However, it lacks information about the return value (e.g., the created version object or ID). For a creation tool, the agent would benefit from knowing what to expect as a response. Prerequisites (agent existence) are also implied but not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents agent_id and requestBody (including name and note). The description reinforces that the version is a snapshot of the current configuration, but does not add new parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool saves the agent's current configuration as a named version, using a specific verb ('Save') and resource ('agent's current configuration'). It distinguishes from sibling tools like createAgent, updateAgent, listAgentVersions, and restoreAgentVersion by focusing on version creation as a snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it does not mention that the agent must already exist, that this should be called after updating configuration, or that it is distinct from listAgentVersions or restoreAgentVersion. The agent has no context to decide when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createBulkCallADestructiveInspect
Create a new bulk-call campaign. Only name, phone_number_id and a contact_list are needed to dial a list now; every other field adds one behavior on top (drafts, rotation, filtering, scheduling, retries, dynamic feeding).
The guide below the field reference walks the whole journey: the first campaign and its response, each behavior with a working request, every refusal message with its fix, and the endpoints that operate a campaign once it runs.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered by structured data. The description adds real context — that the campaign dials immediately unless saved as a draft, and that the reference documents refusal messages and their fixes — but says nothing about authorization requirements, side effects on existing campaigns, or idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the minimum payload are front-loaded in the first sentence, with the behavior taxonomy following immediately. The second paragraph leans on phrasing about a 'journey' and a guide that isn't contained in the definition, which is slightly promotional but still short and earns its place as a pointer to documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deeply nested, behavior-dense tool with 100% schema coverage and annotations covering safety and openness, the description supplies the missing orientation layer: minimum required input and a taxonomy of optional behaviors. Return values are not described, but no output schema exists and the description points to a reference that documents the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema does the heavy lifting. The description nonetheless adds a synthesis the schema lacks: it identifies the minimal required trio (name, phone_number_id, contact_list) and groups every remaining field by the single behavior it activates, giving the agent a mental model for progressive configuration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a new bulk-call campaign') and immediately clarifies the minimum viable payload, so the agent knows exactly what the call produces. It gestures at sibling territory ('the endpoints that operate a campaign once it runs') but never names a sibling tool, so differentiation stays implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does say what is needed to 'dial a list now' versus the incremental fields that layer on behaviors (drafts, rotation, filtering, scheduling, retries, dynamic feeding), which is genuinely useful field-selection guidance. However it gives no guidance on when to choose this tool over alternatives such as dispatchCall or createWorkflow, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createClonedVoiceAInspect
Clone a voice from an audio sample. The sample must be Base64 encoded and 1 KB to 25 MB. MP3, WAV and WebM are accepted; a non-audio body is refused.
Creation is asynchronous. This call returns 202 at once with
status: processing. Poll GET /voices/{voice_id} until status is
ready or failed, then use the voice_id in an agent's voice config with
voice.provider: cartesia.
You must send consent: true: you confirm you have the right to clone
this voice. The attestation is recorded against the clone.
Limits apply per user: 5 clones an hour, 20 a day, and 200 stored
(processing plus ready). A request over a limit is refused with 429.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| Idempotency-Key | No | Optional. Send a unique value per clone; a retry with the same key and body returns the first clone instead of creating a second. Every clone costs money at the provider, so this makes a retry safe. Up to 255 printable characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering only the safety triad (not read-only, not destructive, closed-world), the description adds substantial behavior beyond them: asynchronous creation with 202/processing, the 429 refusal on limits, the 5/hour, 20/day, 200-stored quotas, and the fact that the consent attestation is recorded against the clone. This is exactly the operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Paragraphs are short, front-loaded, and each carries actionable content (formats, async flow, consent, limits). Slight redundancy with the schema on the clip constraints and the consent requirement keeps it from a 5, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return contract (202 with status: processing), the status states, and how the resulting voice_id is consumed. For a nested-body, async mutation tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the clip size range (1 KB–25 MB), accepted formats (MP3/WAV/WebM), and consent=true are all already documented in the schema. The description restates these rather than adding syntax or format detail beyond them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Clone a voice from an audio sample') and immediately names the input medium and accepted formats. An agent can distinguish it from siblings like getClonedVoice, listClonedVoices, and regenerateClonedVoiceSample without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the full workflow: synchronous 202 return, polling GET /voices/{voice_id} until status is ready or failed, then using voice_id with voice.provider cartesia. It also states the consent precondition and the per-user rate limits, so the agent knows both when to call and when a retry will be refused with 429.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createSessionAInspect
Create a voice Session: a short-lived, single-conversation
reservation that lets a client hold a live voice chat with your
agent. This is step 1 of 2. Creating the Session does not start any
audio on its own; it returns a ws_url that a client then connects
to over WebSocket to actually talk.
Call this endpoint from your server with your API key, and return
only the ws_url to your client. The API key must never reach the
browser. The ws_url is the only thing the client needs, and it is
safe to hand out because it is single-use and expires. For how to
connect and talk, see "Connect the client and talk" below the
request details.
(Tags: Sessions)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (write operation, non-destructive, closed-world), the description discloses lifecycle traits (short-lived, single-use, expires), what is returned (`ws_url`), what is not triggered (no audio), and a security constraint (API key must never reach the browser). This is substantial behavioral context an agent cannot derive from the annotation block.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraph is front-loaded with the core definition and return contract, and each sentence carries weight (lifecycle, return value, server-side handling, security). The trailing pointer to 'Connect the client and talk' refers to documentation outside this definition, which is slightly wasteful, but the structure is otherwise efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming `ws_url`. Combined with a fully documented input schema and clear role/security guidance, it is nearly complete; only minor gaps remain (e.g., how long the session lives before expiring, error behavior).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single nested `requestBody` is documented exhaustively in the schema itself, so the baseline is 3. The description adds no parameter-level detail (agent_id, metadata, custom_variables, post_call_actions) beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a voice Session') and immediately defines what a session is: a short-lived, single-conversation reservation. It also positions the tool in the flow ('step 1 of 2') and clarifies what it does NOT do ('does not start any audio on its own'), which cleanly separates it from any call-dispatching sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use ('Call this endpoint from your server with your API key') and the sequencing ('step 1 of 2'), which tells an agent when this tool applies. However, it names no explicit alternative or when-not-to-use condition, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createWorkflowAInspect
Create a workflow with a draft. Without graph, the draft holds one trigger node, ready for editWorkflow ops. Pass graph only to start from a complete graph. The response carries the revision you need to edit.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-readonly, non-destructive, non-open-world write. The description adds real value beyond that: the default draft content, that graph input passes the same validation as editWorkflow ops, and that the response carries the `revision` needed for editing. It does not state the resulting activation/publish state or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then default behavior, then the graph caveat, then the return contract. No filler; the only overhead is the '(Tags: Workflows)' suffix.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the `revision` field returned. The deeply nested graph object is fully documented in the schema. Missing only peripheral context such as the created workflow's initial state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds conditional semantics the schema cannot: what the draft contains when `graph` is omitted, and the 'only' caveat for supplying it. This meaningfully reduces the chance of over-sending a full graph.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Create a workflow with a draft', plus the default behavior (one trigger node) that no sibling tool shares. It also names editWorkflow as the downstream consumer, which anchors this tool's role in the workflow lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit conditional guidance: omit `graph` to get an editable draft, and 'Pass `graph` only to start from a complete graph.' It does not explicitly frame alternatives at the tool level (e.g., why createWorkflow vs. editWorkflow from scratch), but the when/when-not for the key decision is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deactivateWorkflowADestructiveInspect
Turn the published workflow off, so real events stop running it. The workflow and its draft stay. Use activateWorkflow to turn it back on.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds real value beyond them by disclosing the scope of the change ('real events stop running it') and that data is preserved ('the workflow and its draft stay'), which is the key fact an agent needs since the operation is reversible. It omits effects on in-flight executions and any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, effect first, reversibility second, routing to the sibling third. No filler; the tag suffix is the only non-essential text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema state-change tool with annotations covering safety, the description covers purpose, effect, reversibility, and the alternative. Minor gaps remain around in-flight executions and error conditions (e.g. deactivating an already-unpublished workflow).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already documents workflow_id fully. The description adds no format, range, or sourcing detail beyond it, which is the expected baseline when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('deactivate the published workflow') and immediately states the concrete effect: real events stop running it. It also distinguishes itself from related siblings by clarifying the workflow and draft are preserved, implicitly contrasting with deleteWorkflow, and by naming activateWorkflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names `activateWorkflow` as the path to re-enable, giving the agent a clear counterpart and the condition that selects it. It doesn't, however, explicitly distinguish this from permanently removing a workflow via deleteWorkflow, leaving that inference to the 'workflow and its draft stay' clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteAgentADestructiveInspect
Permanently delete an agent. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already include destructiveHint=true, so the destructive nature is known. The description adds 'permanently', reinforcing irreversibility, but does not disclose potential side effects like deletion of related versions or sessions. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence followed by a tag. It is front-loaded, concise, and contains no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter schema, the destructive annotation, and clear purpose, the description is nearly complete. The only gap is a lack of mention of cascading effects (e.g., deleting agent versions), but this is not critical for a basic delete tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the only parameter agent_id is described as 'The ID of the agent.' The description adds no additional meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Permanently delete an agent' with a specific verb and resource. It distinguishes from sibling tools like deleteAgentVersion and deleteKnowledgeBaseFile by targeting the agent itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit when-to-use or alternatives. Usage is implied by the tool's name and purpose, but there is no guidance on choosing this over other delete-related sibling tools such as deleteAgentVersion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteAgentVersionBDestructiveInspect
Delete a saved version. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| version_number | Yes | The version number, as returned in `version_number` from the list or save endpoints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the agent knows this is a destructive operation. The description's verb 'Delete' is consistent. However, it adds no extra behavioral context (e.g., permanence, required permissions, side effects) beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short: one sentence plus a tag. It is front-loaded with the core action. However, the tag appears to be metadata leaking into the description, which is slightly distracting. It could add a bit more substance without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (2 well-documented params, no output schema, clear annotations), the description is adequate but not fully complete. It could mention that deletion is permanent, or specify that version_number must come from list/save endpoints (which is already in the schema). The description provides minimal contextual supplementation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both agent_id and version_number documented in the schema itself. The description does not add any additional meaning or context about the parameters. Baseline 3 is appropriate because the schema carries the burden adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a saved version' clearly states the verb (delete) and resource (a saved version of an agent). The title from annotations reinforces this. It distinguishes from siblings like renameAgentVersion and listAgentVersions by naming the delete action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs alternatives. For example, there is no mention that this deletes a specific version rather than the entire agent (for which deleteAgent exists). The description lacks usage context, conditions, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteClonedVoiceADestructiveInspect
Delete a cloned voice and remove it from the provider. A voice that is
still processing cannot be deleted.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Id of the cloned voice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is covered. The description adds value beyond that by disclosing the external side effect ('remove it from the provider') and a state-based restriction on deletion, which the annotations do not express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: the action first, then the precondition. Every clause carries information and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full annotation coverage and no output schema, the description covers the action, its external effect, and the key precondition. Only minor details (e.g., what is returned or idempotency on a nonexistent id) are absent, which is acceptable here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a documented `voice_id`, so the schema already carries the parameter meaning. The description adds no syntax or format detail for the id beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (cloned voice), plus the additional effect of removing it from the provider. An agent can distinguish it from getClonedVoice, updateClonedVoice, and listClonedVoices without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear precondition/exclusion: a voice still in `processing` state cannot be deleted. It does not name a sibling alternative (which is not really needed for a unique delete operation), but the state gate is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteKnowledgeBaseFileADestructiveInspect
Permanently delete a file. Removes it from any attached agents. Cannot be undone. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds important behavioral context beyond that: permanence ('Cannot be undone') and the side effect on attached agents. This gives the agent a fuller picture of the operation's consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using three short sentences to convey action, side effects, and irreversibility. Every word earns its place, and the (Tags: Knowledge base) suffix adds contextual metadata without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one well-documented parameter, the description is complete: it states the action, the permanent nature, and the agent detachment side effect. Annotations cover the destructive profile, and no output schema is needed, so no further explanation is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single file_id parameter, which already documents its meaning. The description adds no extra parameter details, so the baseline of 3 is appropriate; it neither needs nor provides further elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action ('Permanently delete a file') and resource ('a file' in the knowledge base context). It also distinguishes from siblings like detachKnowledgeBaseFiles by noting the file is removed from attached agents, making the scope explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating the side effect ('Removes it from any attached agents'), which hints at when to use this vs detach, but it does not explicitly name alternatives or state when not to use. No direct comparison to sibling tools is provided, so usage guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deletePostCallActionBDestructiveInspect
Remove one post-call action from the agent. The agent's other actions are not changed. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| action_id | Yes | The ID of the post-call action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is known. The description usefully adds blast-radius context ('The agent's other actions are not changed'), but says nothing about irreversibility, required permissions, or what happens if the action_id is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the operation and followed by the scoping caveat; nothing is buried. The trailing '(Tags: Agents)' fragment is metadata padding that earns no place in the prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with full schema coverage and annotations covering the safety profile, the description is nearly sufficient. It is missing only where action_id comes from and an irreversibility confirmation, which are minor against the structured data already present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both required parameters (agent_id, action_id) are fully documented in the schema. The description adds no format, range, or sourcing information beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('one post-call action from the agent'), and the second sentence scopes the effect to a single item. It does not name the sibling tools it sits beside (addPostCallAction, updatePostCallAction, listPostCallActions), but an agent can still tell what this does and how its blast radius is bounded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. Nothing tells the agent to use listPostCallActions to obtain the action_id first, nor how this differs from updatePostCallAction, which is the natural sibling confusion point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteWorkflowADestructiveInspect
Delete a workflow. Its published version stops running. This cannot be undone, so confirm with the user first. To stop it without deleting, use deactivateWorkflow.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds concrete behavioral context beyond them: the published version stops running, the action is irreversible, and user confirmation is required. It doesn't cover auth needs or rate limits, but for a single-resource delete this is strong added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the action, the consequence, the irreversibility/confirmation warning, and the alternative. The consequence and alternative are front-loaded with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete with annotations covering safety and no output schema, the description supplies everything an agent needs: the effect on the published version, irreversibility, confirmation requirement, and the non-destructive alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `workflow_id` parameter is fully documented in the schema. The description adds no syntax, format, or meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete a workflow') and explicitly distinguishes itself from the sibling `deactivateWorkflow` by explaining that the latter stops a workflow without deleting it. An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Delete a workflow'), a when-not alternative ('To stop it without deleting, use `deactivateWorkflow`'), and a required precondition ('confirm with the user first'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detachKnowledgeBaseFilesADestructiveInspect
Detach multiple knowledge-base files from an agent. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, and the description consistently describes a mutating operation. The description adds minimal behavioral context, such as the ability to detach multiple files at once, but does not disclose side effects or reversibility beyond what the annotations convey. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that directly states the operation, followed by a useful tag. No filler or irrelevant information. It is appropriately front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple nested structure with two required parameters, fully described in the schema. Annotations indicate it is destructive, and the description clarifies the operation. Without an output schema, no return-value documentation is expected. The combination of description, schema, and annotations provides sufficient context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for both agent_id and file_ids. The tool description adds no additional parameter details, but the schema descriptions are self-explanatory. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Detach multiple knowledge-base files from an agent' with a specific verb (detach), resource (knowledge-base files), and target (agent). This clearly distinguishes from sibling tools like attachKnowledgeBaseFiles (opposite) and deleteKnowledgeBaseFile (delete vs detach).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the use case: when you need to remove knowledge-base files from an agent. However, it does not explicitly mention alternatives or exclusions, such as when to use deleteKnowledgeBaseFile instead of detach. The context is clear but not fully elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detachPhoneNumberCDestructiveInspect
Detach a phone number from its agent. (Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond restating the operation: it doesn't clarify whether the number is merely unassigned or freed, whether the agent is affected, or whether the action is reversible, despite the destructive flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence front-loads the verb and resource with no wasted words, followed only by a tag. It is appropriately sized, though the minimal content leaves room that could have been used for the missing behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter operation whose annotations cover the safety profile and whose schema covers the parameter, the description is minimally sufficient. However, the ambiguous consequence of a destructive detach (reassignment vs. permanent removal) is left entirely to the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and only one parameter exists, so the schema fully documents phone_number_id. The description adds no syntax, format, or ID-source information beyond what the schema already provides, matching the baseline 3 for schema-heavy definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('detach') and resource ('phone number') plus the source relationship ('from its agent'), so the effect is unambiguous. It does not explicitly distinguish itself from the sibling attachPhoneNumber, though the antonym is self-evident from the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. Nothing tells the agent when to detach versus releasePhoneNumber or other number-management siblings, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffAgentVersionARead-onlyInspect
Get a record-level diff for this version. By default it shows what changed in this version compared with the version before it. Use against=current to compare with the agent's live config (what restoring this version would change), or against=<number> to compare with another version.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| against | No | What to compare against. Omit or `previous` for the version before this one (the default). `current` for the agent's live config. A version number to compare with that version. | |
| agent_id | Yes | The ID of the agent. | |
| version_number | Yes | The version number, as returned in `version_number` from the list or save endpoints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, which indicates a safe read operation. The description adds that the diff is 'record-level' and explains the comparison modes. It does not disclose any other behavioral traits such as authorization requirements or rate limits, but given the read-only nature, it is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the first sentence immediately stating the purpose. Each subsequent sentence adds specific information about the default behavior and the 'against' parameter. There is no redundant information, and the tag line is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should ideally describe the return value. It does not specify what the diff format looks like (e.g., list of changes, unified diff). While the description is adequate for basic usage, the lack of output description leaves a gap for the agent to understand the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, with detailed descriptions for each parameter. The description adds value by explaining the default comparison and the semantics of 'against=current' (what restoring would change), which goes beyond the schema's 'agent's live config'. This additional context helps the agent understand the parameter's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' and the resource 'record-level diff' for this version. It clearly states the action and the object. Among sibling tools, no other tool provides diff functionality, so it is well-distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default behavior (comparing with previous version) and provides examples for the 'against' parameter. However, it does not explicitly state when to use this tool versus alternatives like restoreAgentVersion or listAgentVersions, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatchCallBDestructiveInspect
Initiate a call to a phone number using a specified agent. The phone number must include a country code with a leading plus.
(Tags: Calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the agent knows this is a mutating, externally-visible operation. The description adds the number-format requirement but says nothing about real-world consequences (a live outbound call is placed), cost, or that post-call actions supplied here override the agent's configured actions for this call only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the one hard constraint. Nothing is padded, though the parenthetical '(Tags: Calls)' is noise that adds no selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that triggers a real, destructive, open-world outbound call with a deep nested payload, the description is thin: no return value (e.g. call id), no auth or balance prerequisites, and no differentiation from bulk-call siblings. With no output schema, the description should carry more of that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single requestBody parameter is documented exhaustively, including agent_id, to_number, metadata, languages and the large post_call_actions tree. The description merely restates the to_number format already in the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Initiate a call to a phone number using a specified agent') with a concrete constraint on the number format. It is clear on its own but never distinguishes itself from sibling tools such as createBulkCall or createSession, which an agent could reasonably confuse with a single outbound dispatch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is a data-format rule ('must include a country code with a leading plus'), which is really a parameter constraint. There is no statement of when to use this versus createBulkCall for volume dialing, nor any prerequisite such as needing a valid agent_id or an available from number.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editWorkflowAInspect
Change the draft with a list of ops: add, update, move or delete nodes, and connect or disconnect them. The ops apply all together or not at all. You must send the revision from your last read. If you get 409 revision_conflict, read the workflow again and retry. Secrets read back as ********. Send them back unchanged to keep the stored value. This edits the draft only. Use publishWorkflow to make it live.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false) by disclosing atomicity ('apply all together or not at all'), optimistic-concurrency behavior (mandatory revision, 409 retry loop), secret round-trip masking ('********' must be sent back unchanged), and draft-vs-live scope. These are exactly the behavioral traits an agent cannot infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then the atomicity constraint, the revision requirement, the error path, and the draft-vs-publish distinction. Every sentence carries an operational fact and none is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with nested ops and no output schema, it covers everything an agent needs: scope (draft only), concurrency contract, atomicity, secret handling, and the escalation path to publishWorkflow. No relevant behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the op-level table already documents every field per operation, so the description's op list and secret/revision notes are largely duplicative. It does add one genuinely non-schema fact, that the ops apply atomically, which justifies going above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (change/edit) and resource (the draft) and enumerates the op families: add, update, move, delete nodes, connect/disconnect. It also explicitly separates itself from the sibling publishWorkflow, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the condition that selects this tool ('edits the draft only') and names the alternative for the other intent ('Use publishWorkflow to make it live'). It also gives the required precondition (send the revision from your last read) and the recovery path for the 409 revision_conflict case, which is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchBulkCallsARead-onlyInspect
List bulk-call campaigns with pagination and optional status filter. (Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| pageno | No | Page number for pagination. | |
| status | No | Filter by status (e.g. completed). | |
| pagesize | No | Items per page (max 150). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, making the read-only nature transparent. The description adds behavioral details about pagination and status filtering, which go beyond the annotation. However, it does not disclose the response format, any authorization requirements, or potential rate limits, but given the annotation coverage, the added context is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the verb 'List'. The parenthetical '(Tags: Bulk calls)' is somewhat redundant with the tool name but does not significantly clutter the description. Overall, every sentence contributes to the core purpose without excessive verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with three well-documented optional parameters, the description covers the essential aspects: purpose, pagination, and filter capability. It does not detail the return structure, but the lack of an output schema and the tool's simplicity make this acceptable, especially with the readOnlyHint annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with detailed descriptions for all three parameters, including types, defaults, and constraints. The description's mention of 'optional status filter' merely echoes the schema's status parameter description without adding new meaning, so it does not surpass the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and identifies the resource as 'bulk-call campaigns', further specifying pagination and optional status filtering. This clearly differentiates it from siblings like getBulkCall (single resource) and createBulkCall (creation), leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any explicit guidance on when to use this tool versus alternatives. While sibling tool names imply a distinction (e.g., getBulkCall for a single campaign), the description itself offers no when-to-use or when-not-to-use context, nor does it mention any alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getAccountBalanceARead-onlyInspect
Read your organization's wallet: the remaining balance, the minutes it buys at your rates, your plan, your concurrency headroom, and whether auto-recharge will refill it.
Use it before a campaign, or on a schedule, so you find out you are
low on credit from this endpoint rather than from a call failing
with 402 payment_required.
The response always describes the organization the API key belongs to. There is no parameter for reading another account; resellers read a client's figures through the Reseller endpoints.
A balance at or below zero does not always mean calls will stop. An
organization on usage-based billing (plan.is_usage_based) keeps
placing calls and is metered to its payment method instead, so check
that flag before treating a zero balance as a stop condition.
The API key's user needs Billing access in your organization. If
you get a 403, an administrator can grant it when Billing is
enabled for your organization; when it is not, contact support.
(Tags: Account)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint/openWorldHint; the description adds real behavioral context the schema cannot: a zero balance does not always halt calls for usage-based billing orgs, and the call requires Billing access with a documented 403 remedy path. This is exactly the kind of non-obvious operational detail that prevents wrong agent conclusions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the call returns, then usage timing, then edge cases and auth. Every section earns its place, though the seven-paragraph layout is longer than strictly necessary and could be tightened without losing the 402/403/zero-balance guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return payload and does so (balance, minutes, plan, concurrency, auto-recharge). Combined with scope, timing, and auth/error handling, an agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema-based baseline of 4 applies. The description usefully clarifies that the absence of parameters is intentional and scope is fixed to the API key's organization, but there is no parameter syntax to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read your organization's wallet') and enumerates exactly what the payload contains: balance, minutes at your rates, plan, concurrency headroom, auto-recharge. No sibling tool covers account balance, and the description makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('before a campaign, or on a schedule') with the rationale (surface low credit here rather than via a 402), and an explicit when-not/alternative ('there is no parameter for reading another account; resellers read a client's figures through the Reseller endpoints').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getAgentBRead-onlyInspect
Get details of a specific agent by ID. The response also includes a can_publish boolean showing whether version history is turned on for the agent's organization.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral detail beyond the structured data – that the response carries a can_publish boolean tied to organization version-history settings – but omits other return-value context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and the trailing tag is minor overhead. It is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, yet it names only one field (can_publish) out of the full agent detail object. Annotations cover the safety profile, but the return-shape picture remains partial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single agent_id parameter is already documented in the schema as 'The ID of the agent.' The description adds no format or type detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get details of a specific agent by ID'), which clearly distinguishes a single-record fetch from the list-oriented siblings like listAgents. It does not explicitly name an alternative, so it stops short of the 5-level sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as listAgents or listAgentVersions. The agent must infer usage from the name and ID parameter alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getBulkCallARead-onlyInspect
Get detailed information about a bulk-call campaign. (Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already indicates a safe read operation, and the description is consistent. However, the description adds no extra behavioral context—e.g., what 'detailed information' includes, error behavior, or pagination—beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant content. The tag '(Tags: Bulk calls)' is minor but does not detract from clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-id tool with one required parameter and a read-only annotation, the description is nearly complete. The phrase 'detailed information' hints at the return value but could be more explicit about the response shape since no output schema is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the only parameter bulk_call_id with an adequate description. The tool description adds no additional meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('bulk-call campaign') with a clear modifier ('detailed information'). This distinguishes it from sibling tools like getBulkCallLiveStatus, which focuses on live status rather than general details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as getBulkCallLiveStatus or fetchBulkCalls. The description states what the tool does but gives no context for choosing it over other bulk-call tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getBulkCallLiveStatusARead-onlyInspect
Real-time status of a running bulk-call campaign. (Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, covering the safety profile. The description adds context that this is for 'running' campaigns and provides 'real-time' status, which is useful but does not disclose additional behavioral traits such as what fields the status includes or behavior if the campaign is not running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the core purpose without unnecessary detail. The tag 'Bulk calls' adds little but is not distracting. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only tool with one parameter and no output schema, the description is adequate. It conveys the key constraint ('running') and the real-time nature. However, it could be more complete by hinting at what status information is returned, but the low complexity level means this is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter (bulk_call_id), and the schema already describes it as 'Id of the bulk call campaign.' The description does not add any additional meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as retrieving real-time status of a running bulk-call campaign, with a specific verb ('status') and resource ('bulk-call campaign'). It distinguishes from siblings like getBulkCall by emphasizing 'running' and 'live', though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies appropriate use cases: use when you need the current live status of an ongoing bulk-call campaign. It does not provide explicit exclusions or alternatives, but the context is clear enough for an agent to differentiate from listing or general retrieval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getCallLogARead-onlyInspect
Detailed information about a specific call (duration, status, transcript, sentiment, extracted variables). (Tags: Calls)
| Name | Required | Description | Default |
|---|---|---|---|
| call_log_id | Yes | Id of the call log, as returned by the call log list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the description doesn't need to restate that. It adds context about return content (transcript, sentiment, extracted variables), but does not disclose any behavioral limitations or permissions. Adds some value beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence, front-loaded with purpose, and includes a useful parenthetical list of returned fields. The 'Tags: Calls' is minor extra but not detrimental. No redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema, the description gives a solid overview of return contents. It could mention error handling or the exact response shape, but the listed fields and specificity are sufficient for most agents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter call_log_id is fully described in the schema with clear provenance ('as returned by the call log list'). The tool description does not add new meaning, so baseline 3 applies given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves detailed information about a specific call, enumerating key data points (duration, status, transcript, sentiment, extracted variables). This distinguishes it from sibling list/bulk call tools by focusing on a single resource's details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for single-call lookups via 'specific call', but it does not explicitly state when to use this over listCallLogs or fetchBulkCalls, nor does it mention exclusions or prerequisites. Context is present but not made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getClonedVoiceARead-onlyInspect
One cloned voice, including its creation status.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Id of the cloned voice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false so the safety profile is covered. The description adds that the response includes creation status, a useful behavioral detail, but nothing about errors for invalid/missing voice_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence, front-loaded with the resource and disclosing the key returned field. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-param read tool with annotations and a fully-described schema and no output schema, the definition is nearly complete. Only minor gap is not stating behavior on unknown voice_id or that status values are enumerated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single required param with 100% schema coverage; the schema describes voice_id fully. The description adds nothing beyond 'a cloned voice' which the schema already conveys, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieves a single cloned voice, and calls out the creation status. It contrasts implicitly with listClonedVoices and sibling getVoice, though it doesn't explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the singular 'one cloned voice' versus the plural listClonedVoices sibling, but there is no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getClonedVoiceSampleARead-onlyInspect
Stream the generated mp3 sample of a cloned voice. Only the owner can
fetch it. 404 (sample_not_ready) when no sample exists yet. The
request needs your API key in the Authorization header.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Id of the cloned voice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint, it discloses the auth requirement (API key in the Authorization header), the ownership restriction, and the specific error code for a missing sample. These are exactly the operational traits annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then access constraint, then error/auth conditions. No filler, and the most decision-relevant fact (what it returns) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param streaming getter with no output schema, the description covers purpose, ownership, error behavior, and auth. It is nearly complete; only the recovery action for sample_not_ready (regenerate) is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and voice_id is already documented in the schema. The description adds no syntax, format, or constraint detail about the parameter beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: 'Stream the generated mp3 sample of a cloned voice.' This is clearly distinguishable from siblings like getClonedVoice (metadata) and regenerateClonedVoiceSample (which produces, not fetches, the sample). An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: owner-only access and a 404/sample_not_ready state when no sample exists yet. It does not, however, explicitly route the agent to regenerateClonedVoiceSample when the 404 occurs, so the alternative path is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getVoiceBRead-onlyInspect
Detailed metadata for a specific voice. (Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Numeric id of the voice, as returned in the `id` field of the voices list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral detail beyond the readOnlyHint and openWorldHint annotations. It does not disclose return format, permissions, or edge cases, but the annotations adequately cover the safety profile, so the description is not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler or redundant content. It front-loads the core purpose and avoids unnecessary details, which is ideal for a simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool, the description, schema, and annotations together provide adequate context. However, without an output schema, the description could specify what metadata is included (e.g., name, provider, languages) to be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a descriptive explanation for voice_id. The tool description adds no parameter-level information, so the baseline of 3 is appropriate given the schema already handles the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns detailed metadata for a specific voice, implying a retrieval operation. It distinguishes from sibling tools like listVoices by targeting a single voice, though the verb is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as listVoices or when it would be appropriate. The use case is only implied by the 'specific voice' wording, with no explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getWorkflowARead-onlyInspect
One workflow with its draft, status and revision. Call it before every edit to get the current revision. Use view=structure to see nodes and edges without config on a large workflow. Secrets read back as ********.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | `structure` leaves node `config` out. | full |
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already covering the safety profile, the description adds real value: secrets are masked as `********`, and the revision is a precondition for edits. This is behavioral context the annotations do not convey, though return/pagination specifics are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it returns, then the usage trigger, then the view tip, then the secret-masking note. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-shape burden, and it does name the key fields (draft, status, revision). For a two-parameter read tool this is nearly complete; minor gaps remain on error/not-found behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's note on `view=structure` (nodes and edges without config) largely restates what the schema already documents, adding little beyond the enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (get) and resource (one workflow), and it enumerates what is returned: draft, status, and `revision`. This clearly separates it from listWorkflows (singular vs list), but no sibling is named explicitly, so it stops short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule: 'Call it before every edit to get the current `revision`.' It also adds a conditional for `view=structure` on large workflows. No explicit when-not-to-use or named alternative tool, so it's clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getWorkflowExecutionARead-onlyInspect
One run of a workflow, with the result of each step. Use it to read the outcome of testWorkflow. A run is finished when state is completed, failed or cancelled.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. | |
| execution_id | Yes | The `execution_id` from `testWorkflow`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the completion-state semantics, which is useful beyond the annotations. However, it doesn't disclose return shape, pagination, or how results are structured per step, leaving some behavioral gaps for a read tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource identity, followed by usage and completion semantics. Every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete enough for a read-only retrieval tool whose annotations cover safety and whose two params are fully documented in schema. Without an output schema and with a per-step result payload, the description could say more about the return structure, but the essential calling context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by explaining execution_id as coming from testWorkflow – a provenance hint the schema also touches on. It doesn't add syntax detail beyond the schema, keeping it modestly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('one run of a workflow, with the result of each step') and a concrete use ('read the outcome of testWorkflow'). It clearly distinguishes itself from getWorkflow and testWorkflow in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the action it pairs with ('read the outcome of testWorkflow') and gives the terminating condition for use ('a run is finished when state is completed, failed or cancelled'). This routes the agent from testWorkflow to this tool for retrieving results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getWorkflowNodeTypeARead-onlyInspect
The settings one node type reads, with their types, required flags and outputs. Call it before you add or edit a node, because its fields are the keys of the node's config. Use detail=full only when you need help text and examples.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | `full` adds descriptions, examples and `output_example`. | minimal |
| node_type | Yes | A node type from `listWorkflowNodeTypes`, such as `whatsapp`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the returned `fields` are the config keys for the node, and `detail=full` expands the response with descriptions, examples and output_example, which tells the agent what a heavier call costs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the primary purpose and the pre-edit usage rule are front-loaded, and the detail-param caveat follows as secondary guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description still characterizes the return (settings with types, required flags, outputs, and what full detail adds). Combined with full param coverage and read-only annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns above baseline by explaining the practical trade-off of `detail=full` (help text and examples, use only when needed) and by tying `node_type` semantics to the config-key relationship, adding meaning the enum/default alone doesn't convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it returns the settings one node type reads, including types, required flags and outputs. It's clear what comes back, but it never explicitly names its closest sibling (listWorkflowNodeTypes) to contrast the single-type lookup against the listing, leaving that distinction to the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule ('Call it before you add or edit a node') grounded in a reason (its fields are the keys of the node's config), and adds a when-to-use for the detail param. It stops short of stating when not to use it or naming an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
importExotelNumberAInspect
Import an Exotel number by providing your Exotel credentials. (Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-destructive operation. The description adds that credentials are required, which is useful context, but does not disclose side effects or expected results. With annotations already covering safety, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and to the point, but includes a redundant '(Tags: Phone numbers)' line that adds no value. Otherwise efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an import operation with no output schema, the description is too sparse; it doesn't mention what the output or response will be, nor any side effects or prerequisites beyond credentials. The nested request body is fully documented in schema, but the lack of behavioral context makes it incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes all parameters with descriptions and required fields, so the description need not add parameter details. Baseline 3 is appropriate as the description adds no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it imports an Exotel number, using a specific verb and resource. The mention of Exotel credentials distinguishes it from sibling import tools like importTwilioNumber and importSipTrunk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage: use when you have Exotel credentials and want to import an Exotel number. No explicit exclusions or comparison to alternatives, but the name and description are sufficiently specific.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
importSipTrunkCInspect
Import a phone number associated with a SIP trunk. (Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds no behavioral context on top of that - no mention of auth/permissions, whether the number must be verified, or what state change occurs on import. It essentially restates the verb already in the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence carrying the core action, plus a short tag line. Nothing is padded, though the tag '(Tags: Phone numbers)' is metadata rather than instruction and the sentence is arguably too terse for the underlying complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation tool wrapping a 10-property nested object with no output schema, yet the description says only that it imports a number. It omits anything about prerequisites, side effects, or how the import relates to the attach/detach and other provider-import siblings, which is not sufficient for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the nested requestBody and all ten fields (sip_host, sip_port, phone_number, sip_trunk_name, sip_strip_country_code, etc.) are already fully documented in the schema. The description adds nothing about parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Import) and resource (a phone number associated with a SIP trunk), which is enough to separate it from generic number tools like purchasePhoneNumber or searchPhoneNumbers. However, it never differentiates itself from the near-identical siblings importTwilioNumber and importExotelNumber, so the agent must infer the distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no named alternatives. Given that importTwilioNumber, importExotelNumber, attachPhoneNumber and purchasePhoneNumber all exist as competing ways to get a number onto the account, the description should route the agent but does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
importTwilioNumberAInspect
Import an existing Twilio number by providing your Twilio credentials. (Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a mutating but non-destructive operation. The description adds context about requiring Twilio credentials, which is also present in the schema. It does not disclose side effects, idempotency, or ownership checks, so it adds minimal behavioral value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and requirement. It contains no redundant information, and the tag is harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple import tool with a nested object schema, the description is adequate but minimal. It doesn't explain the outcome of the import, potential error conditions, or how the imported number will be used (e.g., for later attachment). Given the lack of an output schema, the agent might benefit from more context, but the core operation is clear enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for phone_number, account_sid, account_token, and name. The description's mention of 'credentials' loosely maps to the SID and token but adds no detail beyond the schema, so it doesn't enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Import'), the resource ('existing Twilio number'), and the method ('providing your Twilio credentials'). This distinguishes it from sibling tools like importExotelNumber and importSipTrunk, which target different providers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (importing a Twilio number with credentials) but does not explicitly compare to alternatives or state when not to use it. There is no mention of prerequisites or exclusions, leaving the agent to infer from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listAgentsARead-onlyInspect
Retrieve all agents for the authenticated user with pagination support. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter agents whose name matches this substring (case-insensitive). | |
| pageno | No | Page number for pagination. | |
| pagesize | No | Number of items per page (max 150). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful behavioral details beyond that: pagination support and authenticated user scoping. It does not contradict annotations and adds value by explaining the listing mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the key action and resource. It is concise with no unnecessary fluff, though the parenthetical tag '(Tags: Agents)' is slightly redundant, it does not significantly detract from the clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple and annotations are good, the description omits the name filter capability that is a key feature in the schema. It also doesn't describe the return format (no output schema), but one would expect a list of agents. The omission of filtering makes it less complete than it could be.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully describes the parameters. The description mentions pagination but does not add any parameter-specific meaning beyond what's in the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve'), the resource ('all agents'), and the scope ('for the authenticated user'), making it easy to distinguish from siblings like getAgent (single agent) and createAgent. The pagination support is also mentioned, which adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (listing agents for the authenticated user), and the pagination note implies usage for large datasets. However, it does not explicitly state alternatives or when not to use it, though the sibling list makes this fairly obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listAgentVersionsARead-onlyInspect
List an agent's saved versions, newest first. Includes manual (named) versions, automatic versions, and system backups taken before a restore. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter versions by kind. | |
| pageno | No | Page number for pagination. | |
| search | No | Filter versions whose name matches this substring (case-insensitive). | |
| agent_id | Yes | The ID of the agent. | |
| pagesize | No | Number of items per page (max 150). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring the safety profile, the description still adds real behavioral content: result ordering (newest first) and the fact that results mix manual (named), automatic, and pre-restore system backup versions. It stops short of describing pagination behavior or result shape, and it does not clarify how the three listed kinds map onto the two-value `kind` filter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action and ordering front-loaded, no redundancy. The trailing "(Tags: Agents)" line is inert metadata that adds no selection or invocation value, keeping it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with fully documented parameters and annotations, the description covers what is returned and in what order. However, with no output schema, it says nothing about the shape of a version entry (IDs, names, timestamps) that an agent would need to chain into diffAgentVersion or restoreAgentVersion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pageno, pagesize, search, agent_id, and the kind enum are all already documented; baseline 3 applies. The enumeration of version kinds is tangential to the `kind` parameter rather than explaining it, and the ambiguity between "automatic" and "system" versions is left unresolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List an agent's saved versions") plus ordering ("newest first") and the three version types returned. That is enough to distinguish it from diffAgentVersion, restoreAgentVersion, and renameAgentVersion by verb alone, but the description never explicitly names those siblings as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the enumeration step before diff/restore/rename, but there is no explicit when-to-use statement and no mention of adjacent tools such as getAgent or diffAgentVersion. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listAllProvidersCRead-onlyInspect
Comprehensive response with services and voices in one payload. (Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds that the response is comprehensive and bundles services and voices into one payload, which is useful context not present in annotations. However, it does not disclose pagination, authentication, rate limits, or what 'services' specifically covers. Annotations already indicate read-only behavior, so the bar for additional transparency is partially met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with one meaningful sentence and a tag. It is front-loaded and contains no fluff, making it quick to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is incomplete for a 0-parameter tool with no output schema. It fails to clarify what 'services' means, whether it includes all provider types, or how this tool relates to sibling listing tools. A complete description should at least state that it lists all providers in one call, serving as a combined endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema fully covers parameter semantics (100% coverage). The description need not explain parameters; a baseline of 4 is appropriate for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Comprehensive response with services and voices in one payload' lacks a clear verb and does not explicitly state that the tool lists all providers. The tag 'Providers' hints at the resource, but the purpose is vague and could apply to several sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidance is provided. The description does not mention when to use this tool versus alternatives like listLLMProviders or listVoices, nor does it provide any exclusions or preferred contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listBulkCallLinesARead-onlyInspect
Per-contact results for a campaign: what happened on each call, the variables you sent with that contact, and a pointer to the recording.
Paging
There is one rule. Call it with no cursor, then keep passing back the
next_cursor you were handed until it comes back null.
cursor = None
while True:
page = GET /lines?pagesize=150&cursor={cursor}
handle(page["records"])
cursor = page["next_cursor"]
if not cursor: breakEach call returns a page of rows, oldest first: pagesize goes up to
150 and defaults to 30. Cursors are opaque, so pass back the string you
were given and never build one. No contact is skipped or returned
twice, even while the campaign is still dialing.
Transcripts are not in the row
Each row carries call.recording_id, not the conversation. Transcripts
reach 212 KB, so carrying them here would make one page tens of
megabytes. Fetch the one you want from
GET /calls/logs/{recording_id}.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | The `next_cursor` from your previous response. Omit it on the first request. Opaque: pass it back unchanged. | |
| search | No | An exact phone number, matched against the contact's number and the number that called it. Not a substring search. | |
| pagesize | No | Rows per page. Above 150 the request is refused. | |
| call_status | No | Return only contacts in this state. | |
| bulk_call_id | Yes | Id of the bulk call campaign. | |
| include_total | No | Add `total_records` to the response. It costs a count over the whole filtered campaign, so it is off unless you ask. Ask for it once to fill a header, not on every page of a walk. | |
| interaction_status | No | Return only contacts with this interaction outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only state readOnlyHint and openWorldHint, so the description carries the behavioral disclosure burden and succeeds. It explains the cursor contract, oldest-first ordering, exactly-once paging guarantees, why transcripts are not embedded, and where to fetch them. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the rest is organized under clear Paging and Transcripts sections. The content is valuable, though some details repeat schema descriptions and the code block could be considered slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter paginated tool with no output schema, this description is complete: it covers the response shape, paging state machine, ordering, duplicate guarantees, and transcript retrieval beyond the endpoint. An agent has enough context to call and walk the endpoint correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description usefully reinforces cursor and pagesize behavior, but it does not add meaningful new semantics for search, call_status, interaction_status, bulk_call_id, or include_total beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific and informative definition: per-contact results for a campaign, covering what happened on each call, variables sent with the contact, and a pointer to the recording. This clearly identifies the resource and distinguishes it from bulk-call-level or number-list-level sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete usage context: this is the tool for per-contact campaign results, and it gives a complete paging loop plus an explicit pointer to a separate endpoint for transcripts. It does not name sibling tools or state exclusions, so it falls just short of full alternative-based guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listBulkCallNumbersARead-onlyInspect
The campaign's number pool, and which number is dialing right now.
calls_this_cycle is what fixed_count rotation compares against, so
it is the field to watch for the next rotation. calls_dispatched is
the number's lifetime total across every cycle.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral details beyond that: it returns the current dialing number and explains the semantics of calls_this_cycle vs calls_dispatched. This helps an agent understand the live/stateful nature of the read operation and what the lifetime vs cycle counters mean.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core description is front-loaded and compact, with the main purpose stated first and field semantics following in two concise sentences. The trailing '(Tags: Bulk calls)' is minor noise but does not significantly hurt clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description does enough by explaining the main return concepts (number pool, current dialing number, calls_this_cycle, calls_dispatched) and their operational meaning. It could be slightly more explicit about the full response shape, but for a simple one-parameter read-only tool this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, bulk_call_id, is fully described in the schema ('Id of the bulk call campaign'), giving 100% schema description coverage. The description adds no additional parameter-specific detail, but none is needed given high coverage and a single simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as the campaign's number pool and adds the distinctive live element of which number is dialing now. It is distinguishable from general tools like listPhoneNumbers and searchPhoneNumbers, though it doesn't explicitly say 'list' or name a sibling to differentiate from. The annotation title 'List campaign number pool' reinforces the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is useful by saying calls_this_cycle is the field to watch for the next rotation, giving practical guidance for interpreting results. However, it does not explicitly state when to use this tool over alternatives like listBulkCallLines or getBulkCallLiveStatus, nor does it mention exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listCallLogsCRead-onlyInspect
Retrieve call logs with pagination and optional filtering. (Tags: Calls)
| Name | Required | Description | Default |
|---|---|---|---|
| pageno | No | Page number for pagination. | |
| agentid | No | Filter by agent ID. | |
| pagesize | No | Number of items per page. | |
| call_status | No | Filter by call outcome. | |
| bulk_call_id | No | Filter by bulk-call campaign ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the agent knows this is a safe read operation. The description adds no behavioral context beyond annotations—it only restates the schema's filtering capability without disclosing return format, permissions, or other runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that clearly states the action and scope. The parenthetical '(Tags: Calls)' is minor noise but does not detract significantly. Overall, it is concise and structured for quick readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with well-documented optional parameters and read-only annotations, the description is minimally adequate. However, it does not describe the return value or any sorting/default behavior, and with no output schema, the agent must assume the response contains a list of call logs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter already has a clear meaning. The description mentions 'pagination and optional filtering' at a high level, which aligns with the schema but adds no per-parameter details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Retrieve' and resource 'call logs', indicating a listing operation. It mentions pagination and filtering, which clearly distinguishes it from getCallLog (retrieving a single log). However, it doesn't explicitly name siblings, so it's clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like getCallLog. The mention of pagination implies use for listing multiple records, but there is no explicit when-to-use or when-not-to-use statement, nor any mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listClonedVoicesARead-onlyInspect
Your cloned voices, oldest first, one cursor page at a time. Call it with
no cursor, then pass back the next_cursor you were handed until it is
null.
Once a voice is ready, its voice_id is the provider voice id to put
in an agent's voice.voice_id with voice.provider: cartesia.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page. Above 100 the request is refused. | |
| cursor | No | The `next_cursor` from your previous response. Omit it on the first request. Opaque: pass it back unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, openWorldHint=false), so the bar is lower. The description still adds real context: deterministic oldest-first ordering, cursor-loop pagination semantics, and a state gate (only ready voices have a usable voice_id).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The ordering and pagination rule come first, which is the right priority, and the whole thing is three short sentences. The trailing '(Tags: Voice cloning)' is filler that earns nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so adequately by naming next_cursor and the ready/voice_id fields. An agent has enough to page correctly and to consume results, though the full voice object shape is never sketched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented with defaults, max, and opaque-cursor notes. The description restates the cursor contract but adds no new syntax or constraints beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (cloned voices) and result ordering (oldest first), which cleanly separates it from listVoices and getClonedVoice. It never uses an explicit verb like "list," but the phrasing leaves no ambiguity about what is returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete call procedure (call with no cursor, then loop on next_cursor until null) and explains the downstream action once a voice is ready (use voice_id with provider cartesia). It does not, however, say when to prefer this over listVoices or getClonedVoice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listIntegrationsARead-onlyInspect
List the integrations connected to your workspace, with each one's id and integration_type. Stored credentials (tokens, secrets, passwords, API keys, and the values of a custom API's headers and parameters) are never returned: they read ********. When you create an integration, send the real values: ******** is refused. Accounts that sign in with OAuth (Google Sheets, Slack, HubSpot, Salesforce, Zoho Bigin) are connected in the dashboard.
(Tags: Integrations)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing that credentials (tokens, secrets, passwords, API keys, custom API header/param values) are masked as `********`, that `********` is rejected on create, and that certain OAuth providers are dashboard-managed. This is exactly the behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then adds masking and creation caveats. The sentence about 'when you create an integration' is slightly tangential to a list operation, but it clarifies the meaning of the masked value, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it names the returned fields and the masking format. For a zero-parameter read tool, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. There is nothing to document, and the description appropriately focuses on output behavior instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the integrations connected to your workspace') and specifies the returned fields (`id` and `integration_type`). It is clearly distinguishable from the many sibling list* tools (listAgents, listWorkflows, listVoices) since it names the exact resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: stored credentials are never returned on this read, real values must be sent when creating an integration, and OAuth-based providers are connected via the dashboard rather than here. It does not name a specific sibling alternative, but the conditions for use are well stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listKnowledgeBaseFilesARead-onlyInspect
List all knowledge-base files for the authenticated user. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the agent knows it is a safe read operation. The description adds the authentication scope, which is useful but minimal. It does not mention pagination, result format, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded, no wasted words. The tag adds minor context but does not detract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool, the description covers the essentials. It lacks output schema details, but that is not necessarily required given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters and the schema is empty, so the description carries no burden. Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('List') with a resource ('knowledge-base files') and scope ('for the authenticated user'). It distinguishes from siblings like upload/delete/attach by its listing nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. While it is the listing counterpart to upload/attach/delete, there is no explicit context or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listLLMProvidersARead-onlyInspect
Retrieve all available Large Language Model providers. (Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds no significant behavioral details beyond restating the scope. The phrase 'all available' is consistent with openWorldHint=false but doesn't provide new information. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence is concise and front-loaded, but the 'Tags: Providers' suffix is unnecessary fluff. Overall, the description is efficient but not perfectly waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and no output schema, the description is sufficient. It clearly states what the tool returns (all available LLM providers) and the annotations cover safety and world-openness. No additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description doesn't need to add parameter details since there are none, and the schema is trivially covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieve' and the resource 'all available Large Language Model providers,' making the tool's purpose unambiguous. It also differentiates from sibling tools like listSTTProviders and listTTSProviders by explicitly focusing on LLM providers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when LLM providers are needed, and the name reinforces this. However, it doesn't explicitly compare against alternatives like listAllProviders or mention when not to use it. This is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listPhoneNumbersARead-onlyInspect
Retrieve the phone numbers on your account, whether you bought them from the OmniDimension number shop or imported your own.
(Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| pageno | No | Page number for pagination. | |
| pagesize | No | Items per page (max 150). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only, account-scoped nature is covered. The description adds useful context about the two sources of numbers (shop-bought and imported), but does not disclose additional behavior such as pagination behavior, ordering, or output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main sentence is concise, front-loaded, and packs meaningful scope information into one clause. The parenthetical '(Tags: Phone numbers)' adds minimal value, but the description overall is tight and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple paginated list tool with two optional, well-documented parameters and a readOnlyHint, the description is mostly complete. It does not describe return format, but the absence of an output schema and the simplicity of the operation make this a minor gap rather than a critical one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both pageno and pagesize fully described in the input schema. The tool description adds no parameter-specific information, but the schema already carries that burden, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Retrieve') and resource ('the phone numbers on your account'), and explicitly includes both purchased and imported numbers. This makes the tool's purpose immediately distinguishable from related siblings like purchasePhoneNumber, importTwilioNumber, and searchPhoneNumbers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the account-wide listing tool for phone numbers, but it does not explicitly say when to prefer it over searchPhoneNumbers or when not to use it. There is no mention of alternatives or exclusions, leaving usage context partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listPostCallActionsBRead-onlyInspect
List every post-call action on the agent, each with its own id.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds one useful behavioral detail — that each action carries an `id`, hinting at how update/delete siblings are targeted — but says nothing about pagination, ordering, or what an agent-less agent_id returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short front-loaded sentence that carries the essential scope and return shape; the trailing '(Tags: Agents)' is metadata noise rather than content, but the body itself wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full schema coverage, annotations carrying the safety profile, and no output schema, the definition covers what an agent needs. Only the return format (whether actions include trigger config, ordering) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single required parameter and 100% schema description coverage, the schema already documents agent_id fully. The description's phrase 'on the agent' only restates that scoping without adding format or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (post-call actions) scoped to the agent, and notes each entry carries its own `id`. The verb naturally separates it from the add/update/delete siblings, though the description never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the sibling tools (addPostCallAction, updatePostCallAction, deletePostCallAction) that an agent would need to choose between. The text only asserts what the tool returns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listSTTProvidersBRead-onlyInspect
Retrieve all Speech-to-Text providers. (Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral context beyond the annotations. It says 'Retrieve all' which restates the readOnlyHint. There is no mention of response format, pagination, rate limits, or what the 'all' list contains. The openWorldHint=false is not explained. Given annotations already declare read-only, the description contributes little.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main action in the first sentence. The parenthetical tag '(Tags: Providers)' is arguably unnecessary but does not distract. It is appropriately sized for a trivial tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple no-parameter read-only list, the description is minimally adequate. However, it does not indicate the shape of the response (e.g., array of provider objects with ids/names) or any behavior like sorting or empty results. With no output schema, this information would be helpful. But given the simplicity, a score of 3 is reasonable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, there is nothing for the description to clarify. The schema is trivially complete (100% coverage). The description adds no parameter info but none is needed. Baseline is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Retrieve' and clearly identifies the resource as 'Speech-to-Text providers', distinguishing it from sibling tools like listLLMProviders and listTTSProviders. The meaning is unambiguous, though it does not mention alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage context or alternatives are provided. The description simply states what it does with no guidance on when to prefer this over listAllProviders or other provider lists. For a tool with no parameters, there is also no mention of prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listTTSProvidersARead-onlyInspect
Retrieve all Text-to-Speech providers. (Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds the 'all' scope. However, it does not disclose possible behavioral traits like pagination, response shape, or whether only active providers are returned. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the purpose clearly. The 'Tags: Providers' suffix is minor and does not detract from conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with strong annotations and no output schema, the description sufficiently conveys what is retrieved. No critical information is missing for basic selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema coverage, the description has no additional parameter semantics to convey. The baseline of 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and a clear resource ('all Text-to-Speech providers'). It distinguishes from sibling tools like listLLMProviders and listSTTProviders by explicitly naming the TTS domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when TTS providers are needed, but it provides no explicit when-to-use guidance or alternatives. It does not mention that listAllProviders exists for a combined provider view, so differentiation is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listVoicesARead-onlyInspect
Retrieve voices with filtering and pagination support. ElevenLabs and Cartesia support advanced filtering by name, language, accent, and gender. Other providers support basic pagination only.
(Tags: Providers)
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| accent | No | Accent label (e.g. `american`, `british`). ElevenLabs and Cartesia. | |
| gender | No | Filter voices by gender. ElevenLabs and Cartesia. | |
| search | No | Substring match against voice name or description. ElevenLabs and Cartesia. | |
| language | No | ISO language code (e.g. `en`, `hi`, `es`). ElevenLabs and Cartesia. | |
| provider | No | TTS provider to list voices from. Omit to list across all providers. | |
| page_size | No | Voices per page. Capped at 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description adds a genuinely non-obvious behavioral trait: filtering support is provider-conditional, and non-ElevenLabs/Cartesia providers degrade to pagination-only. It omits whether unsupported filters are silently ignored or error out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the capability and then the provider-conditional caveat; nothing is redundant. The trailing "(Tags: Providers)" is low-value noise but minor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-required-argument list tool with no output schema and annotations covering safety, the description supplies the one thing structured fields cannot: provider-dependent filtering behavior. The only real gap is the outcome when a filter is passed to an unsupported provider.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema with types, enums, defaults, and provider notes. The description's mention of name/language/accent/gender filters merely restates that coverage and adds no syntax or semantics beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Retrieve") and resource ("voices") and pairs it with the filtering/pagination scope, which distinguishes it from getVoice (single) and listClonedVoices (cloned subset). It stops short of naming those siblings explicitly, so the differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful context that advanced name/language/accent/gender filtering only applies to ElevenLabs and Cartesia while other providers support pagination only, effectively telling the agent when a filter will have an effect. However, it never says when to pick this over getVoice or listClonedVoices, so alternative selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listWorkflowFieldOptionsARead-onlyInspect
The choices for one ref field of a node type, such as the phone numbers, agents or integrations in your account. Call it for every ref field and never guess an id. If it returns 400 no_options, the field is not chosen from a list, so ask the user for the value.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | A field name from `getWorkflowNodeType`. | |
| depends | No | The value of the field this one depends on (`depends_on` in the node type), such as the chosen phone number id. | |
| node_type | Yes | A node type from `listWorkflowNodeTypes`, such as `whatsapp`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only and closed-world. Description adds the `400 no_options` error case and instructs to ask the user, which is useful error-handling behavior not in annotations. However, it doesn't describe return format beyond 'choices'. With annotations covering safety, this adds moderate value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a tag. Front-loads the purpose and immediately follows with usage and error guidance. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with full schema coverage and read-only annotations, the description covers purpose, usage, and error handling. It does not describe output format, but with no output schema and a straightforward list return, this is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions are 100% coverage, so the baseline is 3. Description hints that the field is a '`ref` field' and that `depends` relates to a dependency, but adds no syntax or format details beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States it returns 'choices for one `ref` field of a node type' and gives examples (phone numbers, agents, integrations). This distinguishes it from `listWorkflowNodeTypes` and `getWorkflowNodeType`, which deal with node types rather than field options. Clear and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells when to use ('for every `ref` field', 'never guess an id') and when not to ('400 no_options' means ask the user). Provides explicit error-handling guidance and a fallback behavior. No other tool alternatives are named, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listWorkflowNodeTypesARead-onlyInspect
Search the node types a workflow can use, such as whatsapp, voice_ai or conditional. Call it first when you do not know which node to add. Then call getWorkflowNodeType for the settings of one type.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Words to match against the type, label and description, such as `whatsapp`. | |
| category | No | Only types in this category. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the discovery-then-detail sequencing, but says nothing about pagination, result size, or whether the listing is exhaustive or filtered server-side — behavior an agent would want for a search endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that front-load the purpose and then the routing advice, with a parenthetical tag that costs nothing. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only list tool with fully documented params and no output schema, the description covers the essential decision (use this before `getWorkflowNodeType`). The only minor gap is the shape of the returned node-type list, which matters somewhat since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema (including the full category enum), so the schema does the heavy lifting. The description's example terms overlap with the `q` parameter description but add no new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search/list) and resource (node types a workflow can use), with concrete examples (`whatsapp`, `voice_ai`, `conditional`) that make the resource unambiguous. It also implicitly distinguishes itself from the sibling `getWorkflowNodeType`, which is named for the per-type lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool in a workflow: call it first when you do not know which node to add, then call `getWorkflowNodeType` for the settings of a single type. This is a clear when-to-use plus a named follow-up alternative, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listWorkflowsARead-onlyInspect
Your workflows, oldest first, one cursor page at a time. Use it to find a workflow id. Pass back next_cursor until it is null.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page. | |
| cursor | No | The `next_cursor` from the previous page. Omit it on the first request. Pass it back unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral detail beyond them: result ordering is oldest-first and the caller must keep passing next_cursor until it is null, which tells the agent exactly how to drain the result set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus a tag; the scoping fact (oldest first, paginated) leads and the terminal condition follows. Nothing is padded and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated list tool with no output schema and full annotation coverage, the description supplies what an agent actually needs: ordering, page-slicing, and the loop termination condition. It stops short of hinting at what a workflow record contains, which is a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both limit and cursor already documented, so the baseline is 3. The description reinforces the cursor loop ('pass back next_cursor until it is null') but adds no syntax, bounds, or default information the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (your workflows) plus its ordering (oldest first) and pagination model, which is enough to separate it from getWorkflow, createWorkflow, and the node-type listers. It never uses an explicit verb like 'list', but 'one cursor page at a time' plus the plural resource makes the read-listing intent unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to find a workflow id' gives a concrete reason to call it, which is more than most siblings. However, no alternative is named (e.g. getWorkflow for a single known id) and there are no conditions for when not to use it, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publishWorkflowADestructiveInspect
Make the draft the live version. Real events then run it, unless the workflow is paused. Run validateWorkflow first: publish is refused while the draft has errors. Ask the user before you publish.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the write/destructive nature is known. The description adds real value beyond that: a hard refusal condition (draft validation errors), the operational consequence (real events then run it), the pause caveat, and an explicit user-confirmation requirement. It does not say what happens to the previously live version, which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences with no filler: the action first, then consequences, then the prerequisite, then the confirmation policy. Every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description could state what a successful publish returns or how to confirm it, and it is silent on the fate of the prior live version. Otherwise, for a one-parameter mutation with strong annotations, the prerequisite, error, and confirmation context make it adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter (workflow_id) already documented in the schema. The description adds no syntax, format, or sourcing guidance for that parameter, so it sits at the baseline for a well-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: making the draft the live version of a workflow. It is clear enough to distinguish from validateWorkflow (which it names as a prerequisite), but it never differentiates itself from the sibling activateWorkflow/deactivateWorkflow tools, which an agent could easily confuse with publishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage conditions: run `validateWorkflow` first, publish is refused while the draft has errors, and ask the user before publishing. It also notes that real events run the workflow unless paused. It stops short of stating when *not* to use this tool or how it relates to activateWorkflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
purchasePhoneNumberADestructiveInspect
Buy a phone number from the OmniDimension number shop. The monthly rental comes out of your wallet and the number is added to your account, ready to attach to an agent.
(Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| Idempotency-Key | No | Your own unique key for this purchase, for example a fresh UUID. Strongly recommended: it is what makes a retry safe. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint/openWorldHint/non-readOnly, so the bar is lower. The description still adds real value by disclosing the business consequence: a recurring monthly rental charged from the wallet and the number becoming attached to the account. It omits retry/idempotency behavior, which is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences front-load the action and then the cost/effect; nothing is redundant. The appended '(Tags: Phone numbers)' is a minor artifact rather than useful prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully covers the outcome (number added, wallet debited) and the follow-on action (attach to an agent). What is missing is the explicit prerequisite of searching first and any note on idempotent retries, though the latter is carried by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; region, carrier (including the 409 carrier_required case) and Idempotency-Key are all documented in the schema. The description adds no further parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Buy') and resource ('a phone number') plus the source ('OmniDimension number shop'), which separates it from importTwilioNumber/importExotelNumber and searchPhoneNumbers. It stops short of explicitly naming those siblings as the ones it is not, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'ready to attach to an agent' hints at the sequence relative to attachPhoneNumber, and the schema's carrier note implies a prior search call, but the description never states the prerequisite (searchPhoneNumbers first) or when to prefer this over importing a number. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
regenerateClonedVoiceSampleBInspect
Regenerate the sample audio for a ready voice.
(Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Id of the cloned voice. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false with destructiveHint=false, so the agent knows this is a non-destructive mutation. The description adds the 'ready'-state precondition, which is real context beyond the annotations, but it says nothing about whether the old sample is overwritten, whether regeneration is async/long-running, or any cost/rate implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the action and the constraint; no filler. The trailing '(Tags: Voice cloning)' is catalog metadata rather than agent-relevant content, which slightly dilutes an otherwise tight statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema mutation with annotations present, this is close to adequate. It still leaves open whether the call is synchronous and what the agent should do if the voice is not in 'ready' state, which matters for a regenerate operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (voice_id) and schema description coverage is 100%, so the schema already carries the semantics. The description's 'ready' qualifier hints at a valid-state constraint on voice_id but adds no format or ID-sourcing detail beyond the schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource: 'Regenerate the sample audio for a `ready` voice' tells the agent exactly what changes. It implicitly distinguishes itself from getClonedVoiceSample (read) and updateClonedVoice (metadata edit), but never names those siblings, so differentiation relies on the reader's inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifier 'for a `ready` voice' is a genuine precondition that gates usage, which is more than most one-liners offer. However, it gives no when-not guidance and never points to getClonedVoiceSample or updateClonedVoice as adjacent alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
releasePhoneNumberADestructiveInspect
Give up a phone number and stop its rental, so it is not charged at the next renewal. Only a number currently allocated to the account can be released.
(Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, readOnlyHint=false, and openWorldHint=true. The description adds useful behavioral context beyond those flags: releasing the number stops rental charges at the next renewal and is only valid for numbers currently allocated to the account. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences state the action, the consequence, and the precondition with no filler. The tag line is the only extra, and it does not degrade readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive action with destructiveHint already present, the description provides the necessary context: what happens (stop rental), the cost effect (no renewal charge), and the valid condition (allocated number). No output schema is present, and none is needed for this simple release operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents phone_number with 100% coverage, so the baseline is 3. The description adds a meaningful selection constraint on that parameter: only numbers currently allocated to the account are valid inputs. It does not provide format details, but those are not demanded by the schema's simple string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific action ('Give up a phone number and stop its rental') and clarifies the financial consequence, so an agent immediately knows this is the tool for ending a phone number's rental. The precondition 'Only a number currently allocated to the account can be released' distinguishes it from number acquisition/import/detach operations among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is appropriate when a number is currently allocated and should no longer be rented, but it does not explicitly name alternatives (e.g., detachPhoneNumber) or state when not to use this tool. The guidance is contextual but left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renameAgentVersionAInspect
Rename a saved version or edit its note. Version history is immutable otherwise; only the name and note can change. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| requestBody | No | The JSON request body. | |
| version_number | Yes | The version number, as returned in `version_number` from the list or save endpoints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false) and non-destructive behavior (destructiveHint=false). The description adds valuable context that version history is otherwise immutable, clarifying that only name and note can change. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the action and then add essential context about immutability. No filler or redundancy; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename/edit operation with three well-documented parameters and no output schema, the description is complete. It explains the scope of changes and the immutable context. Could optionally note the return behavior, but not necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description does not add additional semantic guidance beyond what the schema already provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool renames or edits the note of a saved version, which is a specific action on a clear resource. It distinguishes from sibling version tools (list, create, delete, diff, restore) by focusing solely on metadata changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that version history is immutable except for name and note, implying that this tool is the only way to modify metadata. However, it does not explicitly contrast with siblings like createAgentVersion or restoreAgentVersion, nor state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restoreAgentVersionADestructiveInspect
Restore a version onto the live agent. Your current setup is saved first as a backup version, so restoring is undoable. Configuration is brought back; any knowledge files or integrations that were deleted since this version was saved can't be re-linked, and are reported in skipped.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| requestBody | No | The JSON request body. | |
| version_number | Yes | The version number, as returned in `version_number` from the list or save endpoints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantial value: it discloses that the current setup is auto-backed-up first so the operation is effectively reversible, and that deleted knowledge files/integrations cannot be re-linked and are surfaced in `skipped`. This meaningfully qualifies the destructive hint. It does not cover auth/permission requirements or rate limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that lead with the action and undoability, then the partial-failure caveat. Every sentence earns its place; only the trailing '(Tags: Agents)' is minor noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 100% schema coverage, the description correctly carries the behavioral burden, including the `skipped` output field for partial re-linking failures. Reversibility and side-effect semantics are covered, though permission or rollback-scope details are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so agent_id and version_number are fully documented in the schema. The description adds no parameter-level meaning (e.g., version number format or requestBody purpose), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Restore a version onto the live agent') with clear scope, distinguishing it from siblings like createAgentVersion, listAgentVersions, renameAgentVersion, and diffAgentVersion. An agent can identify this as the rollback operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the context (rolling back to a saved version) and notes that it is undoable, giving clear signals for when to use it. However, it does not explicitly name alternatives or exclusions (e.g., 'to inspect differences, use diffAgentVersion instead'), so routing depends on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retryBulkCallADestructiveInspect
Re-queue contacts that did not connect, without creating a new campaign.
Use it after a campaign finishes with more no-answers than you expected, or when the reason was on your side (a bad window, a number that was having a bad day). Retried contacts keep their original variables.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | No | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false. The description adds genuine context that retried contacts keep their original variables and no new campaign is created, which softens the destructive picture. It does not disclose side effects such as duplicate calls, rate limits, or whether previously-connected contacts could be re-dialed, which matters for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, with the outcome first and usage contexts after. Efficient, though the parenthetical aside on bad numbers/windows is slightly informal and the tag at the end is low value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive mutation with no output schema: the description says original variables are preserved and no new campaign is created, which is useful, but leaves out what the response contains, what happens with already-connected contacts, and any preconditions like campaign status. Adequate but incomplete for a destructive bulk operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so retry_strategy and failure_reasons are fully documented in the schema. The description adds no parameter-level detail, but baseline 3 is appropriate since schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb (re-queue) and resource (contacts that did not connect) are stated, plus the key constraint that no new campaign is created. Together with the sibling set containing cancelBulkCall, getBulkCall, and startBulkCall, this clearly distinguishes the retry operation without schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear use contexts: after a campaign finishes with more no-answers than expected, or when the failure was on your side (bad window, number issue). No explicit exclusions or named alternatives are given, keeping it at a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchPhoneNumbersARead-onlyInspect
Search the OmniDimension number shop for phone numbers available to buy
in a region. Price and validity are flat per region, so every result
shows the same monthly_rental_usd and validity_days, and that is the
exact amount a purchase will charge.
A region can have more than one carrier, each stocking different
number series. Pass the carrier you want; the response names the
carrier its results came from, and that is the carrier a purchase has
to pass.
(Tags: Phone numbers)
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page of results to return. | |
| limit | No | Results per page. | |
| region | Yes | Region to search in. `IN` and `US` both serve numbers. Which regions answer is configuration, so a region with no carrier enabled returns `404 not_available` rather than an empty list. | |
| carrier | No | Which carrier's stock to search: carriers in a region do not sell the same numbers. Required where a region has more than one carrier; omitting it there returns `409 carrier_required` naming the region's carriers and what each one stocks. | |
| pattern | No | Digits or prefix to match within the number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false. The description adds genuine behavioral context beyond that: pricing and validity are flat per region, results carry monthly_rental_usd/validity_days, and the carrier in the response is the one a purchase must reuse. It does not cover pagination behavior or result ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded paragraphs: purpose first, then pricing behavior, then the carrier constraint. The parenthetical '(Tags: Phone numbers)' is dead weight, but the rest earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully names the key return fields (monthly_rental_usd, validity_days) and the carrier attribution. Error conditions (404 not_available, 409 carrier_required) live in the schema rather than the description, so the picture is complete when read together, though the description alone does not surface them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: why carrier matters (carriers stock different number series) and why the returned carrier must be reused at purchase time. It adds no extra detail on pattern or pagination, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: searching the number shop for numbers 'available to buy in a region'. The purchase-oriented framing implicitly separates it from the sibling listPhoneNumbers (owned numbers), but no sibling is named explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear conditional rule for the carrier parameter ('Pass the carrier you want' where a region has multiple carriers) and ties the search to a downstream purchase by stating the purchase must pass the carrier the results came from. It never names an alternative tool or an explicit when-not-to-use, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setBulkCallConcurrencyAInspect
Change how many calls the campaign places at once, including while it is running. Raise it to finish sooner, lower it if your team cannot keep up with transfers or your numbers are being answered less.
The ceiling is your account's concurrency limit.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-destructive mutation. The description adds behavioral context beyond that: the change can be applied to a running campaign, and the effective ceiling is the account's concurrency limit. This helps an agent understand the impact without over-promising specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the primary action, and every sentence contributes: purpose, runtime applicability, operational tradeoffs, and the account limit constraint. There is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter setter, the description covers the core behavior, valid timing, value-selection guidance, and the limiting constraint. It does not describe the response shape, but no output schema exists and a straightforward mutation like this can reasonably omit that detail. Overall it gives an agent enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the descriptions already define bulk_call_id and concurrent_call_limit. The description adds decision-making semantics for concurrent_call_limit — 'Raise it to finish sooner, lower it if your team cannot keep up' — which helps an agent choose an appropriate value rather than merely passing the field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Change how many calls the campaign places at once' — clearly identifying the bulk-call concurrency setting. This distinguishes it from sibling tools like setBulkCallDailyTimeControl or setBulkCallNumberActive by focusing on the concurrency dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear situational guidance: raise concurrency to finish sooner, lower it if the team cannot keep up or numbers are answered less. It also notes the operation is valid 'while it is running.' It does not explicitly name alternatives or exclusion conditions, but the context is clear enough for an agent to decide when this tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setBulkCallDailyTimeControlAInspect
Restrict a campaign to a daily calling window, in the campaign's timezone. Outside the window the campaign holds rather than finishing, and resumes the next day.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the description carries the burden of explaining what the mutation does. It adds useful nuance: 'holds rather than finishing' and 'resumes the next day.' However, it does not disclose whether it overwrites existing settings or any side effects on in-progress calls, which are relevant for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with high information density. The purpose is front-loaded, and the behavioral consequence is stated immediately. No filler or redundant phrasing. The '(Tags: Bulk calls)' line is minor and does not harm conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full schema coverage and absence of an output schema, the description adequately conveys the tool's purpose and behavioral effect. It could mention that the tool can also disable the daily window (since booleans exist), but this is implicitly covered by the schema. The description is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter is already documented with clear descriptions (e.g., 'Hour of day to stop, 0 to 23. Fractions are allowed'). The tool description adds no additional parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Restrict') and resource ('a campaign') and immediately clarifies the behavioral effect: calls hold outside the window and resume next day. This clearly distinguishes it from other setBulkCall* tools (e.g., concurrency, number active) without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives, such as 'Use this when you need to set calling hours; for concurrency use setBulkCallConcurrency.' The description only explains what it does, not the decision context. Given many sibling tools, this is a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setBulkCallNumberActiveAInspect
Stop or resume dialing from one number in the pool.
Pausing is what you want when a number starts going bad mid-campaign: dialing moves to the next number in sequence and the paused number keeps its history and counters. The last active number of a running campaign cannot be paused, since the campaign would have nothing to dial from.
Send the state you want rather than a toggle, so retrying the same request is harmless.
assignment_id is the number's id within this campaign's pool, from
List rotation pool. It is not the phone_number_id.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. | |
| assignment_id | Yes | The `assignment_id` from List rotation pool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses key side effects beyond the annotations: dialing moves to the next number, the paused number keeps history and counters, the last active number cannot be paused, and setting the desired state makes retries harmless. These details explain both the operational impact and the idempotency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and every paragraph earns its place: usage guidance, behavioral effects, a constraint, idempotency semantics, and a parameter disambiguation. It is detailed but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with three required parameters, full schema coverage, and no output schema, the description provides enough context to invoke it correctly. It covers when to pause, when pausing is not allowed, the exact meaning of the ambiguous parameter, and the idempotent behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds crucial extra meaning for assignment_id, clarifying that it is the number's id within the campaign's pool and explicitly distinguishing it from phone_number_id. This is real semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Stop or resume dialing from one number in the pool.' It clearly identifies the tool's scope at the per-number level, distinguishing it from campaign-level siblings like setBulkCallConcurrency or bulkCallActions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: 'Pausing is what you want when a number starts going bad mid-campaign.' It also states a meaningful exclusion: the last active number of a running campaign cannot be paused. However, it does not explicitly name alternative tools or say when to use one instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
startBulkCallADestructiveInspect
Start a campaign that was created with save_as_draft: true.
Drafts let you build a campaign over several requests: create it, add contacts in batches, set the number pool, set concurrency, then start when everything is in place. A campaign that is already running, scheduled, or finished cannot be started.
(Tags: Bulk calls)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | No | The JSON request body. | |
| bulk_call_id | Yes | Id of the bulk call campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is known. The description usefully adds the state-machine precondition (drafts only; running/scheduled/finished are rejected), but does not explain the real-world consequence of starting — outbound dialing, balance consumption, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with the actionable sentence, then the draft lifecycle rationale, then the constraint. The '(Tags: Bulk calls)' footer is disposable, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers what to call it on and when it will be refused. The main remaining gap is what 'start' actually triggers (calls placed, spend incurred), which matters given destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so bulk_call_id is documented in the schema; the description only alludes to the campaign it identifies. The empty requestBody property is neither explained nor clarified by the description, so nothing is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Start') and resource ('a campaign that was created with save_as_draft: true'), making the draft-only scope explicit. It implicitly separates this from createBulkCall/cancelBulkCall/retryBulkCall siblings, but never names or contrasts with them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes the intended workflow (create draft, add contacts in batches, set number pool and concurrency, then start) and gives a clear negative condition: a campaign already running, scheduled, or finished cannot be started. It stops short of pointing to alternative tools for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testWorkflowADestructiveInspect
Runs the draft once with payload as the trigger data. Every node runs for real: WhatsApp messages, SMS, emails and calls go out and CRM records change. Ask the user before calling it, and use their own phone number or email in the payload.
It returns an execution_id at once. Poll getWorkflowExecution for the result.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | No | The JSON request body. | |
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true and openWorldHint=true, and the description concretizes exactly what that means: real WhatsApp/SMS/email/call sends and CRM record mutation. It also adds consent requirements and the async contract (immediate execution_id, poll for result), which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and consequence in the first sentence, then the return/polling contract. Every sentence earns its place; only the trailing '(Tags: Workflows)' boilerplate is dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully explains the return shape (execution_id returned immediately) and the follow-up call needed to get results. Between the description, annotations, and schema, an agent has everything needed to call this correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline. The description adds meaning beyond the schema by clarifying that payload is the trigger data feeding node context and by constraining the values the user should put in it (their own phone number or email).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Runs the draft once with payload as the trigger data') and scopes it to a single execution of the draft workflow. It is clearly distinguishable from siblings like validateWorkflow, publishWorkflow, or activateWorkflow because it says the run is real, not a check or a state change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition ('Ask the user before calling it') and a payload constraint ('use their own phone number or email'), plus routes polling to getWorkflowExecution. It lacks an explicit when-not or a named dry-run alternative (e.g. validateWorkflow), so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateAgentAInspect
Update an existing agent. Send only the fields you want to change.
post_call_actions replaces the agent's email, webhook, Omni CRM, Cloud WhatsApp and workflow actions as one set, but only when you send at least one of those types. Google Sheets, Slack, Salesforce, HubSpot and Zoho Bigin actions are replaced only when their key is sent, and kept otherwise. If a sent action gives a variable key a new prompt, kept actions that use the same key take the new prompt too. To add, change or remove one action without touching the others, use /agents/{agent_id}/post-call-actions.
Voicemail detection is an access-gated feature that we turn on per account. If it isn't enabled for yours yet, request access before configuring the
voicemailobject below. (Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| requestBody | Yes | Agent configuration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare readOnly=false/destructive=false), the description discloses genuinely important behavior: post_call_actions replaces a whole set of action types as a unit, individual integrations are replaced only when their key is sent, and a new prompt on a shared variable key propagates to kept actions. It also flags voicemail detection as access-gated. This is exactly the kind of hidden side-effect detail the schema alone would not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and patch rule, then dense but necessary detail on the tricky post_call_actions behavior. The voicemail access-gate note is somewhat duplicated (it also appears in the schema), a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a heavily nested mutation tool, the description covers the highest-risk behavior (action-set replacement semantics) and the access-gated voicemail caveat. With no output schema it does not describe the return payload, but that is a minor gap for an update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-field semantics the schema does not express (the all-or-nothing replacement grouping of post_call_actions and the shared-variable-key prompt propagation). That elevates it above the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb+resource ('Update an existing agent') and immediately clarifies the patch nature ('Send only the fields you want to change'). This clearly separates it from createAgent/deleteAgent/getAgent siblings, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage rule (send only changed fields) and routes the agent to an alternative endpoint ('/agents/{agent_id}/post-call-actions') for granular single-action edits. That is real when-to-use-this-vs-that guidance, but it lacks broader exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateClonedVoiceCInspect
Change the name, description or gender of a cloned voice. (Tags: Voice cloning)
| Name | Required | Description | Default |
|---|---|---|---|
| voice_id | Yes | Id of the cloned voice. | |
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive mutation, so the description's burden is lighter. However, it adds nothing behavioral beyond that: it does not say whether the update is partial or full replacement (are omitted fields preserved or cleared?), what permissions are needed, or what happens to the voice sample. It essentially restates the schema fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence conveys the operation and its fields with no filler. The trailing '(Tags: Voice cloning)' is metadata clutter that adds no selection value, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations, a fully-described schema, and no output schema, the core information an agent needs to invoke it is present. The gap is the absence of update semantics (partial vs. full) and any error/permission context, leaving it merely adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the nested requestBody fields are already documented in the schema, which sets the baseline at 3. The description lists the same three mutable fields and therefore adds no semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Change') and resource ('cloned voice') and enumerates the mutable fields (name, description, gender), which distinguishes it from deleteClonedVoice/getClonedVoice in the sibling list. It stops short of explicitly routing against any alternative, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g., must the voice exist / be cloned), and no mention of alternatives such as deleteClonedVoice or createClonedVoice. The agent must infer usage purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updatePostCallActionAInspect
Change fields of one post-call action. Fields you don't send keep their value. The type cannot change.
(Tags: Agents)
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The ID of the agent. | |
| action_id | Yes | The ID of the post-call action. | |
| requestBody | Yes | One post-call action. `type` picks the channel; send the fields of that channel plus any of the shared ones. `type` is required when adding an action; an update sends only the fields it changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive, non-open-world operation. The description adds meaningful behavioral context beyond that: unsent fields retain their values, and the `type` field cannot change. It does not cover auth requirements or error behavior, but those are less central for this update operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed immediately by the two most important behavioral constraints. No filler or repetition. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the very rich nested schema and the existing annotations, the description supplies the key update-specific semantics an agent needs. It is slightly thin on routing guidance relative to sibling tools, but the schema fills in parameter details thoroughly. No output schema exists, so return-value explanation is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters in detail. The description adds only a high-level note that fields not sent keep their value and that `type` cannot change, both of which are also present in the schema. Baseline 3 is appropriate when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Change fields of one post-call action.' It also clarifies partial-update semantics and an important immutability constraint on `type`. It does not explicitly name or contrast with sibling tools such as addPostCallAction or deletePostCallAction, so it stops short of perfect sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but gives no explicit when-to-use guidance versus alternatives like addPostCallAction, deletePostCallAction, or listPostCallActions. The partial-update behavior is operational detail, not usage routing. An agent must infer from context that this is for modifying an existing post-call action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uploadKnowledgeBaseFileCInspect
Upload a PDF file. The file content must be Base64 encoded. (Tags: Knowledge base)
| Name | Required | Description | Default |
|---|---|---|---|
| requestBody | Yes | The JSON request body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only behavioral detail added beyond the annotations is the Base64 encoding requirement, which is already present in the schema's parameter description. The description does not disclose what happens on success, whether there are file size limits, if the upload is asynchronous, or what the response contains. Since there is no output schema, this omission is significant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with two direct sentences plus a redundant tag. Every sentence carries some weight, though the tag '(Tags: Knowledge base)' is unnecessary given the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool lacks an output schema, so the description should explain the return format or success indication, but it does not. It also omits reference to canUploadFile, which exists as a sibling and likely serves as a prerequisite. The nested requestBody structure is only clarified in the schema, leaving the agent without enough context for a complete invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both 'file' and 'filename' have descriptive text. The tool description reiterates 'PDF' and 'Base64' but adds no new semantic information beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Upload' and the target resource 'a PDF file', making the tool's purpose unambiguous. It is distinct from sibling tools like listKnowledgeBaseFiles and deleteKnowledgeBaseFile, although it could more explicitly tie it to the knowledge base context beyond the tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as attachKnowledgeBaseFiles or canUploadFile. It does not mention any prerequisites, workflow steps, or exclusions, leaving the agent to infer the intended usage from the name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateWorkflowARead-onlyInspect
Check the draft and list what blocks publish. It changes nothing. Call it after your edits and fix every error before publishWorkflow.
(Tags: Workflows)
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description reinforces this ('It changes nothing') and adds the useful behavioral fact that the return is a list of publish blockers. It doesn't elaborate on partial-failure or draft-state handling, but the annotation bar is low.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then the side-effect guarantee, then the workflow step. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description adequately signals the return (what blocks publish). Combined with read-only annotations and a single fully-documented parameter, an agent has enough to call it correctly; only the relationship to testWorkflow is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so workflow_id is fully documented in the schema. The description adds no parameter-level detail (e.g. whether an unsaved draft id is acceptable), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource: 'Check the draft and list what blocks publish.' It states the scope (draft) and outcome (blocker list), and explicitly routes away from the sibling publishWorkflow. An agent can distinguish it from publishWorkflow without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: call after edits, fix every error before publishWorkflow. That's clear context and names the related alternative. It stops short of covering when not to use it or how it relates to the other workflow-validation-adjacent sibling testWorkflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
39 tool updates
v0.14.0- Added
activateWorkflow - Added
addPostCallAction - Changed
createAgent2 fields changed- added
Input schema / properties / Idempotency-KeyAdded value: +{ + "description": "Your own unique key for this agent, for example a fresh UUID.\nSend the same key when you retry. If the first request already\ncreated the agent, you get that agent back instead of a second\none, so a request that timed out is safe to repeat. The same key\nwith a different request body is refused. Keys are kept for 24\nhours.\n", + "maxLength": 255, + "type": "string" +} - changed
Input schema / properties / requestBody / allOfPrevious value: -[ - { - "description": "Agent configuration.", - "properties": { - "background_track": { - "description": "Ambient background noise that plays under the agent's voice.", - "properties": { - "enabled": { - "description": "Whether to mix the ambient track under the agent's audio.", - "type": "boolean" - }, - "name": { - "description": "Ambient track to mix under the agent.", - "enum": [ - "call_center", - "filler", - "office", - "office_1", - "restaurant" - ], - "type": "string" - }, - "tts_volume_reduction": { - "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "volume": { - "default": 0.2, - "description": "Volume level on a 0–1 scale. Default 0.2.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "call_type": { - "description": "Call type of the assistant.", - "enum": [ - "Incoming", - "Outgoing" - ], - "type": "string" - }, - "context_breakdown": { - "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", - "items": { - "properties": { - "body": { - "description": "Body of the breakdown, the detailed prompt content.", - "example": "This agent helps customers with product inquiries and support issues.", - "type": "string" - }, - "is_enabled": { - "default": true, - "description": "Whether this section is included in the prompt.", - "type": "boolean" - }, - "title": { - "description": "Title of the breakdown.", - "example": "Purpose", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "type": "array" - }, - "dynamic_variables": { - "additionalProperties": { - "type": "string" - }, - "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", - "example": { - "customer_name": "Jane Doe", - "order_id": "ORD-12345" - }, - "type": "object" - }, - "end_call": { - "description": "Hang up automatically when a condition is met.", - "properties": { - "condition": { - "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", - "example": "End the call once the customer's issue is resolved.", - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "message": { - "description": "What the agent says before hanging up.", - "example": "Thank you for contacting us. Have a great day!", - "type": "string" - }, - "message_prompt": { - "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", - "example": "End the call politely in the same language the user is speaking.", - "type": "string" - }, - "message_type": { - "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", - "enum": [ - "static", - "prompt" - ], - "type": "string" - } - }, - "type": "object" - }, - "initial_ringing_sound_enabled": { - "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", - "type": "boolean" - }, - "is_interruption_allowed": { - "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", - "type": "boolean" - }, - "is_welcome_message_dynamic": { - "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", - "type": "boolean" - }, - "is_welcome_message_interruption": { - "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", - "type": "boolean" - }, - "languages": { - "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", - "example": [ - "English (India)", - "Hindi" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "model": { - "description": "Configuration for the language model.", - "properties": { - "model": { - "description": "The language model to use. The current catalog is returned by the LLM providers list.", - "enum": [ - "azure-gpt-4.1-mini", - "azure-gpt-4.1-nano", - "azure-gpt-4o", - "azure-gpt-4o-mini", - "gemini-2.5-flash", - "gemini-2.5-flash-lite", - "gpt-3.5-turbo", - "gpt-4.1-mini", - "gpt-4.1-nano", - "gpt-4o", - "gpt-4o-mini", - "gpt-5.1", - "llama-3.3-70b-versatile" - ], - "example": "gpt-4.1-mini", - "type": "string" - }, - "temperature": { - "description": "Controls randomness in the model's output (0.0 to 1.0).", - "example": 0.7, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "name": { - "description": "Name for the agent.", - "example": "Customer Support Agent", - "type": "string" - }, - "post_call_actions": { - "description": "Side effects that fire once the call ends. Configure email, webhook, or both.", - "properties": { - "email": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the email.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the email body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "recipients": { - "description": "Email addresses that should receive the notification.", - "example": [ - "support@example.com" - ], - "items": { - "format": "email", - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", - "example": [ - "completed", - "voicemail_detected" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "webhook": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the webhook.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the webhook body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", - "example": [ - "completed", - "failed" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - }, - "url": { - "description": "Endpoint that receives a POST with the call payload.", - "example": "https://your-webhook-endpoint.com/omnidim-callback", - "format": "uri", - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "timezone": { - "description": "IANA timezone for this agent, for example `Asia/Kolkata`. Sets the local date and time the agent works with during calls. If not set, the account timezone is used as fallback. Pass an empty string to clear it.", - "example": "America/New_York", - "type": "string" - }, - "transcriber": { - "description": "Configuration for the speech-to-text transcriber.", - "properties": { - "diarize": { - "description": "Identify different speakers in the transcript.", - "type": "boolean" - }, - "first_ideal_message": { - "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", - "type": "string" - }, - "interruption_min_words": { - "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", - "example": 2, - "minimum": 1, - "type": "integer" - }, - "is_first_ideal_message_dynamic": { - "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "is_second_ideal_message_dynamic": { - "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "language": { - "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", - "example": "en-US", - "type": "string" - }, - "max_call_duration_in_sec": { - "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", - "example": 600, - "minimum": 1, - "type": "integer" - }, - "model": { - "description": "The model to use for transcription (required when provider is `deepgram_stream`).", - "enum": [ - "nova-3", - "nova-2" - ], - "example": "nova-3", - "type": "string" - }, - "numerals": { - "description": "Convert numbers from words to digits.", - "type": "boolean" - }, - "provider": { - "description": "The speech-to-text provider to use.", - "enum": [ - "deepgram_stream", - "cartesia", - "sarvam", - "azure_stream", - "soniox" - ], - "example": "deepgram_stream", - "type": "string" - }, - "punctuate": { - "description": "Add punctuation to the transcript.", - "type": "boolean" - }, - "second_ideal_message": { - "description": "Second nudge spoken if silence continues after the first.", - "type": "string" - }, - "should_apply_noise_reduction": { - "description": "Reduce background noise on the inbound audio stream before transcription.", - "type": "boolean" - }, - "silence_timeout_ms": { - "description": "Silence timeout in milliseconds.", - "example": 400, - "type": "integer" - }, - "smart_format": { - "description": "Apply smart formatting to the transcript.", - "type": "boolean" - } - }, - "type": "object" - }, - "transfer": { - "description": "Conditional call transfer to a human agent or another number.", - "properties": { - "enabled": { - "type": "boolean" - }, - "transfer_options": { - "description": "Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them.", - "items": { - "properties": { - "backup_numbers": { - "description": "Fallback numbers tried if the primary is unreachable.", - "items": { - "type": "string" - }, - "type": "array" - }, - "number": { - "description": "Primary phone number to transfer to. Include country code with leading `+`.", - "example": "+15551234567", - "type": "string" - }, - "transfer_condition": { - "description": "Natural-language condition that triggers this transfer option.", - "example": "Transfer if the customer asks to speak with a human.", - "type": "string" - }, - "transfer_message": { - "description": "Message the agent says to the caller before executing the transfer.", - "example": "Please hold while I connect you to one of our agents.", - "type": "string" - }, - "type": { - "default": "static", - "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", - "enum": [ - "static", - "dynamic" - ], - "type": "string" - } - }, - "required": [ - "number", - "transfer_condition", - "transfer_message" - ], - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "voice": { - "dependentRequired": { - "provider": [ - "voice_id" - ] - }, - "description": "Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently.", - "properties": { - "model": { - "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", - "example": "sonic-3.5", - "type": "string" - }, - "provider": { - "description": "The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it.", - "enum": [ - "eleven_labs", - "google", - "cartesia", - "sarvam" - ], - "example": "eleven_labs", - "type": "string" - }, - "speech_speed": { - "default": 1, - "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", - "maximum": 2, - "minimum": 0.5, - "type": "number" - }, - "voice_id": { - "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it.", - "example": "JBFqnCBsd6RMkjVDRZzb", - "type": "string" - } - }, - "type": "object" - }, - "voicemail": { - "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", - "properties": { - "enabled": { - "description": "Detect voicemail and leave your message instead of speaking to a machine.", - "type": "boolean" - }, - "message": { - "description": "Message to leave when voicemail is detected.", - "type": "string" - } - }, - "type": "object" - }, - "web_search": { - "description": "Configuration for web search capabilities.", - "properties": { - "enabled": { - "description": "Enable or disable web search functionality.", - "type": "boolean" - }, - "provider": { - "description": "The search provider to use.", - "enum": [ - "DuckDuckGo" - ], - "example": "DuckDuckGo", - "type": "string" - } - }, - "type": "object" - }, - "welcome_message": { - "description": "Initial message the agent will say when answering a call.", - "example": "Hello! How can I help you today?", - "type": "string" - } - }, - "type": "object" - }, - { - "required": [ - "name", - "welcome_message", - "context_breakdown" - ], - "type": "object" - } -]New value: +[ + { + "description": "Agent configuration.", + "properties": { + "background_track": { + "description": "Ambient background noise that plays under the agent's voice.", + "properties": { + "enabled": { + "description": "Whether to mix the ambient track under the agent's audio.", + "type": "boolean" + }, + "name": { + "description": "Ambient track to mix under the agent.", + "enum": [ + "call_center", + "filler", + "office", + "office_1", + "restaurant" + ], + "type": "string" + }, + "tts_volume_reduction": { + "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "volume": { + "default": 0.2, + "description": "Volume level on a 0–1 scale. Default 0.2.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "call_type": { + "description": "Call type of the assistant.", + "enum": [ + "Incoming", + "Outgoing" + ], + "type": "string" + }, + "context_breakdown": { + "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", + "items": { + "properties": { + "body": { + "description": "Body of the breakdown, the detailed prompt content.", + "example": "This agent helps customers with product inquiries and support issues.", + "type": "string" + }, + "is_enabled": { + "default": true, + "description": "Whether this section is included in the prompt.", + "type": "boolean" + }, + "title": { + "description": "Title of the breakdown.", + "example": "Purpose", + "type": "string" + } + }, + "required": [ + "title", + "body" + ], + "type": "object" + }, + "type": "array" + }, + "dynamic_variables": { + "additionalProperties": { + "type": "string" + }, + "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", + "example": { + "customer_name": "Jane Doe", + "order_id": "ORD-12345" + }, + "type": "object" + }, + "end_call": { + "description": "Hang up automatically when a condition is met.", + "properties": { + "condition": { + "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", + "example": "End the call once the customer's issue is resolved.", + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "message": { + "description": "What the agent says before hanging up.", + "example": "Thank you for contacting us. Have a great day!", + "type": "string" + }, + "message_prompt": { + "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", + "example": "End the call politely in the same language the user is speaking.", + "type": "string" + }, + "message_type": { + "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", + "enum": [ + "static", + "prompt" + ], + "type": "string" + } + }, + "type": "object" + }, + "initial_ringing_sound_enabled": { + "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", + "type": "boolean" + }, + "is_interruption_allowed": { + "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", + "type": "boolean" + }, + "is_welcome_message_dynamic": { + "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", + "type": "boolean" + }, + "is_welcome_message_interruption": { + "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", + "type": "boolean" + }, + "languages": { + "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", + "example": [ + "English (India)", + "Hindi" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "model": { + "description": "Configuration for the language model.", + "properties": { + "model": { + "description": "The language model to use. The current catalog is returned by the LLM providers list.", + "enum": [ + "azure-gpt-4.1-mini", + "azure-gpt-4.1-nano", + "azure-gpt-4o", + "azure-gpt-4o-mini", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gpt-3.5-turbo", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4o", + "gpt-4o-mini", + "gpt-5.1", + "llama-3.3-70b-versatile" + ], + "example": "gpt-4.1-mini", + "type": "string" + }, + "temperature": { + "description": "Controls randomness in the model's output (0.0 to 1.0).", + "example": 0.7, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "name": { + "description": "Name for the agent.", + "example": "Customer Support Agent", + "type": "string" + }, + "post_call_actions": { + "description": "Side effects that fire once the call ends: email, webhook, Omni CRM,\nCloud WhatsApp, a workflow, Google Sheets, Slack, Salesforce, HubSpot\nor Zoho Bigin.\n", + "properties": { + "cloud_whatsapp": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Send a Cloud WhatsApp template message after the call.", + "properties": { + "phone_number_id": { + "description": "The id of your organization's Cloud WhatsApp number the\nmessage is sent from.\n", + "type": "integer" + }, + "template_id": { + "description": "An approved template on that number. A template that is not\napproved, or that belongs to another number, is refused.\n", + "type": "integer" + }, + "template_variables": { + "description": "Which extracted variable fills each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The key of the extracted variable whose value fills this placeholder.", + "example": "customer_name", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "templates": { + "description": "One or more templates to send, each with its variable mapping.", + "items": { + "description": "One Cloud WhatsApp template to send after the call.", + "properties": { + "always_send": { + "description": "Send this template after every call, whichever templates the model chooses.", + "type": "boolean" + }, + "template_id": { + "description": "An approved template on the chosen number.", + "type": "integer" + }, + "usage_description": { + "description": "When this template should be sent. After the call, the model reads\nthese descriptions to choose which templates fit the conversation.\n", + "example": "Send when the caller books an appointment.", + "type": "string" + }, + "variable_mappings": { + "description": "How to fill each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The extracted variable whose value fills this placeholder.", + "type": "string" + }, + "fallback_value": { + "description": "The value to use when the variable is not extracted.", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + }, + "mode": { + "description": "Which input the dashboard shows for this placeholder. It\ndoes not change the value sent: a `static_value` is used\nfirst, then the extracted variable, then `fallback_value`.\n", + "enum": [ + "variable", + "static" + ], + "type": "string" + }, + "static_value": { + "description": "A fixed value for this placeholder. When set, it is used\ninstead of the extracted variable.\n", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "email": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the email.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the email body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "recipients": { + "description": "Email addresses that should receive the notification.", + "example": [ + "support@example.com" + ], + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", + "example": [ + "completed", + "voicemail_detected" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "google_sheets": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Append the call to a Google Sheet. Sending this key replaces the\nagent's Google Sheets actions; leaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Google Sheets integration.", + "type": "integer" + }, + "spreadsheet_id": { + "description": "Required. The id in the sheet's URL, the part after `/d/`.", + "type": "string" + }, + "spreadsheet_name": { + "type": "string" + }, + "worksheet_name": { + "description": "The tab to append to. Defaults to `Sheet1`.", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "hubspot": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a HubSpot record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's HubSpot actions; leaving\nit out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your HubSpot integration.", + "type": "integer" + }, + "object_name": { + "description": "Required.", + "enum": [ + "contact", + "company", + "deal", + "ticket" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "omni_crm": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Save the call to Omni CRM.", + "type": "object" + } + ] + }, + "salesforce": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a Salesforce record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's Salesforce actions;\nleaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Salesforce integration.", + "type": "integer" + }, + "object_name": { + "description": "Defaults to `Lead`.", + "enum": [ + "Lead", + "Contact", + "Account", + "Opportunity", + "Case", + "Task", + "Product" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "slack": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Post the call to a Slack channel. Sending this key replaces the\nagent's Slack actions; leaving it out keeps them.\n", + "properties": { + "channel_id": { + "description": "The channel id. Send this or `channel_name`.", + "type": "string" + }, + "channel_name": { + "description": "The channel name. Send this or `channel_id`.", + "type": "string" + }, + "integration_id": { + "description": "Required. The id of your Slack integration.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "webhook": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the webhook.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the webhook body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", + "example": [ + "completed", + "failed" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + }, + "url": { + "description": "Endpoint that receives a POST with the call payload.", + "example": "https://your-webhook-endpoint.com/omnidim-callback", + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "workflow": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Trigger a workflow after the call.", + "properties": { + "workflow_id": { + "description": "The id of the workflow to run.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "zoho_bigin": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Log the call in Zoho Bigin. Sending this key replaces the\nagent's Zoho Bigin actions; leaving it out keeps them.\n", + "properties": { + "create_call_log": { + "description": "Log the call. Defaults to true.", + "type": "boolean" + }, + "create_contact": { + "description": "Create a contact when no contact matches. Defaults to true.", + "type": "boolean" + }, + "integration_id": { + "description": "Required. The id of your Zoho Bigin integration.", + "type": "integer" + }, + "update_contact": { + "description": "Update a matching contact with what the call captured. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + } + ] + } + }, + "type": "object" + }, + "timezone": { + "description": "IANA timezone for this agent, for example `Asia/Kolkata`. Sets the local date and time the agent works with during calls. If not set, the account timezone is used as fallback. Pass an empty string to clear it.", + "example": "America/New_York", + "type": "string" + }, + "transcriber": { + "description": "Configuration for the speech-to-text transcriber.", + "properties": { + "diarize": { + "description": "Identify different speakers in the transcript.", + "type": "boolean" + }, + "first_ideal_message": { + "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", + "type": "string" + }, + "interruption_min_words": { + "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", + "example": 2, + "minimum": 1, + "type": "integer" + }, + "is_first_ideal_message_dynamic": { + "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "is_second_ideal_message_dynamic": { + "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "language": { + "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", + "example": "en-US", + "type": "string" + }, + "max_call_duration_in_sec": { + "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", + "example": 600, + "minimum": 1, + "type": "integer" + }, + "model": { + "description": "Transcription model for the selected provider. For\n`deepgram_stream` this is `nova-3` or `nova-2`; other\nproviders take their own model identifiers.\n", + "example": "nova-3", + "type": "string" + }, + "numerals": { + "description": "Convert numbers from words to digits.", + "type": "boolean" + }, + "provider": { + "description": "The speech-to-text provider to use.", + "enum": [ + "deepgram_stream", + "cartesia", + "sarvam", + "azure_stream", + "soniox" + ], + "example": "deepgram_stream", + "type": "string" + }, + "punctuate": { + "description": "Add punctuation to the transcript.", + "type": "boolean" + }, + "second_ideal_message": { + "description": "Second nudge spoken if silence continues after the first.", + "type": "string" + }, + "should_apply_noise_reduction": { + "description": "Reduce background noise on the inbound audio stream before transcription.", + "type": "boolean" + }, + "silence_timeout_ms": { + "description": "Silence timeout in milliseconds.", + "example": 400, + "type": "integer" + }, + "smart_format": { + "description": "Apply smart formatting to the transcript.", + "type": "boolean" + } + }, + "type": "object" + }, + "transfer": { + "description": "Conditional call transfer to a human agent or another number.", + "properties": { + "enabled": { + "type": "boolean" + }, + "transfer_options": { + "description": "Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them.", + "items": { + "properties": { + "backup_numbers": { + "description": "Fallback numbers tried if the primary is unreachable.", + "items": { + "type": "string" + }, + "type": "array" + }, + "number": { + "description": "Primary phone number to transfer to. Include country code with leading `+`.", + "example": "+15551234567", + "type": "string" + }, + "transfer_condition": { + "description": "Natural-language condition that triggers this transfer option.", + "example": "Transfer if the customer asks to speak with a human.", + "type": "string" + }, + "transfer_message": { + "description": "Message the agent says to the caller before executing the transfer.", + "example": "Please hold while I connect you to one of our agents.", + "type": "string" + }, + "type": { + "default": "static", + "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", + "enum": [ + "static", + "dynamic" + ], + "type": "string" + } + }, + "required": [ + "number", + "transfer_condition", + "transfer_message" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "voice": { + "dependentRequired": { + "provider": [ + "voice_id" + ] + }, + "description": "Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently.", + "properties": { + "provider": { + "description": "The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it.", + "enum": [ + "eleven_labs", + "google", + "cartesia", + "sarvam" + ], + "example": "eleven_labs", + "type": "string" + }, + "speech_speed": { + "default": 1, + "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", + "maximum": 2, + "minimum": 0.5, + "type": "number" + }, + "voice_id": { + "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it.", + "example": "JBFqnCBsd6RMkjVDRZzb", + "type": "string" + } + }, + "type": "object" + }, + "voicemail": { + "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", + "properties": { + "enabled": { + "description": "Detect voicemail and leave your message instead of speaking to a machine.", + "type": "boolean" + }, + "message": { + "description": "Message to leave when voicemail is detected.", + "type": "string" + } + }, + "type": "object" + }, + "web_search": { + "description": "Configuration for web search capabilities.", + "properties": { + "enabled": { + "description": "Enable or disable web search functionality.", + "type": "boolean" + }, + "provider": { + "description": "The search provider to use.", + "enum": [ + "DuckDuckGo", + "openAI" + ], + "example": "DuckDuckGo", + "type": "string" + } + }, + "type": "object" + }, + "welcome_message": { + "description": "Initial message the agent will say when answering a call.", + "example": "Hello! How can I help you today?", + "type": "string" + } + }, + "type": "object" + }, + { + "required": [ + "name", + "context_breakdown" + ], + "type": "object" + } +]
- Added
createClonedVoice - Changed
createSession2 fields changed- changed
Input schema / properties / requestBody / properties / custom_variables / descriptionPrevious value: -"Per-session variables that personalize the conversation.\nSet server-side, so visitors cannot tamper with them.\n"New value: +"Per-session variables that personalize the conversation.\nSet server-side, so visitors cannot tamper with them.\nTwo reserved keys are read as instructions for this session\nand never reach the agent: `__languages` and\n`__post_call_actions`.\n" - added
Input schema / properties / requestBody / properties / custom_variables / propertiesAdded value: +{ + "__languages": { + "description": "Languages this session runs in, replacing the agent's\nconfigured list. The first entry is the language the\nvisitor is greeted in. Send an array, or a pipe-separated\nstring such as `Hindi|English`.\n", + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] + }, + "__post_call_actions": { + "allOf": [ + { + "description": "Side effects that fire once the call ends: email, webhook, Omni CRM,\nCloud WhatsApp, a workflow, Google Sheets, Slack, Salesforce, HubSpot\nor Zoho Bigin.\n", + "properties": { + "cloud_whatsapp": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Send a Cloud WhatsApp template message after the call.", + "properties": { + "phone_number_id": { + "description": "The id of your organization's Cloud WhatsApp number the\nmessage is sent from.\n", + "type": "integer" + }, + "template_id": { + "description": "An approved template on that number. A template that is not\napproved, or that belongs to another number, is refused.\n", + "type": "integer" + }, + "template_variables": { + "description": "Which extracted variable fills each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The key of the extracted variable whose value fills this placeholder.", + "example": "customer_name", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "templates": { + "description": "One or more templates to send, each with its variable mapping.", + "items": { + "description": "One Cloud WhatsApp template to send after the call.", + "properties": { + "always_send": { + "description": "Send this template after every call, whichever templates the model chooses.", + "type": "boolean" + }, + "template_id": { + "description": "An approved template on the chosen number.", + "type": "integer" + }, + "usage_description": { + "description": "When this template should be sent. After the call, the model reads\nthese descriptions to choose which templates fit the conversation.\n", + "example": "Send when the caller books an appointment.", + "type": "string" + }, + "variable_mappings": { + "description": "How to fill each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The extracted variable whose value fills this placeholder.", + "type": "string" + }, + "fallback_value": { + "description": "The value to use when the variable is not extracted.", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + }, + "mode": { + "description": "Which input the dashboard shows for this placeholder. It\ndoes not change the value sent: a `static_value` is used\nfirst, then the extracted variable, then `fallback_value`.\n", + "enum": [ + "variable", + "static" + ], + "type": "string" + }, + "static_value": { + "description": "A fixed value for this placeholder. When set, it is used\ninstead of the extracted variable.\n", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "email": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the email.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the email body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "recipients": { + "description": "Email addresses that should receive the notification.", + "example": [ + "support@example.com" + ], + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", + "example": [ + "completed", + "voicemail_detected" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "google_sheets": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Append the call to a Google Sheet. Sending this key replaces the\nagent's Google Sheets actions; leaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Google Sheets integration.", + "type": "integer" + }, + "spreadsheet_id": { + "description": "Required. The id in the sheet's URL, the part after `/d/`.", + "type": "string" + }, + "spreadsheet_name": { + "type": "string" + }, + "worksheet_name": { + "description": "The tab to append to. Defaults to `Sheet1`.", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "hubspot": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a HubSpot record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's HubSpot actions; leaving\nit out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your HubSpot integration.", + "type": "integer" + }, + "object_name": { + "description": "Required.", + "enum": [ + "contact", + "company", + "deal", + "ticket" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "omni_crm": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Save the call to Omni CRM.", + "type": "object" + } + ] + }, + "salesforce": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a Salesforce record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's Salesforce actions;\nleaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Salesforce integration.", + "type": "integer" + }, + "object_name": { + "description": "Defaults to `Lead`.", + "enum": [ + "Lead", + "Contact", + "Account", + "Opportunity", + "Case", + "Task", + "Product" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "slack": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Post the call to a Slack channel. Sending this key replaces the\nagent's Slack actions; leaving it out keeps them.\n", + "properties": { + "channel_id": { + "description": "The channel id. Send this or `channel_name`.", + "type": "string" + }, + "channel_name": { + "description": "The channel name. Send this or `channel_id`.", + "type": "string" + }, + "integration_id": { + "description": "Required. The id of your Slack integration.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "webhook": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the webhook.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the webhook body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", + "example": [ + "completed", + "failed" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + }, + "url": { + "description": "Endpoint that receives a POST with the call payload.", + "example": "https://your-webhook-endpoint.com/omnidim-callback", + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "workflow": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Trigger a workflow after the call.", + "properties": { + "workflow_id": { + "description": "The id of the workflow to run.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "zoho_bigin": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Log the call in Zoho Bigin. Sending this key replaces the\nagent's Zoho Bigin actions; leaving it out keeps them.\n", + "properties": { + "create_call_log": { + "description": "Log the call. Defaults to true.", + "type": "boolean" + }, + "create_contact": { + "description": "Create a contact when no contact matches. Defaults to true.", + "type": "boolean" + }, + "integration_id": { + "description": "Required. The id of your Zoho Bigin integration.", + "type": "integer" + }, + "update_contact": { + "description": "Update a matching contact with what the call captured. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + } + ] + } + }, + "type": "object" + } + ], + "description": "Post-call actions for this session only, in the same shape\nas `post_call_actions` on agent create. Email and webhook\nonly. They replace the agent's own post-call actions for\nthis session. Items that cannot be used are skipped and\nlisted in `post_call_actions_ignored`.\n" + } +}
- Added
createWorkflow - Added
deactivateWorkflow - Added
deleteClonedVoice - Added
deletePostCallAction - Added
deleteWorkflow - Changed
dispatchCall2 fields changed- added
Input schema / properties / requestBody / properties / __languagesAdded value: +{ + "description": "Languages this call runs in, replacing the agent's configured\nlist for this call only. The first entry is the language the\ncall opens in. Send an array, or a pipe-separated string such\nas `Hindi|English`. Names the platform does not recognize are\nskipped and listed in `languages_ignored`.\n", + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] +} - added
Input schema / properties / requestBody / properties / __post_call_actionsAdded value: +{ + "allOf": [ + { + "description": "Side effects that fire once the call ends: email, webhook, Omni CRM,\nCloud WhatsApp, a workflow, Google Sheets, Slack, Salesforce, HubSpot\nor Zoho Bigin.\n", + "properties": { + "cloud_whatsapp": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Send a Cloud WhatsApp template message after the call.", + "properties": { + "phone_number_id": { + "description": "The id of your organization's Cloud WhatsApp number the\nmessage is sent from.\n", + "type": "integer" + }, + "template_id": { + "description": "An approved template on that number. A template that is not\napproved, or that belongs to another number, is refused.\n", + "type": "integer" + }, + "template_variables": { + "description": "Which extracted variable fills each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The key of the extracted variable whose value fills this placeholder.", + "example": "customer_name", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "templates": { + "description": "One or more templates to send, each with its variable mapping.", + "items": { + "description": "One Cloud WhatsApp template to send after the call.", + "properties": { + "always_send": { + "description": "Send this template after every call, whichever templates the model chooses.", + "type": "boolean" + }, + "template_id": { + "description": "An approved template on the chosen number.", + "type": "integer" + }, + "usage_description": { + "description": "When this template should be sent. After the call, the model reads\nthese descriptions to choose which templates fit the conversation.\n", + "example": "Send when the caller books an appointment.", + "type": "string" + }, + "variable_mappings": { + "description": "How to fill each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The extracted variable whose value fills this placeholder.", + "type": "string" + }, + "fallback_value": { + "description": "The value to use when the variable is not extracted.", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + }, + "mode": { + "description": "Which input the dashboard shows for this placeholder. It\ndoes not change the value sent: a `static_value` is used\nfirst, then the extracted variable, then `fallback_value`.\n", + "enum": [ + "variable", + "static" + ], + "type": "string" + }, + "static_value": { + "description": "A fixed value for this placeholder. When set, it is used\ninstead of the extracted variable.\n", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "email": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the email.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the email body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "recipients": { + "description": "Email addresses that should receive the notification.", + "example": [ + "support@example.com" + ], + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", + "example": [ + "completed", + "voicemail_detected" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "google_sheets": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Append the call to a Google Sheet. Sending this key replaces the\nagent's Google Sheets actions; leaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Google Sheets integration.", + "type": "integer" + }, + "spreadsheet_id": { + "description": "Required. The id in the sheet's URL, the part after `/d/`.", + "type": "string" + }, + "spreadsheet_name": { + "type": "string" + }, + "worksheet_name": { + "description": "The tab to append to. Defaults to `Sheet1`.", + "type": "string" + } + }, + "type": "object" + } + ] + }, + "hubspot": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a HubSpot record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's HubSpot actions; leaving\nit out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your HubSpot integration.", + "type": "integer" + }, + "object_name": { + "description": "Required.", + "enum": [ + "contact", + "company", + "deal", + "ticket" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "omni_crm": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Save the call to Omni CRM.", + "type": "object" + } + ] + }, + "salesforce": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a Salesforce record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's Salesforce actions;\nleaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Salesforce integration.", + "type": "integer" + }, + "object_name": { + "description": "Defaults to `Lead`.", + "enum": [ + "Lead", + "Contact", + "Account", + "Opportunity", + "Case", + "Task", + "Product" + ], + "type": "string" + } + }, + "type": "object" + } + ] + }, + "slack": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Post the call to a Slack channel. Sending this key replaces the\nagent's Slack actions; leaving it out keeps them.\n", + "properties": { + "channel_id": { + "description": "The channel id. Send this or `channel_name`.", + "type": "string" + }, + "channel_name": { + "description": "The channel name. Send this or `channel_id`.", + "type": "string" + }, + "integration_id": { + "description": "Required. The id of your Slack integration.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "webhook": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the webhook.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the webhook body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", + "example": [ + "completed", + "failed" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + }, + "url": { + "description": "Endpoint that receives a POST with the call payload.", + "example": "https://your-webhook-endpoint.com/omnidim-callback", + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "workflow": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Trigger a workflow after the call.", + "properties": { + "workflow_id": { + "description": "The id of the workflow to run.", + "type": "integer" + } + }, + "type": "object" + } + ] + }, + "zoho_bigin": { + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Log the call in Zoho Bigin. Sending this key replaces the\nagent's Zoho Bigin actions; leaving it out keeps them.\n", + "properties": { + "create_call_log": { + "description": "Log the call. Defaults to true.", + "type": "boolean" + }, + "create_contact": { + "description": "Create a contact when no contact matches. Defaults to true.", + "type": "boolean" + }, + "integration_id": { + "description": "Required. The id of your Zoho Bigin integration.", + "type": "integer" + }, + "update_contact": { + "description": "Update a matching contact with what the call captured. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + } + ] + } + }, + "type": "object" + } + ], + "description": "Post-call actions for this call only, in the same shape as\n`post_call_actions` on agent create. Email and webhook only.\nThey replace the agent's own post-call actions for this call;\nthe agent is not changed. Items that cannot be used are\nskipped and listed in `post_call_actions_ignored`, and the\ncall still goes out. Can also be sent inside `call_context`.\n" +}
- Added
editWorkflow - Added
getAccountBalance - Added
getClonedVoice - Added
getClonedVoiceSample - Added
getWorkflow - Added
getWorkflowExecution - Added
getWorkflowNodeType - Changed
importSipTrunk2 fields changed- changed
Input schema / properties / requestBody / properties / sip_dial_prefix / descriptionPrevious value: -"Optional prefix to prepend before the destination number when dialing (e.g. to strip the country code)."New value: +"Digits added in front of every number dialed through this trunk. See `sip_strip_country_code` for how it combines with the country code." - added
Input schema / properties / requestBody / properties / sip_strip_country_codeAdded value: +{ + "description": "When true, the country code is removed from every number dialed through this trunk. When omitted and `sip_dial_prefix` is set, the country code is removed, so send `false` to keep it.", + "type": "boolean" +}
- Changed
listAgentVersions1 field changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "manual", - "auto", - "system" -]New value: +[ + "manual", + "system" +]
- Added
listClonedVoices - Added
listIntegrations - Added
listPostCallActions - Changed
listVoices5 fields changed- changed
Input schema / properties / accent / descriptionPrevious value: -"Accent label (e.g. `american`, `british`). ElevenLabs only."New value: +"Accent label (e.g. `american`, `british`). ElevenLabs and Cartesia." - changed
Input schema / properties / gender / descriptionPrevious value: -"Filter voices by gender. ElevenLabs only."New value: +"Filter voices by gender. ElevenLabs and Cartesia." - changed
Input schema / properties / language / descriptionPrevious value: -"ISO language code (e.g. `en`, `hi`, `es`). ElevenLabs only."New value: +"ISO language code (e.g. `en`, `hi`, `es`). ElevenLabs and Cartesia." - changed
Input schema / properties / provider / enumPrevious value: -[ - "eleven_labs", - "google", - "deepgram", - "cartesia", - "sarvam" -]New value: +[ + "eleven_labs", + "google", + "deepgram", + "cartesia", + "sarvam", + "rime", + "playht", + "hume", + "inworld", + "smallest" +] - changed
Input schema / properties / search / descriptionPrevious value: -"Substring match against voice name or description. ElevenLabs only."New value: +"Substring match against voice name or description. ElevenLabs and Cartesia."
- Added
listWorkflowFieldOptions - Added
listWorkflowNodeTypes - Added
listWorkflows - Added
publishWorkflow - Changed
purchasePhoneNumber1 field changed- changed
Input schema / properties / requestBody / properties / carrier / descriptionPrevious value: -"The carrier to buy from: pass the `carrier` the search\nresponse named, so you buy from the inventory you searched.\nAlways required, and omitting it returns\n`409 carrier_required` naming that region's carriers.\n"New value: +"The carrier to buy from: pass the `carrier` the search\nresponse named, so you buy from the inventory you searched.\nRequired where the region has more than one carrier;\nomitting it there returns `409 carrier_required`.\n"
- Added
regenerateClonedVoiceSample - Changed
restoreAgentVersion1 field changed- added
Input schema / properties / requestBodyAdded value: +{ + "description": "The JSON request body.", + "properties": {}, + "type": "object" +}
- Changed
retryBulkCall3 fields changed- changed
Input schema / properties / requestBody / properties / failure_reasons / descriptionPrevious value: -"Re-queue only contacts that failed for these reasons, for\nexample `no-answer` and `busy`.\n"New value: +"Statuses to re-queue. Read only when `retry_strategy` is\n`specific`; for example `no-answer` and `busy`. Ignored when\n`retry_strategy` is `all`.\n" - removed
Input schema / properties / requestBody / properties / max_retriesRemoved value: -{ - "description": "Skip contacts already retried this many times.", - "type": "number" -} - changed
Input schema / properties / requestBody / properties / retry_strategy / descriptionPrevious value: -"Which contacts to re-queue. `all` takes everything that did\nnot connect.\n"New value: +"Which contacts to re-queue. `all` takes everything that did\nnot connect. `specific` re-queues only the statuses listed\nin `failure_reasons`.\n"
- Changed
searchPhoneNumbers2 fields changed- changed
Input schema / properties / carrier / descriptionPrevious value: -"Which carrier's stock to search: carriers in a region do not sell\nthe same numbers. Always required, even where a region holds one,\nand omitting it returns `409 carrier_required` naming that\nregion's carriers and what each one stocks.\n"New value: +"Which carrier's stock to search: carriers in a region do not sell\nthe same numbers. Required where a region has more than one\ncarrier; omitting it there returns `409 carrier_required` naming\nthe region's carriers and what each one stocks.\n" - changed
Input schema / requiredPrevious value: -[ - "region", - "carrier" -]New value: +[ + "region" +]
- Changed
startBulkCall1 field changed- added
Input schema / properties / requestBodyAdded value: +{ + "description": "The JSON request body.", + "properties": {}, + "type": "object" +}
- Added
testWorkflow - Changed
updateAgent15 fields changed- changed
Input schema / properties / requestBody / properties / post_call_actions / descriptionPrevious value: -"Side effects that fire once the call ends. Configure email, webhook, or both."New value: +"Side effects that fire once the call ends: email, webhook, Omni CRM,\nCloud WhatsApp, a workflow, Google Sheets, Slack, Salesforce, HubSpot\nor Zoho Bigin.\n" - added
Input schema / properties / requestBody / properties / post_call_actions / properties / cloud_whatsappAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Send a Cloud WhatsApp template message after the call.", + "properties": { + "phone_number_id": { + "description": "The id of your organization's Cloud WhatsApp number the\nmessage is sent from.\n", + "type": "integer" + }, + "template_id": { + "description": "An approved template on that number. A template that is not\napproved, or that belongs to another number, is refused.\n", + "type": "integer" + }, + "template_variables": { + "description": "Which extracted variable fills each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The key of the extracted variable whose value fills this placeholder.", + "example": "customer_name", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "templates": { + "description": "One or more templates to send, each with its variable mapping.", + "items": { + "description": "One Cloud WhatsApp template to send after the call.", + "properties": { + "always_send": { + "description": "Send this template after every call, whichever templates the model chooses.", + "type": "boolean" + }, + "template_id": { + "description": "An approved template on the chosen number.", + "type": "integer" + }, + "usage_description": { + "description": "When this template should be sent. After the call, the model reads\nthese descriptions to choose which templates fit the conversation.\n", + "example": "Send when the caller books an appointment.", + "type": "string" + }, + "variable_mappings": { + "description": "How to fill each template placeholder.", + "items": { + "properties": { + "extracted_var": { + "description": "The extracted variable whose value fills this placeholder.", + "type": "string" + }, + "fallback_value": { + "description": "The value to use when the variable is not extracted.", + "type": "string" + }, + "index": { + "description": "The placeholder number, as a string.", + "example": "1", + "type": "string" + }, + "mode": { + "description": "Which input the dashboard shows for this placeholder. It\ndoes not change the value sent: a `static_value` is used\nfirst, then the extracted variable, then `fallback_value`.\n", + "enum": [ + "variable", + "static" + ], + "type": "string" + }, + "static_value": { + "description": "A fixed value for this placeholder. When set, it is used\ninstead of the extracted variable.\n", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + ] +} - changed
Input schema / properties / requestBody / properties / post_call_actions / properties / email / properties / trigger_call_statuses / items / enumPrevious value: -[ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" -]New value: +[ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" +] - added
Input schema / properties / requestBody / properties / post_call_actions / properties / google_sheetsAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Append the call to a Google Sheet. Sending this key replaces the\nagent's Google Sheets actions; leaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Google Sheets integration.", + "type": "integer" + }, + "spreadsheet_id": { + "description": "Required. The id in the sheet's URL, the part after `/d/`.", + "type": "string" + }, + "spreadsheet_name": { + "type": "string" + }, + "worksheet_name": { + "description": "The tab to append to. Defaults to `Sheet1`.", + "type": "string" + } + }, + "type": "object" + } + ] +} - added
Input schema / properties / requestBody / properties / post_call_actions / properties / hubspotAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a HubSpot record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's HubSpot actions; leaving\nit out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your HubSpot integration.", + "type": "integer" + }, + "object_name": { + "description": "Required.", + "enum": [ + "contact", + "company", + "deal", + "ticket" + ], + "type": "string" + } + }, + "type": "object" + } + ] +} - added
Input schema / properties / requestBody / properties / post_call_actions / properties / omni_crmAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Save the call to Omni CRM.", + "type": "object" + } + ] +} - added
Input schema / properties / requestBody / properties / post_call_actions / properties / salesforceAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Create a Salesforce record from the call. Sends a fixed set of\nfields for the object, so it takes no `extracted_variables`.\nSending this key replaces the agent's Salesforce actions;\nleaving it out keeps them.\n", + "properties": { + "integration_id": { + "description": "Required. The id of your Salesforce integration.", + "type": "integer" + }, + "object_name": { + "description": "Defaults to `Lead`.", + "enum": [ + "Lead", + "Contact", + "Account", + "Opportunity", + "Case", + "Task", + "Product" + ], + "type": "string" + } + }, + "type": "object" + } + ] +} - added
Input schema / properties / requestBody / properties / post_call_actions / properties / slackAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Post the call to a Slack channel. Sending this key replaces the\nagent's Slack actions; leaving it out keeps them.\n", + "properties": { + "channel_id": { + "description": "The channel id. Send this or `channel_name`.", + "type": "string" + }, + "channel_name": { + "description": "The channel name. Send this or `channel_id`.", + "type": "string" + }, + "integration_id": { + "description": "Required. The id of your Slack integration.", + "type": "integer" + } + }, + "type": "object" + } + ] +} - changed
Input schema / properties / requestBody / properties / post_call_actions / properties / webhook / properties / trigger_call_statuses / items / enumPrevious value: -[ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" -]New value: +[ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" +] - added
Input schema / properties / requestBody / properties / post_call_actions / properties / workflowAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Trigger a workflow after the call.", + "properties": { + "workflow_id": { + "description": "The id of the workflow to run.", + "type": "integer" + } + }, + "type": "object" + } + ] +} - added
Input schema / properties / requestBody / properties / post_call_actions / properties / zoho_biginAdded value: +{ + "allOf": [ + { + "description": "Settings every post-call channel shares.", + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for this action.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in this action.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that fire this action. Omit to use the default\n(`completed`, `voicemail_detected`).\n", + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no-answer", + "busy", + "canceled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "description": "Log the call in Zoho Bigin. Sending this key replaces the\nagent's Zoho Bigin actions; leaving it out keeps them.\n", + "properties": { + "create_call_log": { + "description": "Log the call. Defaults to true.", + "type": "boolean" + }, + "create_contact": { + "description": "Create a contact when no contact matches. Defaults to true.", + "type": "boolean" + }, + "integration_id": { + "description": "Required. The id of your Zoho Bigin integration.", + "type": "integer" + }, + "update_contact": { + "description": "Update a matching contact with what the call captured. Defaults to true.", + "type": "boolean" + } + }, + "type": "object" + } + ] +} - changed
Input schema / properties / requestBody / properties / transcriber / properties / model / descriptionPrevious value: -"The model to use for transcription (required when provider is `deepgram_stream`)."New value: +"Transcription model for the selected provider. For\n`deepgram_stream` this is `nova-3` or `nova-2`; other\nproviders take their own model identifiers.\n" - removed
Input schema / properties / requestBody / properties / transcriber / properties / model / enumRemoved value: -[ - "nova-3", - "nova-2" -] - removed
Input schema / properties / requestBody / properties / voice / properties / modelRemoved value: -{ - "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", - "type": "string" -} - changed
Input schema / properties / requestBody / properties / web_search / properties / provider / enumPrevious value: -[ - "DuckDuckGo" -]New value: +[ + "DuckDuckGo", + "openAI" +]
- Added
updateClonedVoice - Added
updatePostCallAction - Added
validateWorkflow
2 tool updates
v0.13.1- Changed
purchasePhoneNumber1 field changed- changed
Input schema / properties / requestBody / properties / carrier / descriptionPrevious value: -"The carrier to buy from: pass the `carrier` the search\nresponse named, so you buy from the inventory you searched.\nAlways required. Region `IN` has `carrier-1` (landline) and\n`carrier-2-new` (mobile); region `US` has `carrier-us`.\nOmitting it returns `409 carrier_required` listing them.\n"New value: +"The carrier to buy from: pass the `carrier` the search\nresponse named, so you buy from the inventory you searched.\nAlways required, and omitting it returns\n`409 carrier_required` naming that region's carriers.\n"
- Changed
searchPhoneNumbers1 field changed- changed
Input schema / properties / carrier / descriptionPrevious value: -"Which carrier to use. **Always required** in a region that has\none, however few it holds, so that adding a carrier is never a\nbreaking change.\n\nRegion `IN` has two: `carrier-1` stocks landline numbers (city\ncodes 11, 12 and 80), `carrier-2-new` stocks mobile numbers (94\nand 79 series). Region `US` has one: `carrier-us`, US local\nnumbers by area code.\n\nOmitting it returns `409 carrier_required` listing the carriers\nwith what each one stocks, so an integration can discover them at\nruntime rather than hard-coding this list.\n"New value: +"Which carrier's stock to search: carriers in a region do not sell\nthe same numbers. Always required, even where a region holds one,\nand omitting it returns `409 carrier_required` naming that\nregion's carriers and what each one stocks.\n"
2 tool updates
v0.13.0- Changed
purchasePhoneNumber2 fields changed- added
Input schema / properties / requestBody / properties / carrierAdded value: +{ + "description": "The carrier to buy from: pass the `carrier` the search\nresponse named, so you buy from the inventory you searched.\nAlways required. Region `IN` has `carrier-1` (landline) and\n`carrier-2-new` (mobile); region `US` has `carrier-us`.\nOmitting it returns `409 carrier_required` listing them.\n", + "type": "string" +} - changed
Input schema / properties / requestBody / requiredPrevious value: -[ - "region", - "phone_number" -]New value: +[ + "region", + "carrier", + "phone_number" +]
- Changed
searchPhoneNumbers3 fields changed- added
Input schema / properties / carrierAdded value: +{ + "description": "Which carrier to use. **Always required** in a region that has\none, however few it holds, so that adding a carrier is never a\nbreaking change.\n\nRegion `IN` has two: `carrier-1` stocks landline numbers (city\ncodes 11, 12 and 80), `carrier-2-new` stocks mobile numbers (94\nand 79 series). Region `US` has one: `carrier-us`, US local\nnumbers by area code.\n\nOmitting it returns `409 carrier_required` listing the carriers\nwith what each one stocks, so an integration can discover them at\nruntime rather than hard-coding this list.\n", + "type": "string" +} - changed
Input schema / properties / region / descriptionPrevious value: -"Region to search in."New value: +"Region to search in. `IN` and `US` both serve numbers. Which\nregions answer is configuration, so a region with no carrier\nenabled returns `404 not_available` rather than an empty list.\n" - changed
Input schema / requiredPrevious value: -[ - "region" -]New value: +[ + "region", + "carrier" +]
2 tool updates
v0.12.0- Changed
createAgent1 field changed- changed
Input schema / properties / requestBody / allOfPrevious value: -[ - { - "description": "Agent configuration.", - "properties": { - "background_track": { - "description": "Ambient background noise that plays under the agent's voice.", - "properties": { - "enabled": { - "description": "Whether to mix the ambient track under the agent's audio.", - "type": "boolean" - }, - "name": { - "description": "Ambient track to mix under the agent.", - "enum": [ - "call_center", - "filler", - "office", - "office_1", - "restaurant" - ], - "type": "string" - }, - "tts_volume_reduction": { - "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "volume": { - "default": 0.2, - "description": "Volume level on a 0–1 scale. Default 0.2.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "call_type": { - "description": "Call type of the assistant.", - "enum": [ - "Incoming", - "Outgoing" - ], - "type": "string" - }, - "context_breakdown": { - "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", - "items": { - "properties": { - "body": { - "description": "Body of the breakdown, the detailed prompt content.", - "example": "This agent helps customers with product inquiries and support issues.", - "type": "string" - }, - "is_enabled": { - "default": true, - "description": "Whether this section is included in the prompt.", - "type": "boolean" - }, - "title": { - "description": "Title of the breakdown.", - "example": "Purpose", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "type": "array" - }, - "dynamic_variables": { - "additionalProperties": { - "type": "string" - }, - "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", - "example": { - "customer_name": "Jane Doe", - "order_id": "ORD-12345" - }, - "type": "object" - }, - "end_call": { - "description": "Hang up automatically when a condition is met.", - "properties": { - "condition": { - "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", - "example": "End the call once the customer's issue is resolved.", - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "message": { - "description": "What the agent says before hanging up.", - "example": "Thank you for contacting us. Have a great day!", - "type": "string" - }, - "message_prompt": { - "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", - "example": "End the call politely in the same language the user is speaking.", - "type": "string" - }, - "message_type": { - "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", - "enum": [ - "static", - "prompt" - ], - "type": "string" - } - }, - "type": "object" - }, - "initial_ringing_sound_enabled": { - "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", - "type": "boolean" - }, - "is_interruption_allowed": { - "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", - "type": "boolean" - }, - "is_welcome_message_dynamic": { - "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", - "type": "boolean" - }, - "is_welcome_message_interruption": { - "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", - "type": "boolean" - }, - "languages": { - "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", - "example": [ - "English (India)", - "Hindi" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "model": { - "description": "Configuration for the language model.", - "properties": { - "model": { - "description": "The language model to use. The current catalog is returned by the LLM providers list.", - "enum": [ - "azure-gpt-4.1-mini", - "azure-gpt-4.1-nano", - "azure-gpt-4o", - "azure-gpt-4o-mini", - "gemini-2.5-flash", - "gemini-2.5-flash-lite", - "gpt-3.5-turbo", - "gpt-4.1-mini", - "gpt-4.1-nano", - "gpt-4o", - "gpt-4o-mini", - "gpt-5.1", - "llama-3.3-70b-versatile" - ], - "example": "gpt-4.1-mini", - "type": "string" - }, - "temperature": { - "description": "Controls randomness in the model's output (0.0 to 1.0).", - "example": 0.7, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "name": { - "description": "Name for the agent.", - "example": "Customer Support Agent", - "type": "string" - }, - "post_call_actions": { - "description": "Side effects that fire once the call ends. Configure email, webhook, or both.", - "properties": { - "email": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the email.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the email body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "recipients": { - "description": "Email addresses that should receive the notification.", - "example": [ - "support@example.com" - ], - "items": { - "format": "email", - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", - "example": [ - "completed", - "voicemail_detected" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "webhook": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the webhook.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the webhook body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", - "example": [ - "completed", - "failed" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - }, - "url": { - "description": "Endpoint that receives a POST with the call payload.", - "example": "https://your-webhook-endpoint.com/omnidim-callback", - "format": "uri", - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "transcriber": { - "description": "Configuration for the speech-to-text transcriber.", - "properties": { - "diarize": { - "description": "Identify different speakers in the transcript.", - "type": "boolean" - }, - "first_ideal_message": { - "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", - "type": "string" - }, - "interruption_min_words": { - "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", - "example": 2, - "minimum": 1, - "type": "integer" - }, - "is_first_ideal_message_dynamic": { - "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "is_second_ideal_message_dynamic": { - "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "language": { - "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", - "example": "en-US", - "type": "string" - }, - "max_call_duration_in_sec": { - "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", - "example": 600, - "minimum": 1, - "type": "integer" - }, - "model": { - "description": "The model to use for transcription (required when provider is `deepgram_stream`).", - "enum": [ - "nova-3", - "nova-2" - ], - "example": "nova-3", - "type": "string" - }, - "numerals": { - "description": "Convert numbers from words to digits.", - "type": "boolean" - }, - "provider": { - "description": "The speech-to-text provider to use.", - "enum": [ - "deepgram_stream", - "cartesia", - "sarvam", - "azure_stream", - "soniox" - ], - "example": "deepgram_stream", - "type": "string" - }, - "punctuate": { - "description": "Add punctuation to the transcript.", - "type": "boolean" - }, - "second_ideal_message": { - "description": "Second nudge spoken if silence continues after the first.", - "type": "string" - }, - "should_apply_noise_reduction": { - "description": "Reduce background noise on the inbound audio stream before transcription.", - "type": "boolean" - }, - "silence_timeout_ms": { - "description": "Silence timeout in milliseconds.", - "example": 400, - "type": "integer" - }, - "smart_format": { - "description": "Apply smart formatting to the transcript.", - "type": "boolean" - } - }, - "type": "object" - }, - "transfer": { - "description": "Conditional call transfer to a human agent or another number.", - "properties": { - "enabled": { - "type": "boolean" - }, - "transfer_options": { - "description": "Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them.", - "items": { - "properties": { - "backup_numbers": { - "description": "Fallback numbers tried if the primary is unreachable.", - "items": { - "type": "string" - }, - "type": "array" - }, - "number": { - "description": "Primary phone number to transfer to. Include country code with leading `+`.", - "example": "+15551234567", - "type": "string" - }, - "transfer_condition": { - "description": "Natural-language condition that triggers this transfer option.", - "example": "Transfer if the customer asks to speak with a human.", - "type": "string" - }, - "transfer_message": { - "description": "Message the agent says to the caller before executing the transfer.", - "example": "Please hold while I connect you to one of our agents.", - "type": "string" - }, - "type": { - "default": "static", - "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", - "enum": [ - "static", - "dynamic" - ], - "type": "string" - } - }, - "required": [ - "number", - "transfer_condition", - "transfer_message" - ], - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "voice": { - "dependentRequired": { - "provider": [ - "voice_id" - ] - }, - "description": "Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently.", - "properties": { - "model": { - "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", - "example": "sonic-3.5", - "type": "string" - }, - "provider": { - "description": "The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it.", - "enum": [ - "eleven_labs", - "google", - "cartesia", - "sarvam" - ], - "example": "eleven_labs", - "type": "string" - }, - "speech_speed": { - "default": 1, - "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", - "maximum": 2, - "minimum": 0.5, - "type": "number" - }, - "voice_id": { - "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it.", - "example": "JBFqnCBsd6RMkjVDRZzb", - "type": "string" - } - }, - "type": "object" - }, - "voicemail": { - "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", - "properties": { - "enabled": { - "description": "Detect voicemail and leave your message instead of speaking to a machine.", - "type": "boolean" - }, - "message": { - "description": "Message to leave when voicemail is detected.", - "type": "string" - } - }, - "type": "object" - }, - "web_search": { - "description": "Configuration for web search capabilities.", - "properties": { - "enabled": { - "description": "Enable or disable web search functionality.", - "type": "boolean" - }, - "provider": { - "description": "The search provider to use.", - "enum": [ - "DuckDuckGo" - ], - "example": "DuckDuckGo", - "type": "string" - } - }, - "type": "object" - }, - "welcome_message": { - "description": "Initial message the agent will say when answering a call.", - "example": "Hello! How can I help you today?", - "type": "string" - } - }, - "type": "object" - }, - { - "required": [ - "name", - "welcome_message", - "context_breakdown" - ], - "type": "object" - } -]New value: +[ + { + "description": "Agent configuration.", + "properties": { + "background_track": { + "description": "Ambient background noise that plays under the agent's voice.", + "properties": { + "enabled": { + "description": "Whether to mix the ambient track under the agent's audio.", + "type": "boolean" + }, + "name": { + "description": "Ambient track to mix under the agent.", + "enum": [ + "call_center", + "filler", + "office", + "office_1", + "restaurant" + ], + "type": "string" + }, + "tts_volume_reduction": { + "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "volume": { + "default": 0.2, + "description": "Volume level on a 0–1 scale. Default 0.2.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "call_type": { + "description": "Call type of the assistant.", + "enum": [ + "Incoming", + "Outgoing" + ], + "type": "string" + }, + "context_breakdown": { + "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", + "items": { + "properties": { + "body": { + "description": "Body of the breakdown, the detailed prompt content.", + "example": "This agent helps customers with product inquiries and support issues.", + "type": "string" + }, + "is_enabled": { + "default": true, + "description": "Whether this section is included in the prompt.", + "type": "boolean" + }, + "title": { + "description": "Title of the breakdown.", + "example": "Purpose", + "type": "string" + } + }, + "required": [ + "title", + "body" + ], + "type": "object" + }, + "type": "array" + }, + "dynamic_variables": { + "additionalProperties": { + "type": "string" + }, + "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", + "example": { + "customer_name": "Jane Doe", + "order_id": "ORD-12345" + }, + "type": "object" + }, + "end_call": { + "description": "Hang up automatically when a condition is met.", + "properties": { + "condition": { + "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", + "example": "End the call once the customer's issue is resolved.", + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "message": { + "description": "What the agent says before hanging up.", + "example": "Thank you for contacting us. Have a great day!", + "type": "string" + }, + "message_prompt": { + "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", + "example": "End the call politely in the same language the user is speaking.", + "type": "string" + }, + "message_type": { + "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", + "enum": [ + "static", + "prompt" + ], + "type": "string" + } + }, + "type": "object" + }, + "initial_ringing_sound_enabled": { + "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", + "type": "boolean" + }, + "is_interruption_allowed": { + "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", + "type": "boolean" + }, + "is_welcome_message_dynamic": { + "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", + "type": "boolean" + }, + "is_welcome_message_interruption": { + "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", + "type": "boolean" + }, + "languages": { + "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", + "example": [ + "English (India)", + "Hindi" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "model": { + "description": "Configuration for the language model.", + "properties": { + "model": { + "description": "The language model to use. The current catalog is returned by the LLM providers list.", + "enum": [ + "azure-gpt-4.1-mini", + "azure-gpt-4.1-nano", + "azure-gpt-4o", + "azure-gpt-4o-mini", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gpt-3.5-turbo", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4o", + "gpt-4o-mini", + "gpt-5.1", + "llama-3.3-70b-versatile" + ], + "example": "gpt-4.1-mini", + "type": "string" + }, + "temperature": { + "description": "Controls randomness in the model's output (0.0 to 1.0).", + "example": 0.7, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "name": { + "description": "Name for the agent.", + "example": "Customer Support Agent", + "type": "string" + }, + "post_call_actions": { + "description": "Side effects that fire once the call ends. Configure email, webhook, or both.", + "properties": { + "email": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the email.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the email body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "recipients": { + "description": "Email addresses that should receive the notification.", + "example": [ + "support@example.com" + ], + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", + "example": [ + "completed", + "voicemail_detected" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no_answer", + "busy", + "cancelled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "webhook": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the webhook.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the webhook body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", + "example": [ + "completed", + "failed" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no_answer", + "busy", + "cancelled" + ], + "type": "string" + }, + "type": "array" + }, + "url": { + "description": "Endpoint that receives a POST with the call payload.", + "example": "https://your-webhook-endpoint.com/omnidim-callback", + "format": "uri", + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "timezone": { + "description": "IANA timezone for this agent, for example `Asia/Kolkata`. Sets the local date and time the agent works with during calls. If not set, the account timezone is used as fallback. Pass an empty string to clear it.", + "example": "America/New_York", + "type": "string" + }, + "transcriber": { + "description": "Configuration for the speech-to-text transcriber.", + "properties": { + "diarize": { + "description": "Identify different speakers in the transcript.", + "type": "boolean" + }, + "first_ideal_message": { + "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", + "type": "string" + }, + "interruption_min_words": { + "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", + "example": 2, + "minimum": 1, + "type": "integer" + }, + "is_first_ideal_message_dynamic": { + "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "is_second_ideal_message_dynamic": { + "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "language": { + "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", + "example": "en-US", + "type": "string" + }, + "max_call_duration_in_sec": { + "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", + "example": 600, + "minimum": 1, + "type": "integer" + }, + "model": { + "description": "The model to use for transcription (required when provider is `deepgram_stream`).", + "enum": [ + "nova-3", + "nova-2" + ], + "example": "nova-3", + "type": "string" + }, + "numerals": { + "description": "Convert numbers from words to digits.", + "type": "boolean" + }, + "provider": { + "description": "The speech-to-text provider to use.", + "enum": [ + "deepgram_stream", + "cartesia", + "sarvam", + "azure_stream", + "soniox" + ], + "example": "deepgram_stream", + "type": "string" + }, + "punctuate": { + "description": "Add punctuation to the transcript.", + "type": "boolean" + }, + "second_ideal_message": { + "description": "Second nudge spoken if silence continues after the first.", + "type": "string" + }, + "should_apply_noise_reduction": { + "description": "Reduce background noise on the inbound audio stream before transcription.", + "type": "boolean" + }, + "silence_timeout_ms": { + "description": "Silence timeout in milliseconds.", + "example": 400, + "type": "integer" + }, + "smart_format": { + "description": "Apply smart formatting to the transcript.", + "type": "boolean" + } + }, + "type": "object" + }, + "transfer": { + "description": "Conditional call transfer to a human agent or another number.", + "properties": { + "enabled": { + "type": "boolean" + }, + "transfer_options": { + "description": "Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them.", + "items": { + "properties": { + "backup_numbers": { + "description": "Fallback numbers tried if the primary is unreachable.", + "items": { + "type": "string" + }, + "type": "array" + }, + "number": { + "description": "Primary phone number to transfer to. Include country code with leading `+`.", + "example": "+15551234567", + "type": "string" + }, + "transfer_condition": { + "description": "Natural-language condition that triggers this transfer option.", + "example": "Transfer if the customer asks to speak with a human.", + "type": "string" + }, + "transfer_message": { + "description": "Message the agent says to the caller before executing the transfer.", + "example": "Please hold while I connect you to one of our agents.", + "type": "string" + }, + "type": { + "default": "static", + "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", + "enum": [ + "static", + "dynamic" + ], + "type": "string" + } + }, + "required": [ + "number", + "transfer_condition", + "transfer_message" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "voice": { + "dependentRequired": { + "provider": [ + "voice_id" + ] + }, + "description": "Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently.", + "properties": { + "model": { + "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", + "example": "sonic-3.5", + "type": "string" + }, + "provider": { + "description": "The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it.", + "enum": [ + "eleven_labs", + "google", + "cartesia", + "sarvam" + ], + "example": "eleven_labs", + "type": "string" + }, + "speech_speed": { + "default": 1, + "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", + "maximum": 2, + "minimum": 0.5, + "type": "number" + }, + "voice_id": { + "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it.", + "example": "JBFqnCBsd6RMkjVDRZzb", + "type": "string" + } + }, + "type": "object" + }, + "voicemail": { + "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", + "properties": { + "enabled": { + "description": "Detect voicemail and leave your message instead of speaking to a machine.", + "type": "boolean" + }, + "message": { + "description": "Message to leave when voicemail is detected.", + "type": "string" + } + }, + "type": "object" + }, + "web_search": { + "description": "Configuration for web search capabilities.", + "properties": { + "enabled": { + "description": "Enable or disable web search functionality.", + "type": "boolean" + }, + "provider": { + "description": "The search provider to use.", + "enum": [ + "DuckDuckGo" + ], + "example": "DuckDuckGo", + "type": "string" + } + }, + "type": "object" + }, + "welcome_message": { + "description": "Initial message the agent will say when answering a call.", + "example": "Hello! How can I help you today?", + "type": "string" + } + }, + "type": "object" + }, + { + "required": [ + "name", + "welcome_message", + "context_breakdown" + ], + "type": "object" + } +]
- Changed
updateAgent1 field changed- added
Input schema / properties / requestBody / properties / timezoneAdded value: +{ + "description": "IANA timezone for this agent, for example `Asia/Kolkata`. Sets the local date and time the agent works with during calls. If not set, the account timezone is used as fallback. Pass an empty string to clear it.", + "type": "string" +}
11 tool updates
v0.11.1- Added
addBulkCallContacts - Added
addBulkCallNumber - Changed
createBulkCall11 fields changed- added
Input schema / properties / requestBody / properties / bot_idAdded value: +{ + "description": "Agent to run the campaign. Defaults to the agent attached\nto `phone_number_id`; required when the number has none.\n", + "type": "number" +} - added
Input schema / properties / requestBody / properties / call_conditionsAdded value: +{ + "description": "Dial only the contacts that match every condition; the rest\nare kept as `Skipped`. See Filtering in the guide below.\n", + "items": { + "properties": { + "column": { + "description": "Key on the contact row to test.", + "type": "string" + }, + "operator": { + "default": "equals", + "description": "`contains` is case-insensitive. `greater_than` and\n`less_than` compare numerically, and a row whose value\nis not a number fails the condition rather than\nerroring.\n", + "enum": [ + "equals", + "not_equals", + "contains", + "greater_than", + "less_than" + ], + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "column", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / requestBody / properties / contact_list / descriptionPrevious value: -"Array of contact objects. Each row needs `phone_number`.\nAny other key you add on the row (e.g. `customer_name`,\n`account_id`, `priority`) is passed to the agent as a\ncontext variable for that specific call, so the agent\ncan reference it during the conversation.\n\nRequired for static campaigns. Optional when `is_dynamic`\nis `true` (you can omit it and add contacts later via the\nwebhook).\n"New value: +"Who to call. Each row needs `phone_number`; any other key\nreaches the agent as context for that one call.\n" - changed
Input schema / properties / requestBody / properties / is_dynamic / descriptionPrevious value: -"Set to `true` to create a dynamic campaign that accepts\ncontacts in real time via the Add contact to dynamic\ncampaign webhook. When `true`, `contact_list` is optional\nand may be omitted to start the campaign empty.\n"New value: +"A dynamic campaign stays alive accepting contacts via the\nadd-contact webhooks, and `contact_list` becomes optional.\n" - changed
Input schema / properties / requestBody / properties / phone_number_id / descriptionPrevious value: -"Your phone number id to use for making calls."New value: +"The number this campaign calls from. With a `rotation`, the\nrotation numbers dial instead and this one is the standby.\n" - changed
Input schema / properties / requestBody / properties / retry_config / properties / retry_limit / defaultPrevious value: -0New value: +1 - changed
Input schema / properties / requestBody / properties / retry_config / properties / retry_limit / descriptionPrevious value: -"Maximum number of retry attempts (0–5)."New value: +"Retry attempts, 1 to 10. To disable retries omit it and\nleave `auto_retry` false; never send `0`.\n" - changed
Input schema / properties / requestBody / properties / retry_config / properties / retry_limit / maximumPrevious value: -5New value: +10 - changed
Input schema / properties / requestBody / properties / retry_config / properties / retry_limit / minimumPrevious value: -0New value: +1 - added
Input schema / properties / requestBody / properties / rotationAdded value: +{ + "description": "Rotate the campaign across several of your numbers, so no\nsingle number burns out. See Rotation in the guide below.\n", + "properties": { + "calls_per_number": { + "default": 50, + "description": "Calls before moving on. Used by `fixed_count` and `both`.", + "type": "number" + }, + "fallback": { + "default": "pause", + "description": "When every number is unhealthy: `pause` the campaign,\nor `continue_best` with the healthiest one.\n", + "enum": [ + "pause", + "continue_best" + ], + "type": "string" + }, + "health_threshold": { + "default": 30, + "description": "Health score below which a number is rotated away from.\nUsed by `cpr_threshold` and `both`.\n", + "type": "number" + }, + "numbers": { + "description": "The numbers to rotate across; each must be yours and\nlisted once.\n", + "items": { + "properties": { + "phone_number_id": { + "description": "One of your numbers, from List phone numbers.", + "type": "number" + }, + "sequence": { + "default": 10, + "description": "Rotation order. Lowest dials first.", + "type": "number" + } + }, + "required": [ + "phone_number_id" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "strategy": { + "default": "fixed_count", + "description": "When to move to the next number: every\n`calls_per_number` calls, on low health score, both, or\nnever.\n", + "enum": [ + "fixed_count", + "cpr_threshold", + "both", + "none" + ], + "type": "string" + } + }, + "required": [ + "numbers" + ], + "type": "object" +} - added
Input schema / properties / requestBody / properties / save_as_draftAdded value: +{ + "default": false, + "description": "Store the campaign without dialing; start it later with the\nstart endpoint. See Drafts in the guide below.\n", + "type": "boolean" +}
- Changed
createSession1 field changed- added
Input schema / properties / requestBody / properties / type / defaultAdded value: +"voice"
- Added
listBulkCallLines - Added
listBulkCallNumbers - Added
retryBulkCall - Added
setBulkCallConcurrency - Added
setBulkCallDailyTimeControl - Added
setBulkCallNumberActive - Added
startBulkCall
14 tool updates
v0.10.1- Removed
addUser - Removed
calculateCreditOperation - Changed
createSession1 field changed- added
Input schema / properties / requestBody / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Key-value pairs stored on the session for your own\ntracking (e.g. CRM or lead IDs). Not shared with the\nagent; echoed back as `metadata` in the post-call\nwebhook so you can correlate results with your records.\n", + "type": "object" +}
- Changed
dispatchCall1 field changed- added
Input schema / properties / requestBody / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Key-value pairs stored on the call for your own tracking\n(e.g. CRM or lead IDs). Not shared with the agent; echoed\nback as `metadata` in the post-call webhook so you can\ncorrelate results with your records.\n", + "type": "object" +}
- Removed
getResellerCreditLogs - Removed
listChildOrganizations - Added
purchasePhoneNumber - Added
releasePhoneNumber - Removed
revertCreditsFromChild - Added
searchPhoneNumbers - Removed
setChildConcurrency - Removed
setUserAccessControl - Removed
setUserExpiry - Removed
transferCreditsToChild
2 tool updates
v0.9.2- Changed
createAgent1 field changed- changed
Input schema / properties / requestBody / allOfPrevious value: -[ - { - "description": "Agent configuration.", - "properties": { - "background_track": { - "description": "Ambient background noise that plays under the agent's voice.", - "properties": { - "enabled": { - "description": "Whether to mix the ambient track under the agent's audio.", - "type": "boolean" - }, - "name": { - "description": "Ambient track to mix under the agent.", - "enum": [ - "call_center", - "filler", - "office", - "office_1", - "restaurant" - ], - "type": "string" - }, - "tts_volume_reduction": { - "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "volume": { - "default": 0.2, - "description": "Volume level on a 0–1 scale. Default 0.2.", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "call_type": { - "description": "Call type of the assistant.", - "enum": [ - "Incoming", - "Outgoing" - ], - "type": "string" - }, - "context_breakdown": { - "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", - "items": { - "properties": { - "body": { - "description": "Body of the breakdown, the detailed prompt content.", - "example": "This agent helps customers with product inquiries and support issues.", - "type": "string" - }, - "is_enabled": { - "default": true, - "description": "Whether this section is included in the prompt.", - "type": "boolean" - }, - "title": { - "description": "Title of the breakdown.", - "example": "Purpose", - "type": "string" - } - }, - "required": [ - "title", - "body" - ], - "type": "object" - }, - "type": "array" - }, - "dynamic_variables": { - "additionalProperties": { - "type": "string" - }, - "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", - "example": { - "customer_name": "Jane Doe", - "order_id": "ORD-12345" - }, - "type": "object" - }, - "end_call": { - "description": "Hang up automatically when a condition is met.", - "properties": { - "condition": { - "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", - "example": "End the call once the customer's issue is resolved.", - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "message": { - "description": "What the agent says before hanging up.", - "example": "Thank you for contacting us. Have a great day!", - "type": "string" - }, - "message_prompt": { - "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", - "example": "End the call politely in the same language the user is speaking.", - "type": "string" - }, - "message_type": { - "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", - "enum": [ - "static", - "prompt" - ], - "type": "string" - } - }, - "type": "object" - }, - "initial_ringing_sound_enabled": { - "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", - "type": "boolean" - }, - "is_interruption_allowed": { - "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", - "type": "boolean" - }, - "is_welcome_message_dynamic": { - "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", - "type": "boolean" - }, - "is_welcome_message_interruption": { - "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", - "type": "boolean" - }, - "languages": { - "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", - "example": [ - "English (India)", - "Hindi" - ], - "items": { - "type": "string" - }, - "type": "array" - }, - "model": { - "description": "Configuration for the language model.", - "properties": { - "model": { - "description": "The language model to use. The current catalog is returned by the LLM providers list.", - "enum": [ - "azure-gpt-4.1-mini", - "azure-gpt-4.1-nano", - "azure-gpt-4o", - "azure-gpt-4o-mini", - "gemini-2.5-flash", - "gemini-2.5-flash-lite", - "gpt-3.5-turbo", - "gpt-4.1-mini", - "gpt-4.1-nano", - "gpt-4o", - "gpt-4o-mini", - "gpt-5.1", - "llama-3.3-70b-versatile" - ], - "example": "gpt-4.1-mini", - "type": "string" - }, - "temperature": { - "description": "Controls randomness in the model's output (0.0 to 1.0).", - "example": 0.7, - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - "name": { - "description": "Name for the agent.", - "example": "Customer Support Agent", - "type": "string" - }, - "post_call_actions": { - "description": "Side effects that fire once the call ends. Configure email, webhook, or both.", - "properties": { - "email": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the email.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the email body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "recipients": { - "description": "Email addresses that should receive the notification.", - "example": [ - "support@example.com" - ], - "items": { - "format": "email", - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", - "example": [ - "completed", - "voicemail_detected" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "webhook": { - "properties": { - "enabled": { - "type": "boolean" - }, - "extracted_variables": { - "description": "Variables the model should pull out of the conversation for the webhook.", - "items": { - "properties": { - "key": { - "description": "Unique identifier for the variable in the post-call payload.", - "example": "customer_issue", - "type": "string" - }, - "prompt": { - "description": "Instruction for the model on what to pull out of the conversation.", - "example": "Identify the main issue the customer is experiencing.", - "type": "string" - } - }, - "required": [ - "key", - "prompt" - ], - "type": "object" - }, - "type": "array" - }, - "include": { - "description": "Which sections to include in the webhook body.", - "items": { - "enum": [ - "summary", - "extracted_variables", - "fullConversation", - "sentiment" - ], - "type": "string" - }, - "type": "array" - }, - "trigger_call_statuses": { - "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", - "example": [ - "completed", - "failed" - ], - "items": { - "enum": [ - "completed", - "voicemail_detected", - "failed", - "no_answer", - "busy", - "cancelled" - ], - "type": "string" - }, - "type": "array" - }, - "url": { - "description": "Endpoint that receives a POST with the call payload.", - "example": "https://your-webhook-endpoint.com/omnidim-callback", - "format": "uri", - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "transcriber": { - "description": "Configuration for the speech-to-text transcriber.", - "properties": { - "diarize": { - "description": "Identify different speakers in the transcript.", - "type": "boolean" - }, - "first_ideal_message": { - "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", - "type": "string" - }, - "interruption_min_words": { - "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", - "example": 2, - "minimum": 1, - "type": "integer" - }, - "is_first_ideal_message_dynamic": { - "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "is_second_ideal_message_dynamic": { - "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", - "type": "boolean" - }, - "language": { - "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", - "example": "en-US", - "type": "string" - }, - "max_call_duration_in_sec": { - "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", - "example": 600, - "minimum": 1, - "type": "integer" - }, - "model": { - "description": "The model to use for transcription (required when provider is `deepgram_stream`).", - "enum": [ - "nova-3", - "nova-2" - ], - "example": "nova-3", - "type": "string" - }, - "numerals": { - "description": "Convert numbers from words to digits.", - "type": "boolean" - }, - "provider": { - "description": "The speech-to-text provider to use.", - "enum": [ - "deepgram_stream", - "cartesia", - "sarvam", - "azure_stream", - "soniox" - ], - "example": "deepgram_stream", - "type": "string" - }, - "punctuate": { - "description": "Add punctuation to the transcript.", - "type": "boolean" - }, - "second_ideal_message": { - "description": "Second nudge spoken if silence continues after the first.", - "type": "string" - }, - "should_apply_noise_reduction": { - "description": "Reduce background noise on the inbound audio stream before transcription.", - "type": "boolean" - }, - "silence_timeout_ms": { - "description": "Silence timeout in milliseconds.", - "example": 400, - "type": "integer" - }, - "smart_format": { - "description": "Apply smart formatting to the transcript.", - "type": "boolean" - } - }, - "type": "object" - }, - "transfer": { - "description": "Conditional call transfer to a human agent or another number.", - "properties": { - "enabled": { - "type": "boolean" - }, - "transfer_options": { - "description": "Where to transfer the call and under what condition. The first matching condition wins.", - "items": { - "properties": { - "backup_numbers": { - "description": "Fallback numbers tried if the primary is unreachable.", - "items": { - "type": "string" - }, - "type": "array" - }, - "number": { - "description": "Primary phone number to transfer to. Include country code with leading `+`.", - "example": "+15551234567", - "type": "string" - }, - "transfer_condition": { - "description": "Natural-language condition that triggers this transfer option.", - "example": "Transfer if the customer asks to speak with a human.", - "type": "string" - }, - "transfer_message": { - "description": "Message the agent says to the caller before executing the transfer.", - "example": "Please hold while I connect you to one of our agents.", - "type": "string" - }, - "type": { - "default": "static", - "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", - "enum": [ - "static", - "dynamic" - ], - "type": "string" - } - }, - "required": [ - "number", - "transfer_condition", - "transfer_message" - ], - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "voice": { - "description": "Configuration for the text-to-speech voice.", - "properties": { - "model": { - "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", - "example": "sonic-3.5", - "type": "string" - }, - "provider": { - "description": "The voice provider to use. The current catalog is returned by the TTS providers list.", - "enum": [ - "eleven_labs", - "google", - "cartesia", - "sarvam" - ], - "example": "eleven_labs", - "type": "string" - }, - "speech_speed": { - "default": 1, - "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", - "maximum": 2, - "minimum": 0.5, - "type": "number" - }, - "voice_id": { - "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`).", - "example": "JBFqnCBsd6RMkjVDRZzb", - "type": "string" - } - }, - "type": "object" - }, - "voicemail": { - "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", - "properties": { - "enabled": { - "description": "Detect voicemail and leave your message instead of speaking to a machine.", - "type": "boolean" - }, - "message": { - "description": "Message to leave when voicemail is detected.", - "type": "string" - } - }, - "type": "object" - }, - "web_search": { - "description": "Configuration for web search capabilities.", - "properties": { - "enabled": { - "description": "Enable or disable web search functionality.", - "type": "boolean" - }, - "provider": { - "description": "The search provider to use.", - "enum": [ - "DuckDuckGo" - ], - "example": "DuckDuckGo", - "type": "string" - } - }, - "type": "object" - }, - "welcome_message": { - "description": "Initial message the agent will say when answering a call.", - "example": "Hello! How can I help you today?", - "type": "string" - } - }, - "type": "object" - }, - { - "required": [ - "name", - "welcome_message", - "context_breakdown" - ], - "type": "object" - } -]New value: +[ + { + "description": "Agent configuration.", + "properties": { + "background_track": { + "description": "Ambient background noise that plays under the agent's voice.", + "properties": { + "enabled": { + "description": "Whether to mix the ambient track under the agent's audio.", + "type": "boolean" + }, + "name": { + "description": "Ambient track to mix under the agent.", + "enum": [ + "call_center", + "filler", + "office", + "office_1", + "restaurant" + ], + "type": "string" + }, + "tts_volume_reduction": { + "description": "Amount to drop the agent's TTS volume while the ambient track plays, on a 0–1 scale. Helps the voice cut through without raising the overall mix.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "volume": { + "default": 0.2, + "description": "Volume level on a 0–1 scale. Default 0.2.", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "call_type": { + "description": "Call type of the assistant.", + "enum": [ + "Incoming", + "Outgoing" + ], + "type": "string" + }, + "context_breakdown": { + "description": "List of context breakdowns, each containing `title`, `body`, and optional `is_enabled`.", + "items": { + "properties": { + "body": { + "description": "Body of the breakdown, the detailed prompt content.", + "example": "This agent helps customers with product inquiries and support issues.", + "type": "string" + }, + "is_enabled": { + "default": true, + "description": "Whether this section is included in the prompt.", + "type": "boolean" + }, + "title": { + "description": "Title of the breakdown.", + "example": "Purpose", + "type": "string" + } + }, + "required": [ + "title", + "body" + ], + "type": "object" + }, + "type": "array" + }, + "dynamic_variables": { + "additionalProperties": { + "type": "string" + }, + "description": "Key/value map used to substitute placeholders in the agent's\nprompt and welcome message at call time. Reference a variable\nin your prompt with `{{variable_name}}`. Useful for\npersonalising the same agent across many calls.\n", + "example": { + "customer_name": "Jane Doe", + "order_id": "ORD-12345" + }, + "type": "object" + }, + "end_call": { + "description": "Hang up automatically when a condition is met.", + "properties": { + "condition": { + "description": "Natural-language condition that triggers ending the call. Only evaluated when `enabled` is true.", + "example": "End the call once the customer's issue is resolved.", + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "message": { + "description": "What the agent says before hanging up.", + "example": "Thank you for contacting us. Have a great day!", + "type": "string" + }, + "message_prompt": { + "description": "LLM prompt used to generate the closing line when `message_type` is `prompt`.", + "example": "End the call politely in the same language the user is speaking.", + "type": "string" + }, + "message_type": { + "description": "`static` speaks `message` verbatim. `prompt` treats\n`message_prompt` as an LLM instruction and generates a\nfresh closing line each call (useful for matching the\ncaller's language and tone).\n", + "enum": [ + "static", + "prompt" + ], + "type": "string" + } + }, + "type": "object" + }, + "initial_ringing_sound_enabled": { + "description": "Plays a ringing tone after the call is picked up, until the agent starts speaking.", + "type": "boolean" + }, + "is_interruption_allowed": { + "description": "Global toggle for whether the caller can interrupt the agent mid-sentence at any point in the call.", + "type": "boolean" + }, + "is_welcome_message_dynamic": { + "description": "When true, the welcome message is treated as a directive the agent uses to generate a tailored greeting for each call, rather than being spoken word for word. When false, the welcome message is spoken exactly as written.", + "type": "boolean" + }, + "is_welcome_message_interruption": { + "description": "Allow the caller to interrupt the welcome message. When false, the agent finishes speaking the welcome before listening.", + "type": "boolean" + }, + "languages": { + "description": "Languages the agent should support. Pass each language as a display-name string exactly as it appears in the dashboard's language picker. Unrecognized names are skipped.", + "example": [ + "English (India)", + "Hindi" + ], + "items": { + "type": "string" + }, + "type": "array" + }, + "model": { + "description": "Configuration for the language model.", + "properties": { + "model": { + "description": "The language model to use. The current catalog is returned by the LLM providers list.", + "enum": [ + "azure-gpt-4.1-mini", + "azure-gpt-4.1-nano", + "azure-gpt-4o", + "azure-gpt-4o-mini", + "gemini-2.5-flash", + "gemini-2.5-flash-lite", + "gpt-3.5-turbo", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4o", + "gpt-4o-mini", + "gpt-5.1", + "llama-3.3-70b-versatile" + ], + "example": "gpt-4.1-mini", + "type": "string" + }, + "temperature": { + "description": "Controls randomness in the model's output (0.0 to 1.0).", + "example": 0.7, + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "name": { + "description": "Name for the agent.", + "example": "Customer Support Agent", + "type": "string" + }, + "post_call_actions": { + "description": "Side effects that fire once the call ends. Configure email, webhook, or both.", + "properties": { + "email": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the email.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the email body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "recipients": { + "description": "Email addresses that should receive the notification.", + "example": [ + "support@example.com" + ], + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this action. Omit to\nuse the default (`completed`, `voicemail_detected`).\nPass an explicit list to also include failed calls,\nno-answers, busy signals, etc.\n", + "example": [ + "completed", + "voicemail_detected" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no_answer", + "busy", + "cancelled" + ], + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "webhook": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extracted_variables": { + "description": "Variables the model should pull out of the conversation for the webhook.", + "items": { + "properties": { + "key": { + "description": "Unique identifier for the variable in the post-call payload.", + "example": "customer_issue", + "type": "string" + }, + "prompt": { + "description": "Instruction for the model on what to pull out of the conversation.", + "example": "Identify the main issue the customer is experiencing.", + "type": "string" + } + }, + "required": [ + "key", + "prompt" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "description": "Which sections to include in the webhook body.", + "items": { + "enum": [ + "summary", + "extracted_variables", + "fullConversation", + "sentiment" + ], + "type": "string" + }, + "type": "array" + }, + "trigger_call_statuses": { + "description": "Call outcomes that should fire this webhook. Omit to\nuse the default (`completed`, `voicemail_detected`).\n", + "example": [ + "completed", + "failed" + ], + "items": { + "enum": [ + "completed", + "voicemail_detected", + "failed", + "no_answer", + "busy", + "cancelled" + ], + "type": "string" + }, + "type": "array" + }, + "url": { + "description": "Endpoint that receives a POST with the call payload.", + "example": "https://your-webhook-endpoint.com/omnidim-callback", + "format": "uri", + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "transcriber": { + "description": "Configuration for the speech-to-text transcriber.", + "properties": { + "diarize": { + "description": "Identify different speakers in the transcript.", + "type": "boolean" + }, + "first_ideal_message": { + "description": "First nudge spoken when the caller goes silent past the\nidle threshold. Set `is_first_ideal_message_dynamic` to\n`true` to have the LLM regenerate this each time.\n", + "type": "string" + }, + "interruption_min_words": { + "description": "Minimum number of words the caller must say before their speech is treated as an interruption.", + "example": 2, + "minimum": 1, + "type": "integer" + }, + "is_first_ideal_message_dynamic": { + "description": "When true, `first_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "is_second_ideal_message_dynamic": { + "description": "When true, `second_ideal_message` is treated as a prompt and the LLM generates a fresh nudge each call.", + "type": "boolean" + }, + "language": { + "description": "Language code for the transcriber. Format and supported\nvalues depend on the provider (e.g. `en-US` for Deepgram,\n`hi-IN` for Sarvam). Applies regardless of which\n`provider` is selected.\n", + "example": "en-US", + "type": "string" + }, + "max_call_duration_in_sec": { + "description": "Hard upper bound on call length in seconds. The agent will end the call once this is reached.", + "example": 600, + "minimum": 1, + "type": "integer" + }, + "model": { + "description": "The model to use for transcription (required when provider is `deepgram_stream`).", + "enum": [ + "nova-3", + "nova-2" + ], + "example": "nova-3", + "type": "string" + }, + "numerals": { + "description": "Convert numbers from words to digits.", + "type": "boolean" + }, + "provider": { + "description": "The speech-to-text provider to use.", + "enum": [ + "deepgram_stream", + "cartesia", + "sarvam", + "azure_stream", + "soniox" + ], + "example": "deepgram_stream", + "type": "string" + }, + "punctuate": { + "description": "Add punctuation to the transcript.", + "type": "boolean" + }, + "second_ideal_message": { + "description": "Second nudge spoken if silence continues after the first.", + "type": "string" + }, + "should_apply_noise_reduction": { + "description": "Reduce background noise on the inbound audio stream before transcription.", + "type": "boolean" + }, + "silence_timeout_ms": { + "description": "Silence timeout in milliseconds.", + "example": 400, + "type": "integer" + }, + "smart_format": { + "description": "Apply smart formatting to the transcript.", + "type": "boolean" + } + }, + "type": "object" + }, + "transfer": { + "description": "Conditional call transfer to a human agent or another number.", + "properties": { + "enabled": { + "type": "boolean" + }, + "transfer_options": { + "description": "Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them.", + "items": { + "properties": { + "backup_numbers": { + "description": "Fallback numbers tried if the primary is unreachable.", + "items": { + "type": "string" + }, + "type": "array" + }, + "number": { + "description": "Primary phone number to transfer to. Include country code with leading `+`.", + "example": "+15551234567", + "type": "string" + }, + "transfer_condition": { + "description": "Natural-language condition that triggers this transfer option.", + "example": "Transfer if the customer asks to speak with a human.", + "type": "string" + }, + "transfer_message": { + "description": "Message the agent says to the caller before executing the transfer.", + "example": "Please hold while I connect you to one of our agents.", + "type": "string" + }, + "type": { + "default": "static", + "description": "`static` transfers to `number`. `dynamic` lets the agent\npick a number at runtime based on the conversation.\n", + "enum": [ + "static", + "dynamic" + ], + "type": "string" + } + }, + "required": [ + "number", + "transfer_condition", + "transfer_message" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "voice": { + "dependentRequired": { + "provider": [ + "voice_id" + ] + }, + "description": "Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently.", + "properties": { + "model": { + "description": "TTS model identifier. Only consumed when `provider` is\n`cartesia` (e.g. `sonic-3.5`). For ElevenLabs and other\nproviders the model is implied by `voice_id` and this\nfield is ignored.\n", + "example": "sonic-3.5", + "type": "string" + }, + "provider": { + "description": "The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it.", + "enum": [ + "eleven_labs", + "google", + "cartesia", + "sarvam" + ], + "example": "eleven_labs", + "type": "string" + }, + "speech_speed": { + "default": 1, + "description": "Playback speed multiplier for the agent's voice. 1.0 is normal speed.", + "maximum": 2, + "minimum": 0.5, + "type": "number" + }, + "voice_id": { + "description": "The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it.", + "example": "JBFqnCBsd6RMkjVDRZzb", + "type": "string" + } + }, + "type": "object" + }, + "voicemail": { + "description": "Voicemail / answering-machine handling for outbound calls. Set this with the nested object shown here; the agent object returns these values as the flat fields `voicemail_enabled` and `voicemail_message`. Voicemail detection is an access-gated feature. If it isn't enabled for your account, [request access](https://omnidim.io/contact-us?reason=product&lock=1).", + "properties": { + "enabled": { + "description": "Detect voicemail and leave your message instead of speaking to a machine.", + "type": "boolean" + }, + "message": { + "description": "Message to leave when voicemail is detected.", + "type": "string" + } + }, + "type": "object" + }, + "web_search": { + "description": "Configuration for web search capabilities.", + "properties": { + "enabled": { + "description": "Enable or disable web search functionality.", + "type": "boolean" + }, + "provider": { + "description": "The search provider to use.", + "enum": [ + "DuckDuckGo" + ], + "example": "DuckDuckGo", + "type": "string" + } + }, + "type": "object" + }, + "welcome_message": { + "description": "Initial message the agent will say when answering a call.", + "example": "Hello! How can I help you today?", + "type": "string" + } + }, + "type": "object" + }, + { + "required": [ + "name", + "welcome_message", + "context_breakdown" + ], + "type": "object" + } +]
- Changed
updateAgent5 fields changed- changed
Input schema / properties / requestBody / properties / transfer / properties / transfer_options / descriptionPrevious value: -"Where to transfer the call and under what condition. The first matching condition wins."New value: +"Where to transfer the call and under what condition. The first matching condition wins. In an agent update, sending this list replaces all saved options. Omit it to keep them unchanged, or send an empty array to clear them." - added
Input schema / properties / requestBody / properties / voice / dependentRequiredAdded value: +{ + "provider": [ + "voice_id" + ] +} - changed
Input schema / properties / requestBody / properties / voice / descriptionPrevious value: -"Configuration for the text-to-speech voice."New value: +"Configuration for the text-to-speech voice. `provider` and `voice_id` identify the voice together, so send both to change it. `provider` on its own is not accepted, and a `voice_id` on its own leaves the voice as it was. The other fields here apply independently." - changed
Input schema / properties / requestBody / properties / voice / properties / provider / descriptionPrevious value: -"The voice provider to use. The current catalog is returned by the TTS providers list."New value: +"The voice provider to use. The current catalog is returned by the TTS providers list. Send `voice_id` alongside it." - changed
Input schema / properties / requestBody / properties / voice / properties / voice_id / descriptionPrevious value: -"The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`)."New value: +"The provider's voice identifier, returned in the `name` field of the voices list (not the numeric `id`). Takes effect when `provider` is sent alongside it."
49 tool updates
v0.9.0- First observed
addBulkCallContact - First observed
addUser - First observed
attachKnowledgeBaseFiles - First observed
attachPhoneNumber - First observed
bulkCallActions - First observed
calculateCreditOperation - First observed
cancelBulkCall - First observed
canUploadFile - First observed
createAgent - First observed
createAgentVersion - First observed
createBulkCall - First observed
createSession - First observed
deleteAgent - First observed
deleteAgentVersion - First observed
deleteKnowledgeBaseFile - First observed
detachKnowledgeBaseFiles - First observed
detachPhoneNumber - First observed
diffAgentVersion - First observed
dispatchCall - First observed
fetchBulkCalls - First observed
getAgent - First observed
getBulkCall - First observed
getBulkCallLiveStatus - First observed
getCallLog - First observed
getResellerCreditLogs - First observed
getVoice - First observed
importExotelNumber - First observed
importSipTrunk - First observed
importTwilioNumber - First observed
listAgents - First observed
listAgentVersions - First observed
listAllProviders - First observed
listCallLogs - First observed
listChildOrganizations - First observed
listKnowledgeBaseFiles - First observed
listLLMProviders - First observed
listPhoneNumbers - First observed
listSTTProviders - First observed
listTTSProviders - First observed
listVoices - First observed
renameAgentVersion - First observed
restoreAgentVersion - First observed
revertCreditsFromChild - First observed
setChildConcurrency - First observed
setUserAccessControl - First observed
setUserExpiry - First observed
transferCreditsToChild - First observed
updateAgent - First observed
uploadKnowledgeBaseFile
TDQS
Scored across 79 tools
Most tools target a clearly distinct resource+action, and the descriptions actively disambiguate overlapping cases (e.g. updateAgent vs. updatePostCallAction vs. addPostCallAction, and testWorkflow vs. getWorkflowExecution). Some overlap remains among the provider tools (listLLMProviders/listSTTProviders/listTTSProviders/listAllProviders/getVoice/listVoices) and the multiple agent-version tools, but the boundaries are generally spelled out.
The set is almost entirely camelCase verb_noun (createAgent, listCallLogs, deleteWorkflow, publishWorkflow), which is very predictable. The one clear deviation is bulkCallActions, a noun phrase with no leading verb, breaking the otherwise uniform verb_noun pattern.
At 79 tools this is far beyond the 25+ 'heavy' threshold, even for a broad voice-AI platform. The surface legitimately spans many subdomains (agents, calls, bulk calls, workflows, numbers, voices, KB, billing), and the tags group them well, but the count is still excessive and several endpoint families could be consolidated.
Coverage is broad and lifecycle-complete across most domains: full CRUD for agents, versions (diff/restore/rename), workflows (create/edit/validate/publish/activate), bulk calls (create/start/retry/contacts/numbers/status), phone numbers, voice cloning, knowledge base, and billing. Only minor gaps exist, such as per-resource lookup helpers or session lifecycle management beyond creation.
Maintenance
Related MCP Connectors
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Ovanek MCP: Model Context Protocol server for Ovanek platform tools; writes are dry-run by default.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that supports STDIO, SSE and Streamable HTTP protocols for AI model interactions.9 npm1MIT
- AlicenseBqualityDmaintenanceA minimal local MCP server that wraps any Claude Messages API-compatible upstream into a unified ask_model tool. It enables MCP clients to interact with these models through a standard tool interface using stdio transport.18MIT
- FlicenseAqualityDmaintenanceMCP server that wraps MiniMax platform APIs (speech, video, image, music, and file management) as tools over stdio, enabling natural language interaction with MiniMax's AI services.161-
- AlicenseNot gradedqualityBmaintenanceProvides a stdio MCP server for single-user local operation of the otaman platform, enabling agent orchestration, slash commands, and skill management within Claude Code without a remote bridge daemon.2AGPL 3.0