curl --request POST \ --url https://voice-api.onclarity.com/v1/projects/{projectId}/tools \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "lookup_order", "description": "Look up an order by its number and return its status.", "type": "http", "configs": { "url": "https://api.example.com/orders", "method": "GET", "query_params": [ { "name": "number", "value": "{{order_number}}" } ], "authentication": { "type": "bearer", "token": "vault:orders_api_token" } }, "parameters": { "type": "object", "required": [ "order_number" ], "properties": { "order_number": { "type": "string", "description": "The order number the caller reads out." } } }, "hold_message": "One moment while I check that order."}'
import requests
url = "https://voice-api.onclarity.com/v1/projects/{projectId}/tools"
payload = {
"name": "lookup_order",
"description": "Look up an order by its number and return its status.",
"type": "http",
"configs": {
"url": "https://api.example.com/orders",
"method": "GET",
"query_params": [
{
"name": "number",
"value": "{{order_number}}"
}
],
"authentication": {
"type": "bearer",
"token": "vault:orders_api_token"
}
},
"parameters": {
"type": "object",
"required": ["order_number"],
"properties": { "order_number": {
"type": "string",
"description": "The order number the caller reads out."
} }
},
"hold_message": "One moment while I check that order."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'lookup_order',
description: 'Look up an order by its number and return its status.',
type: 'http',
configs: {
url: 'https://api.example.com/orders',
method: 'GET',
query_params: [{name: 'number', value: '{{order_number}}'}],
authentication: {type: 'bearer', token: 'vault:orders_api_token'}
},
parameters: {
type: 'object',
required: ['order_number'],
properties: {
order_number: {type: 'string', description: 'The order number the caller reads out.'}
}
},
hold_message: 'One moment while I check that order.'
})
};
fetch('https://voice-api.onclarity.com/v1/projects/{projectId}/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
{ "id": "6e2a4c8d-1b3f-4a5c-9d7e-0f1a2b3c4d5e", "project_id": "3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13", "agent_id": null, "name": "lookup_order", "description": "Look up an order by its number and return its status.", "type": "http", "configs": { "url": "https://api.example.com/orders", "method": "GET", "query_params": [ { "name": "number", "value": "{{order_number}}" } ], "authentication": { "type": "bearer", "token": "vault:orders_api_token" } }, "parameters": { "type": "object", "required": [ "order_number" ], "properties": { "order_number": { "type": "string", "description": "The order number the caller reads out." } } }, "parameter_mapping": null, "hold_message": "One moment while I check that order.", "hold_messages": null, "async_config": null, "session": null, "updated_at": 1794393600000, "library_tool_id": null, "library_revision": null, "library_channels": null}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "Invalid or revoked token"
}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "tool_name_already_exists_for_agent",
"project_id": "3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13",
"agent_id": null,
"name": "lookup_order",
"hint": "A project-global tool with this name already exists."
}
{
"error": "configs: For type http, configs.url is required (a non-empty string)",
"issues": [
{
"path": "configs",
"code": "custom",
"message": "For type http, configs.url is required (a non-empty string)"
}
]
}
{
"error": "<string>",
"code": "<string>"
}
Tools
Create a tool
Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent’s draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.
POST
/
v1
/
projects
/
{projectId}
/
tools
Create a tool
curl --request POST \ --url https://voice-api.onclarity.com/v1/projects/{projectId}/tools \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "lookup_order", "description": "Look up an order by its number and return its status.", "type": "http", "configs": { "url": "https://api.example.com/orders", "method": "GET", "query_params": [ { "name": "number", "value": "{{order_number}}" } ], "authentication": { "type": "bearer", "token": "vault:orders_api_token" } }, "parameters": { "type": "object", "required": [ "order_number" ], "properties": { "order_number": { "type": "string", "description": "The order number the caller reads out." } } }, "hold_message": "One moment while I check that order."}'
import requests
url = "https://voice-api.onclarity.com/v1/projects/{projectId}/tools"
payload = {
"name": "lookup_order",
"description": "Look up an order by its number and return its status.",
"type": "http",
"configs": {
"url": "https://api.example.com/orders",
"method": "GET",
"query_params": [
{
"name": "number",
"value": "{{order_number}}"
}
],
"authentication": {
"type": "bearer",
"token": "vault:orders_api_token"
}
},
"parameters": {
"type": "object",
"required": ["order_number"],
"properties": { "order_number": {
"type": "string",
"description": "The order number the caller reads out."
} }
},
"hold_message": "One moment while I check that order."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'lookup_order',
description: 'Look up an order by its number and return its status.',
type: 'http',
configs: {
url: 'https://api.example.com/orders',
method: 'GET',
query_params: [{name: 'number', value: '{{order_number}}'}],
authentication: {type: 'bearer', token: 'vault:orders_api_token'}
},
parameters: {
type: 'object',
required: ['order_number'],
properties: {
order_number: {type: 'string', description: 'The order number the caller reads out.'}
}
},
hold_message: 'One moment while I check that order.'
})
};
fetch('https://voice-api.onclarity.com/v1/projects/{projectId}/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
{ "id": "6e2a4c8d-1b3f-4a5c-9d7e-0f1a2b3c4d5e", "project_id": "3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13", "agent_id": null, "name": "lookup_order", "description": "Look up an order by its number and return its status.", "type": "http", "configs": { "url": "https://api.example.com/orders", "method": "GET", "query_params": [ { "name": "number", "value": "{{order_number}}" } ], "authentication": { "type": "bearer", "token": "vault:orders_api_token" } }, "parameters": { "type": "object", "required": [ "order_number" ], "properties": { "order_number": { "type": "string", "description": "The order number the caller reads out." } } }, "parameter_mapping": null, "hold_message": "One moment while I check that order.", "hold_messages": null, "async_config": null, "session": null, "updated_at": 1794393600000, "library_tool_id": null, "library_revision": null, "library_channels": null}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "Invalid or revoked token"
}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "<string>",
"code": "<string>"
}
{
"error": "tool_name_already_exists_for_agent",
"project_id": "3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13",
"agent_id": null,
"name": "lookup_order",
"hint": "A project-global tool with this name already exists."
}
{
"error": "configs: For type http, configs.url is required (a non-empty string)",
"issues": [
{
"path": "configs",
"code": "custom",
"message": "For type http, configs.url is required (a non-empty string)"
}
]
}
{
"error": "<string>",
"code": "<string>"
}
Authorizations
Authorization
string
header
required
Your organization API key (it starts with anek_org_). The same key works on the Voice API and the Support API. See Authentication.
Path Parameters
projectId
string
required
Project id
Body
application/json
Fields not listed here are ignored.
name
string
required
The name the model calls the tool by: a letter, then letters, digits and underscores. Unique among the project-wide tools, or among the agent's private tools.
Minimum string length: 1
Pattern: ^[a-zA-Z][a-zA-Z0-9_]*$
description
string
What the tool does and when to use it. The model reads it to decide when to call the tool.
agent_id
string | null
Make the tool private to this agent and attach it to the agent's draft. Leave it out (or null) for a project-wide tool.
type
enum<string>
default:http
http calls your API, knowledgebase searches your organization's knowledge base, code runs your Python code, builtin controls the call (transfer it, collect keypad digits, end it), workflow runs a Clarity workflow, messaging sends a WhatsApp message or an email, handoff moves the conversation to a chat agent.
Available options:
http,
knowledgebase,
code,
builtin,
workflow,
messaging,
handoff,
ticket
configs
http · object
The tool's configuration. Its shape depends on the tool's type, and it is checked against that type; on update without type, against the stored type. builtin takes one of three shapes, by action.
http
knowledgebase
code
builtin get_dtmf
builtin connect_to_human
builtin (other)
workflow
WhatsApp
Email
WhatsApp
Email
ticket
Show child attributes
parameters
object | null
JSON Schema (type: object, properties, required) of the arguments the model passes. A knowledgebase tool always takes one query string, whatever you send.
Example:
{ "type": "object", "required": ["order_number"], "properties": { "order_number": { "type": "string", "description": "The order number the caller reads out." } } }
parameter_mapping
object | null
Renames arguments before the request is built, {argument: request_field}.
Show child attributes
hold_message
string | null
What the agent says while the tool runs. Blank or null says nothing.
hold_messages
object | null
The hold message per language of a multilingual agent, keyed by the agent's language label (such as English (US)). A missing language falls back to hold_message.
Show child attributes
async_config
object | null
Lets the conversation go on while the tool runs instead of waiting for the result. Not allowed on builtin tools. null turns it off.
Show child attributes
session
object | null
The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null verification makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.
Show child attributes
channels
enum<string>[]
Used only when your organization shares tools between projects through its tool library: which kinds of agents can use this project-wide tool. Ignored otherwise.
Required array length: 1 - 2 elements
Available options:
chat,
voice
Response
The tool was created.
A tool an agent can call during a conversation. Project-wide tools (agent_id: null) can be attached to any agent of the project; a private tool belongs to one agent.
id
string
required
Tool id.
project_id
string
required
agent_id
string | null
required
The agent the tool is private to, or null for a project-wide tool.
name
string
required
The name the model calls the tool by.
description
string
required
What the tool does and when to use it, as the model reads it.
type
string
required
What the tool does, which decides the shape of configs: http, knowledgebase, code, builtin, workflow, messaging, handoff or ticket.
configs
object
required
The tool's configuration, in the shape of its type (see configs in Create a tool). It can also carry values Clarity fills in on save, such as a workflow's url or a knowledge base's search target.
parameters
object
required
JSON Schema of the arguments the model passes when it calls the tool.
parameter_mapping
object | null
required
Renames arguments before the request is built, {argument: request_field}. null when none.
Show child attributes
hold_message
string | null
required
What the agent says while the tool runs, or null for nothing.
hold_messages
object | null
required
The hold message per language of a multilingual agent, keyed by language label.
Show child attributes
async_config
object | null
required
Settings that let the conversation go on while the tool runs, in the shape of async_config in Create a tool. null means the agent waits for the result.
session
object | null
required
The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null verification makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.
Show child attributes
updated_at
integer<int64> | null
required
When the tool was last changed, in milliseconds since the Unix epoch. null for a tool not changed since this field was added.
library_tool_id
string | null
The organization tool library entry this tool comes from, or null for a tool that belongs to this project only.
library_revision
integer | null
The library entry's revision this tool holds, or null.
library_channels
string[] | null
Which kinds of agents (chat, voice) can use the library entry, or null.
used_by_count
integer
How many agents of the project have the tool attached. A published agent keeps calling the tool it was published with until it is published again, whatever this count says. Present on reads and lists.
used_by_agents
object[]
The agents the tool is attached to. Returned when you get one tool, not in lists.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Clarity Support Docs","description":"Guides, SDKs, and API reference for Clarity's AI support platform: agents, chat, tickets, and the knowledge base.","colors":{"primary":"#0aa68a","light":"#24d8b8","dark":"#0aa68a"},"logo":{"light":"https://mintcdn.com/on-clarity/wANpiWtgQORdXhk3/logo/light.svg?fit=max\u0026auto=format\u0026n=wANpiWtgQORdXhk3\u0026q=85\u0026s=a67bcf8cb635c40e2371c3f86424d4a0","dark":"https://mintcdn.com/on-clarity/wANpiWtgQORdXhk3/logo/dark.svg?fit=max\u0026auto=format\u0026n=wANpiWtgQORdXhk3\u0026q=85\u0026s=577dc99ab10bac95f81c97fcc3e50097","href":"https://support.onclarity.com"},"favicon":"https://mintcdn.com/on-clarity/wANpiWtgQORdXhk3/favicon.png?fit=max\u0026auto=format\u0026n=wANpiWtgQORdXhk3\u0026q=85\u0026s=54c44b3a75b63a1416d10cc8096b97e6","api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","python","javascript"]}},"appearance":{"default":"system"},"navbar":{"links":[{"href":"mailto:hello@onclarity.com","label":"Support"}],"primary":{"type":"button","label":"Open Clarity","href":"https://support.onclarity.com"}},"footer":{"socials":{"website":"https://www.onclarity.com","linkedin":"https://www.linkedin.com/company/onclarity"},"links":[{"header":"Product","items":[{"label":"Open Clarity","href":"https://support.onclarity.com"}]},{"header":"Legal","items":[{"label":"Terms of service","href":"https://www.onclarity.com/legal-pages/terms-of-service"},{"label":"Privacy policy","href":"https://www.onclarity.com/legal-pages/privacy-policy"}]}]},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Open Clarity","icon":"arrow-up-right-from-square","href":"https://support.onclarity.com"},{"anchor":"Support","icon":"envelope","href":"mailto:hello@onclarity.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"on-clarity","hasAudioNarration":false,"actualSubdomain":"on-clarity","customDomains":["docs.support.onclarity.com"],"gitSource":{"type":"github","owner":"anecdote-ai","repo":"anecdote-monorepo","deployBranch":"develop","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":"","_id":"6adb3a2646b60ddf4f03b4cf"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af83d74f1de041cd0119a62","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"API Reference","count":130},{"language":"default","tag":"Voice API","count":88},{"language":"default","tag":"Support API","count":40},{"language":"default","tag":"Evals","count":32},{"language":"default","tag":"Documentation","count":23},{"language":"default","tag":"Runs","count":16},{"language":"default","tag":"Telephony","count":16},{"language":"default","tag":"Campaigns","count":12},{"language":"default","tag":"Tickets","count":11},{"language":"default","tag":"Agents","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/voice/tools/create-a-tool","slug":"/api-reference/voice/tools/create-a-tool","pageMetadata":{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/tools","title":"Create a tool","icon":"wrench","description":"Creates a tool. Without `agent_id` it is project-wide, so any agent of the project can use it; with `agent_id` it is private to that agent and attached to the agent's draft straight away. The shape of `configs` depends on `type` (default `http`). A tool reaches live calls only once an agent using it is published.","href":"/api-reference/voice/tools/create-a-tool"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Creates a tool. Without \", _jsx(_components.code, {\n children: \"agent_id\"\n }), \" it is project-wide, so any agent of the project can use it; with \", _jsx(_components.code, {\n children: \"agent_id\"\n }), \" it is private to that agent and attached to the agent’s draft straight away. The shape of \", _jsx(_components.code, {\n children: \"configs\"\n }), \" depends on \", _jsx(_components.code, {\n children: \"type\"\n }), \" (default \", _jsx(_components.code, {\n children: \"http\"\n }), \"). A tool reaches live calls only once an agent using it is published.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/tools","title":"Create a tool","icon":"wrench","description":"Creates a tool. Without `agent_id` it is project-wide, so any agent of the project can use it; with `agent_id` it is private to that agent and attached to the agent's draft straight away. The shape of `configs` depends on `type` (default `http`). A tool reaches live calls only once an agent using it is published.","href":"/api-reference/voice/tools/create-a-tool"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Tools"],"summary":"Create a tool","description":"Creates a tool. Without `agent_id` it is project-wide, so any agent of the project can use it; with `agent_id` it is private to that agent and attached to the agent's draft straight away. The shape of `configs` depends on `type` (default `http`). A tool reaches live calls only once an agent using it is published.","operationId":"createTool","requestBody":"aa326504-e329-4a85-94b4-810d2976f8cc","responses":{"201":"56f9fe53-7412-43aa-b232-85b59fb5c692","400":"40ae8b1d-424b-453d-8a88-34e5dfba690e","401":"33721c65-5af2-4e62-a8df-a9049d1f8008","403":"76c14ff1-862b-4e1a-94e4-1b168f4813bb","404":"2e03883d-fae5-48a2-924b-80aad1b13c95","409":"da1732b2-29fe-4aa3-bbaf-fe10b343c32e","422":"145d0682-9db9-490d-8cac-ccf73a74f1d6","502":"01ebd394-d957-48b5-bdc4-74b9022cf6a3"},"method":"post","type":"path","servers":["c1b5bfaf-ca83-44db-afe9-8385e654f187"],"security":["79258329-9c11-41e2-825c-e7e86baa03e6"],"path":"/v1/projects/{projectId}/tools","baseUrlOptions":["https://voice-api.onclarity.com"],"title":"Create a tool","codeSamples":[],"requestExampleLanguages":["bash","python","javascript"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c66e0f03-f5d3-40e3-b95a-60c021952eac":{"name":"projectId","in":"path","required":true,"schema":{"type":"string","isRequired":true,"description":"Project id","uniqueKey":"","typeLabel":"string"},"description":"Project id"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"description":"Fields not listed here are ignored.","properties":{"name":{"type":"string","minLength":1,"pattern":"^[a-zA-Z][a-zA-Z0-9_]*$","description":"The name the model calls the tool by: a letter, then letters, digits and underscores. Unique among the project-wide tools, or among the agent's private tools.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"description":{"type":"string","description":"What the tool does and when to use it. The model reads it to decide when to call the tool.","uniqueKey":"description","typeLabel":"string"},"agent_id":{"oneOf":[{"type":"string","description":"Make the tool private to this agent and attach it to the agent's draft. Leave it out (or `null`) for a project-wide tool.","uniqueKey":"agent_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Make the tool private to this agent and attach it to the agent's draft. Leave it out (or `null`) for a project-wide tool.","uniqueKey":"agent_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_id","typeLabel":"string | null"},"type":{"type":"string","enum":["http","knowledgebase","code","builtin","workflow","messaging","handoff","ticket"],"default":"http","description":"`http` calls your API, `knowledgebase` searches your organization's knowledge base, `code` runs your Python code, `builtin` controls the call (transfer it, collect keypad digits, end it), `workflow` runs a Clarity workflow, `messaging` sends a WhatsApp message or an email, `handoff` moves the conversation to a chat agent.","uniqueKey":"type","typeLabel":"enum\u003cstring>"},"configs":{"oneOf":[{"type":"object","title":"http","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["url"],"properties":{"url":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.0.url","typeLabel":"string"},"method":{"type":"string","description":"The HTTP method, such as `GET` or `POST`.","uniqueKey":"configs.oneOf.0.method","typeLabel":"string"},"authentication":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["none","bearer","api_key","oauth2"],"uniqueKey":"configs.oneOf.0.authentication.type","typeLabel":"enum\u003cstring>"},"token":{"type":"string","description":"`bearer`: the token, or `vault:\u003csecret name>`.","uniqueKey":"configs.oneOf.0.authentication.token","typeLabel":"string"},"key":{"type":"string","description":"`api_key`: the key, or `vault:\u003csecret name>`.","uniqueKey":"configs.oneOf.0.authentication.key","typeLabel":"string"},"header":{"type":"string","description":"`api_key`: the header that carries the key.","uniqueKey":"configs.oneOf.0.authentication.header","typeLabel":"string"},"credential":{"type":"string","minLength":1,"description":"`oauth2` (required): the name of an OAuth credential of the project. Clarity gets a token for each call.","uniqueKey":"configs.oneOf.0.authentication.credential","typeLabel":"string"},"scopes":{"type":"array","items":{"type":"string","uniqueKey":"configs.oneOf.0.authentication.scopes.items.[INDEX]","typeLabel":"string"},"description":"`oauth2`: scopes to ask for, a subset of the credential's.","uniqueKey":"configs.oneOf.0.authentication.scopes","typeLabel":"string[]"}},"uniqueKey":"configs.oneOf.0.authentication","typeLabel":"object"},"header_list":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["name","value"],"properties":{"name":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.0.header_list.items.[INDEX].name","typeLabel":"string"},"value":{"type":"string","description":"May include `{{argument}}` and call variables, filled in when the tool runs.","isRequired":true,"uniqueKey":"configs.oneOf.0.header_list.items.[INDEX].value","typeLabel":"string"}},"uniqueKey":"configs.oneOf.0.header_list.items.[INDEX]","typeLabel":"object"},"description":"Request headers, in order.","uniqueKey":"configs.oneOf.0.header_list","typeLabel":"object[]"},"query_params":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["name","value"],"properties":{"name":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.0.query_params.items.[INDEX].name","typeLabel":"string"},"value":{"type":"string","description":"May include `{{argument}}` and call variables, filled in when the tool runs.","isRequired":true,"uniqueKey":"configs.oneOf.0.query_params.items.[INDEX].value","typeLabel":"string"}},"uniqueKey":"configs.oneOf.0.query_params.items.[INDEX]","typeLabel":"object"},"description":"Query-string parameters, in order.","uniqueKey":"configs.oneOf.0.query_params","typeLabel":"object[]"},"body_type":{"type":"string","enum":["none","form_data","json","raw"],"description":"How the body is built. Without it the arguments are placed by `request_placement`.","uniqueKey":"configs.oneOf.0.body_type","typeLabel":"enum\u003cstring>"},"body_form":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["name","value"],"properties":{"name":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.0.body_form.items.[INDEX].name","typeLabel":"string"},"value":{"type":"string","description":"May include `{{argument}}` and call variables, filled in when the tool runs.","isRequired":true,"uniqueKey":"configs.oneOf.0.body_form.items.[INDEX].value","typeLabel":"string"}},"uniqueKey":"configs.oneOf.0.body_form.items.[INDEX]","typeLabel":"object"},"description":"`body_type: form_data`: the form fields.","uniqueKey":"configs.oneOf.0.body_form","typeLabel":"object[]"},"body_json":{"type":"string","description":"`body_type: json`: the JSON body as text.","uniqueKey":"configs.oneOf.0.body_json","typeLabel":"string"},"body_raw":{"type":"string","description":"`body_type: raw`: the body text.","uniqueKey":"configs.oneOf.0.body_raw","typeLabel":"string"},"body_content_type":{"type":"string","description":"`body_type: raw`: its content type. Default `text/plain`.","uniqueKey":"configs.oneOf.0.body_content_type","typeLabel":"string"},"headers":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"configs.oneOf.0.headers.additionalProperties","typeLabel":"string"},"description":"Older form of `header_list`, a map of header to value.","uniqueKey":"configs.oneOf.0.headers","typeLabel":"object"},"request_placement":{"type":"string","enum":["body","query","path"],"description":"Older form. Where arguments go when `parameter_placement` does not say.","uniqueKey":"configs.oneOf.0.request_placement","typeLabel":"enum\u003cstring>"},"parameter_placement":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"configs.oneOf.0.parameter_placement.additionalProperties","typeLabel":"string"},"description":"Older form. Where each argument goes (`body`, `query` or `path`), by request field.","uniqueKey":"configs.oneOf.0.parameter_placement","typeLabel":"object"},"timeout_ms":{"type":"integer","minimum":1,"description":"Request timeout in milliseconds.","uniqueKey":"configs.oneOf.0.timeout_ms","typeLabel":"integer"},"unresolved":{"type":"boolean","description":"Set by Clarity when the OAuth credential cannot be found. Leave it out.","uniqueKey":"configs.oneOf.0.unresolved","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.0","typeLabel":"http · object"},{"type":"object","title":"knowledgebase","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["source","all_articles"],"properties":{"source":{"type":"string","enum":["support_org"],"isRequired":true,"uniqueKey":"configs.oneOf.1.source","typeLabel":"enum\u003cstring>"},"all_articles":{"type":"boolean","description":"Search every article. `collection_ids` and `article_ids` must then be empty.","isRequired":true,"uniqueKey":"configs.oneOf.1.all_articles","typeLabel":"boolean"},"collection_ids":{"type":"array","uniqueItems":true,"items":{"type":"string","minLength":1,"uniqueKey":"configs.oneOf.1.collection_ids.items.[INDEX]","typeLabel":"string"},"description":"Search only these collections.","uniqueKey":"configs.oneOf.1.collection_ids","typeLabel":"string[]"},"article_ids":{"type":"array","uniqueItems":true,"items":{"minimum":1,"type":"integer","uniqueKey":"configs.oneOf.1.article_ids.items.[INDEX]","typeLabel":"integer"},"description":"Search only these articles.","uniqueKey":"configs.oneOf.1.article_ids","typeLabel":"integer[]"},"article_titles":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"configs.oneOf.1.article_titles.additionalProperties","typeLabel":"string"},"description":"Article titles by id, for display.","uniqueKey":"configs.oneOf.1.article_titles","typeLabel":"object"},"max_articles":{"type":"integer","minimum":1,"maximum":20,"description":"The most articles a search returns. Default 5.","uniqueKey":"configs.oneOf.1.max_articles","typeLabel":"integer"},"embedding_config":{"oneOf":[{"type":"object","additionalProperties":true,"description":"How queries are embedded, when your articles were indexed with a non-default setup. `null` clears it.","uniqueKey":"configs.oneOf.1.embedding_config.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"How queries are embedded, when your articles were indexed with a non-default setup. `null` clears it.","uniqueKey":"configs.oneOf.1.embedding_config.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.1.embedding_config","typeLabel":"object | null"},"proxy_url":{"type":"string","description":"Filled in by Clarity on save. Leave it out.","uniqueKey":"configs.oneOf.1.proxy_url","typeLabel":"string"},"server_url":{"type":"string","description":"Filled in by Clarity on save. Leave it out.","uniqueKey":"configs.oneOf.1.server_url","typeLabel":"string"},"collection_id":{"type":"string","description":"Filled in by Clarity on save. Leave it out.","uniqueKey":"configs.oneOf.1.collection_id","typeLabel":"string"},"api_key":{"type":"string","description":"Filled in by Clarity on save. Leave it out.","uniqueKey":"configs.oneOf.1.api_key","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.1","typeLabel":"knowledgebase · object"},{"type":"object","title":"code","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["code"],"properties":{"code":{"type":"string","minLength":1,"description":"Python source defining `execute(args)`. Its return value is the tool result.","isRequired":true,"uniqueKey":"configs.oneOf.2.code","typeLabel":"string"},"timeout_ms":{"type":"integer","minimum":1000,"maximum":120000,"description":"How long the code may run, in milliseconds. Default 30000.","uniqueKey":"configs.oneOf.2.timeout_ms","typeLabel":"integer"},"secrets":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"configs.oneOf.2.secrets.additionalProperties","typeLabel":"string"},"description":"Values passed to the code with the arguments but never shown to the model, by name. A value can be `vault:\u003csecret name>`.","uniqueKey":"configs.oneOf.2.secrets","typeLabel":"object"},"session_inputs":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","uniqueKey":"configs.oneOf.2.session_inputs.items.[INDEX]","typeLabel":"string"},"description":"Call-session values passed to the code as arguments, by name. Another attached tool must store each one.","uniqueKey":"configs.oneOf.2.session_inputs","typeLabel":"string[]"},"sheet_refs":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"configs.oneOf.2.sheet_refs.additionalProperties","typeLabel":"string"},"description":"Accepted and not stored. Set `sheet_refs` on the agent instead.","uniqueKey":"configs.oneOf.2.sheet_refs","typeLabel":"object"},"executor_url":{"type":"string","description":"Reserved. Leave it out.","uniqueKey":"configs.oneOf.2.executor_url","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.2","typeLabel":"code · object"},{"type":"object","title":"builtin get_dtmf","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["action","num_digits"],"properties":{"action":{"type":"string","enum":["get_dtmf"],"isRequired":true,"uniqueKey":"configs.oneOf.3.action","typeLabel":"enum\u003cstring>"},"num_digits":{"type":"integer","minimum":1,"maximum":32,"description":"How many digits to collect.","isRequired":true,"uniqueKey":"configs.oneOf.3.num_digits","typeLabel":"integer"},"ask_for_confirmation":{"type":"boolean","description":"Read the digits back and ask the caller to confirm them.","uniqueKey":"configs.oneOf.3.ask_for_confirmation","typeLabel":"boolean"},"extra_instructions":{"type":"string","maxLength":500,"uniqueKey":"configs.oneOf.3.extra_instructions","typeLabel":"string"},"dtmf_input_timeout":{"type":"number","minimum":0.5,"maximum":30,"description":"Seconds to wait for the next digit.","uniqueKey":"configs.oneOf.3.dtmf_input_timeout","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.3","typeLabel":"builtin get_dtmf · object"},{"type":"object","title":"builtin connect_to_human","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["action"],"properties":{"action":{"type":"string","enum":["connect_to_human"],"isRequired":true,"uniqueKey":"configs.oneOf.4.action","typeLabel":"enum\u003cstring>"},"routing":{"type":"string","enum":["number","team"],"uniqueKey":"configs.oneOf.4.routing","typeLabel":"enum\u003cstring>"},"destination_number":{"type":"string","description":"Where to transfer: an international number (`+966501234567`), a short number or extension of 2 to 10 digits, a `sip:` URI or a `tel:` URI.","uniqueKey":"configs.oneOf.4.destination_number","typeLabel":"string"},"transfer_mode":{"type":"string","enum":["cold","warm"],"description":"`cold` hands the call over directly; `warm` briefs the person who answers first.","uniqueKey":"configs.oneOf.4.transfer_mode","typeLabel":"enum\u003cstring>"},"share_conversation_history":{"type":"boolean","description":"Only with `transfer_mode: warm`. Share the conversation in the briefing.","uniqueKey":"configs.oneOf.4.share_conversation_history","typeLabel":"boolean"},"ringing_timeout_sec":{"type":"number","minimum":5,"maximum":120,"description":"How long to ring before giving up.","uniqueKey":"configs.oneOf.4.ringing_timeout_sec","typeLabel":"number"},"teams":{"type":"array","minItems":1,"maxItems":10,"description":"Only with `routing: team`. The destinations the model chooses from.","items":{"oneOf":[{"type":"object","description":"A transfer destination that is a phone number.","required":["name","description","destination_number"],"properties":{"name":{"type":"string","minLength":1,"maxLength":40,"description":"Unique in the list, case-insensitive. No double quote.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.name","typeLabel":"string"},"description":{"type":"string","minLength":1,"maxLength":500,"description":"When to route callers here. The model reads it.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.description","typeLabel":"string"},"destination_number":{"type":"string","description":"An international number, a 2 to 10 digit extension, a `sip:` URI or a `tel:` URI.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.destination_number","typeLabel":"string"},"type":{"type":"string","enum":["number"],"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"transfer_mode":{"type":"string","enum":["cold","warm"],"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.transfer_mode","typeLabel":"enum\u003cstring>"},"share_conversation_history":{"type":"boolean","description":"Only with `transfer_mode: warm`.","uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.share_conversation_history","typeLabel":"boolean"},"ringing_timeout_sec":{"type":"number","minimum":5,"maximum":120,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0.ringing_timeout_sec","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A transfer destination that is your agents, through the queue of a Voice Assist agent. `name` and `description` are required when the list has two or more destinations, and refused when it has one.","required":["type","target","assist_agent_id","text_context","voice_context"],"properties":{"type":{"type":"string","enum":["agents"],"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"target":{"oneOf":[{"type":"object","description":"Who can take the call.","required":["kind"],"properties":{"kind":{"type":"string","enum":["any_agent"],"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who can take the call.","required":["kind","team_id"],"properties":{"kind":{"type":"string","enum":["team"],"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"team_id":{"type":"string","pattern":"^\\d{1,20}$","description":"Your support platform team id, as a decimal string.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.1.team_id","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.1","typeLabel":"object"},{"type":"object","description":"Who can take the call.","required":["kind","user_id"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"user_id":{"type":"string","pattern":"^\\d{1,20}$","description":"Your support platform user id, as a decimal string.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.2.user_id","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.target","typeLabel":"object"},"assist_agent_id":{"type":"string","format":"uuid","description":"The Voice Assist agent whose queue the call waits in.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.assist_agent_id","typeLabel":"string\u003cuuid>"},"text_context":{"type":"boolean","description":"The agent who takes the call gets a written summary.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.text_context","typeLabel":"boolean"},"voice_context":{"type":"boolean","description":"The agent who takes the call gets a spoken briefing first.","isRequired":true,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.voice_context","typeLabel":"boolean"},"name":{"type":"string","minLength":1,"maxLength":40,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.name","typeLabel":"string"},"description":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.description","typeLabel":"string"},"full_conversation":{"type":"boolean","description":"Only with `text_context`. Also show the whole conversation with the AI agent.","uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1.full_conversation","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.4.teams.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"configs.oneOf.4.teams.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.4.teams","typeLabel":"object[]"},"default_team":{"type":"string","description":"Only with `routing: team` and two or more destinations. The `name` of the destination to use when the model cannot tell.","uniqueKey":"configs.oneOf.4.default_team","typeLabel":"string"},"ask_when_unclear":{"type":"boolean","description":"Only with `routing: team` and two or more destinations. Ask the caller when the right destination is unclear.","uniqueKey":"configs.oneOf.4.ask_when_unclear","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.4","typeLabel":"builtin connect_to_human · object"},{"type":"object","title":"builtin (other)","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","properties":{"action":{"type":"string","example":"end_call","uniqueKey":"configs.oneOf.5.action","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"configs.oneOf.5","typeLabel":"builtin (other) · object"},{"type":"object","title":"workflow","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["workflow_id"],"properties":{"workflow_id":{"type":"string","minLength":1,"description":"The workflow's id.","isRequired":true,"uniqueKey":"configs.oneOf.6.workflow_id","typeLabel":"string"},"expect_response":{"type":"boolean","description":"Wait for the workflow to finish and give its response to the model, instead of only starting it.","uniqueKey":"configs.oneOf.6.expect_response","typeLabel":"boolean"}},"additionalProperties":true,"uniqueKey":"configs.oneOf.6","typeLabel":"workflow · object"},{"type":"object","title":"WhatsApp","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["channel","wa_channel_id","messages"],"properties":{"channel":{"type":"string","enum":["whatsapp"],"isRequired":true,"uniqueKey":"configs.oneOf.7.channel","typeLabel":"enum\u003cstring>"},"wa_channel_id":{"type":"integer","minimum":1,"description":"Your WhatsApp channel in the support platform.","isRequired":true,"uniqueKey":"configs.oneOf.7.wa_channel_id","typeLabel":"integer"},"messages":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","additionalProperties":false,"required":["id","description","kind"],"description":"One message the agent may send. `template` needs `template_id`; `text` and `buttons` need `text` (and `buttons` 1 to 3 buttons); `document` needs `attachment_ids` or `allow_document_url`.","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Unique in the tool. The model picks the message by it.","isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].id","typeLabel":"string"},"description":{"type":"string","minLength":1,"description":"When to send it. The model reads it.","isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].description","typeLabel":"string"},"kind":{"type":"string","enum":["template","text","document","buttons"],"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"template_id":{"type":"string","minLength":1,"description":"`template`: an approved WhatsApp template.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].template_id","typeLabel":"string"},"variables":{"type":"array","items":{"oneOf":[{"type":"object","description":"A value Clarity fills in.","required":["key","mode","value"],"properties":{"key":{"type":"string","minLength":1,"maxLength":64,"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.0.key","typeLabel":"string"},"mode":{"type":"string","enum":["fixed"],"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.0.mode","typeLabel":"enum\u003cstring>"},"value":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.0.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A value the model fills in.","required":["key","mode","description"],"properties":{"key":{"type":"string","minLength":1,"maxLength":64,"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.1.key","typeLabel":"string"},"mode":{"type":"string","enum":["agent"],"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.1.mode","typeLabel":"enum\u003cstring>"},"description":{"type":"string","minLength":1,"description":"What the model should put there.","isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.1.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables.items.[INDEX]","typeLabel":"object"},"description":"`template`: its variables.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].variables","typeLabel":"object[]"},"buttons_wait_s":{"oneOf":[{"type":"integer","minimum":10,"maximum":1800,"description":"`buttons`, or a template with quick replies: seconds to wait for a tap.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons_wait_s.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":10,"maximum":1800,"description":"`buttons`, or a template with quick replies: seconds to wait for a tap.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons_wait_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons_wait_s","typeLabel":"integer | null"},"text":{"type":"string","description":"`text` and `buttons`: the message. Each `{{key}}` needs a placeholder.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].text","typeLabel":"string"},"placeholders":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["key","description"],"description":"A `{{key}}` in the text that the model fills in.","properties":{"key":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$","isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].placeholders.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].placeholders.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].placeholders.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].placeholders","typeLabel":"object[]"},"buttons":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$","isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons.items.[INDEX].id","typeLabel":"string"},"label":{"type":"string","minLength":1,"maxLength":20,"isRequired":true,"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons.items.[INDEX]","typeLabel":"object"},"description":"`buttons`: 1 to 3 reply buttons. Not on a Twilio channel.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].buttons","typeLabel":"object[]"},"attachment_ids":{"type":"array","maxItems":5,"items":{"minimum":1,"type":"integer","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].attachment_ids.items.[INDEX]","typeLabel":"integer"},"description":"`document`: files from your support platform to send.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].attachment_ids","typeLabel":"integer[]"},"allow_document_url":{"type":"boolean","description":"`document`: the model may send a document by link.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].allow_document_url","typeLabel":"boolean"},"caption":{"type":"string","description":"`document`: the caption.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].caption","typeLabel":"string"},"expects_image":{"type":"boolean","description":"`text` or `template`: the caller is expected to answer with a photo.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].expects_image","typeLabel":"boolean"},"image_wait_s":{"oneOf":[{"type":"integer","minimum":10,"maximum":1800,"description":"Only with `expects_image`. Seconds to wait for the photo. Default 120.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].image_wait_s.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":10,"maximum":1800,"description":"Only with `expects_image`. Seconds to wait for the photo. Default 120.","uniqueKey":"configs.oneOf.7.messages.items.[INDEX].image_wait_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.7.messages.items.[INDEX].image_wait_s","typeLabel":"integer | null"}},"uniqueKey":"configs.oneOf.7.messages.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"configs.oneOf.7.messages","typeLabel":"object[]"},"wa_provider":{"type":"string","enum":["meta","twilio"],"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.7.wa_provider","typeLabel":"enum\u003cstring>"},"allow_spoken_number":{"type":"boolean","description":"Send to a number the caller says, not only to the number they call from.","uniqueKey":"configs.oneOf.7.allow_spoken_number","typeLabel":"boolean"},"notify_text_replies":{"type":"boolean","description":"Tell the agent when the caller replies in writing.","uniqueKey":"configs.oneOf.7.notify_text_replies","typeLabel":"boolean"},"max_sends_per_call":{"type":"integer","minimum":1,"maximum":20,"description":"Default 5.","uniqueKey":"configs.oneOf.7.max_sends_per_call","typeLabel":"integer"},"allow_resend":{"type":"boolean","uniqueKey":"configs.oneOf.7.allow_resend","typeLabel":"boolean"},"test_recipient":{"oneOf":[{"type":"string","minLength":1,"description":"The only recipient during test and demo calls, as an E.164 number with `+`.","uniqueKey":"configs.oneOf.7.test_recipient.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"The only recipient during test and demo calls, as an E.164 number with `+`.","uniqueKey":"configs.oneOf.7.test_recipient.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.7.test_recipient","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.7","typeLabel":"WhatsApp · object"},{"type":"object","title":"Email","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["channel","email_channel_id","subject","body"],"properties":{"channel":{"type":"string","enum":["email"],"isRequired":true,"uniqueKey":"configs.oneOf.8.channel","typeLabel":"enum\u003cstring>"},"email_channel_id":{"type":"integer","minimum":1,"description":"Your email channel in the support platform.","isRequired":true,"uniqueKey":"configs.oneOf.8.email_channel_id","typeLabel":"integer"},"subject":{"type":"string","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"configs.oneOf.8.subject","typeLabel":"string"},"body":{"type":"string","minLength":1,"maxLength":10000,"description":"Each `{{key}}` needs a placeholder.","isRequired":true,"uniqueKey":"configs.oneOf.8.body","typeLabel":"string"},"placeholders":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["key","description"],"description":"A `{{key}}` in the text that the model fills in.","properties":{"key":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$","isRequired":true,"uniqueKey":"configs.oneOf.8.placeholders.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.8.placeholders.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"configs.oneOf.8.placeholders.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.8.placeholders","typeLabel":"object[]"},"attachment_ids":{"type":"array","maxItems":5,"items":{"minimum":1,"type":"integer","uniqueKey":"configs.oneOf.8.attachment_ids.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"configs.oneOf.8.attachment_ids","typeLabel":"integer[]"},"allow_document_url":{"type":"boolean","uniqueKey":"configs.oneOf.8.allow_document_url","typeLabel":"boolean"},"code":{"type":"object","additionalProperties":false,"required":["recipient_session"],"description":"Makes the email a one-time code that verifies the caller. The body must contain `{{code}}` exactly once, and may use `{{code_minutes}}`; no other placeholders, attachments or links.","properties":{"recipient_session":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"The call-session value that holds the address to send to.","isRequired":true,"uniqueKey":"configs.oneOf.8.code.recipient_session","typeLabel":"string"},"length":{"type":"integer","minimum":4,"maximum":8,"description":"Default 6.","uniqueKey":"configs.oneOf.8.code.length","typeLabel":"integer"},"ttl_s":{"type":"integer","minimum":60,"maximum":1800,"description":"Seconds the code is valid. Default 600.","uniqueKey":"configs.oneOf.8.code.ttl_s","typeLabel":"integer"},"entry":{"type":"string","enum":["spoken","keypad","either"],"description":"How the caller gives the code back. Default `either`.","uniqueKey":"configs.oneOf.8.code.entry","typeLabel":"enum\u003cstring>"}},"uniqueKey":"configs.oneOf.8.code","typeLabel":"object"},"notify_text_replies":{"type":"boolean","uniqueKey":"configs.oneOf.8.notify_text_replies","typeLabel":"boolean"},"max_sends_per_call":{"type":"integer","minimum":1,"maximum":20,"description":"Default 5, or 3 with `code`.","uniqueKey":"configs.oneOf.8.max_sends_per_call","typeLabel":"integer"},"allow_resend":{"type":"boolean","uniqueKey":"configs.oneOf.8.allow_resend","typeLabel":"boolean"},"test_recipient":{"oneOf":[{"type":"string","minLength":1,"description":"The only recipient during test and demo calls, as an email address.","uniqueKey":"configs.oneOf.8.test_recipient.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"description":"The only recipient during test and demo calls, as an email address.","uniqueKey":"configs.oneOf.8.test_recipient.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.8.test_recipient","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.8","typeLabel":"Email · object"},{"type":"object","title":"WhatsApp","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["channel","chat_agent_id","wa_channel_id","opener"],"properties":{"channel":{"type":"string","enum":["whatsapp"],"isRequired":true,"uniqueKey":"configs.oneOf.9.channel","typeLabel":"enum\u003cstring>"},"chat_agent_id":{"type":"string","minLength":1,"maxLength":100,"description":"The chat agent that continues the conversation.","isRequired":true,"uniqueKey":"configs.oneOf.9.chat_agent_id","typeLabel":"string"},"wa_channel_id":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"configs.oneOf.9.wa_channel_id","typeLabel":"integer"},"opener":{"oneOf":[{"type":"object","description":"The first message, an approved template or (inside WhatsApp's 24-hour window) a text.","required":["kind","template_id"],"properties":{"kind":{"type":"string","enum":["template"],"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"template_id":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.template_id","typeLabel":"string"},"variables":{"type":"array","items":{"oneOf":[{"type":"object","description":"A value Clarity fills in.","required":["key","mode","value"],"properties":{"key":{"type":"string","minLength":1,"maxLength":64,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.0.key","typeLabel":"string"},"mode":{"type":"string","enum":["fixed"],"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.0.mode","typeLabel":"enum\u003cstring>"},"value":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.0.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A value the model fills in.","required":["key","mode","description"],"properties":{"key":{"type":"string","minLength":1,"maxLength":64,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.1.key","typeLabel":"string"},"mode":{"type":"string","enum":["agent"],"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.1.mode","typeLabel":"enum\u003cstring>"},"description":{"type":"string","minLength":1,"description":"What the model should put there.","isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.1.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.9.opener.oneOf.0.variables","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.0","typeLabel":"object"},{"type":"object","description":"The first message, an approved template or (inside WhatsApp's 24-hour window) a text.","required":["kind","text"],"properties":{"kind":{"type":"string","enum":["text"],"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"text":{"type":"string","minLength":1,"maxLength":4096,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.1.text","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"configs.oneOf.9.opener.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"configs.oneOf.9.opener","typeLabel":"object"},"chat_agent_name":{"oneOf":[{"type":"string","maxLength":200,"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.9.chat_agent_name.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":200,"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.9.chat_agent_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.9.chat_agent_name","typeLabel":"string | null"},"wa_provider":{"type":"string","enum":["meta","twilio"],"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.9.wa_provider","typeLabel":"enum\u003cstring>"},"allow_spoken_number":{"type":"boolean","uniqueKey":"configs.oneOf.9.allow_spoken_number","typeLabel":"boolean"},"end_call_after":{"type":"boolean","description":"End the call after a successful handoff. Default true.","uniqueKey":"configs.oneOf.9.end_call_after","typeLabel":"boolean"},"test_recipient":{"oneOf":[{"type":"string","minLength":1,"uniqueKey":"configs.oneOf.9.test_recipient.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"uniqueKey":"configs.oneOf.9.test_recipient.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.9.test_recipient","typeLabel":"string | null"},"max_handoffs_per_day":{"oneOf":[{"type":"integer","minimum":1,"maximum":50,"description":"The most handoffs per customer per day. Default 3.","uniqueKey":"configs.oneOf.9.max_handoffs_per_day.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"maximum":50,"description":"The most handoffs per customer per day. Default 3.","uniqueKey":"configs.oneOf.9.max_handoffs_per_day.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.9.max_handoffs_per_day","typeLabel":"integer | null"},"tool_id":{"type":"string","maxLength":100,"description":"Ignored.","uniqueKey":"configs.oneOf.9.tool_id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.9","typeLabel":"WhatsApp · object"},{"type":"object","title":"Email","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["channel","chat_agent_id","email_channel_id","opener"],"properties":{"channel":{"type":"string","enum":["email"],"isRequired":true,"uniqueKey":"configs.oneOf.10.channel","typeLabel":"enum\u003cstring>"},"chat_agent_id":{"type":"string","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"configs.oneOf.10.chat_agent_id","typeLabel":"string"},"email_channel_id":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"configs.oneOf.10.email_channel_id","typeLabel":"integer"},"opener":{"type":"object","additionalProperties":false,"required":["subject","text"],"properties":{"subject":{"type":"string","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"configs.oneOf.10.opener.subject","typeLabel":"string"},"text":{"type":"string","minLength":1,"maxLength":10000,"isRequired":true,"uniqueKey":"configs.oneOf.10.opener.text","typeLabel":"string"},"kind":{"type":"string","enum":["email"],"uniqueKey":"configs.oneOf.10.opener.kind","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"configs.oneOf.10.opener","typeLabel":"object"},"chat_agent_name":{"oneOf":[{"type":"string","maxLength":200,"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.10.chat_agent_name.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":200,"description":"Filled in by Clarity on save.","uniqueKey":"configs.oneOf.10.chat_agent_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.10.chat_agent_name","typeLabel":"string | null"},"end_call_after":{"type":"boolean","description":"Default true.","uniqueKey":"configs.oneOf.10.end_call_after","typeLabel":"boolean"},"test_recipient":{"oneOf":[{"type":"string","minLength":1,"uniqueKey":"configs.oneOf.10.test_recipient.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"uniqueKey":"configs.oneOf.10.test_recipient.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.10.test_recipient","typeLabel":"string | null"},"max_handoffs_per_day":{"oneOf":[{"type":"integer","minimum":1,"maximum":50,"uniqueKey":"configs.oneOf.10.max_handoffs_per_day.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"maximum":50,"uniqueKey":"configs.oneOf.10.max_handoffs_per_day.oneOf.1","typeLabel":"null"}],"uniqueKey":"configs.oneOf.10.max_handoffs_per_day","typeLabel":"integer | null"},"tool_id":{"type":"string","maxLength":100,"description":"Ignored.","uniqueKey":"configs.oneOf.10.tool_id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.10","typeLabel":"Email · object"},{"type":"object","title":"ticket","description":"The tool's configuration. Its shape depends on the tool's `type`, and it is checked against that type; on update without `type`, against the stored type. `builtin` takes one of three shapes, by `action`.","required":["actions"],"properties":{"actions":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["message","screen","note","update","instruct_chat_ai"],"uniqueKey":"configs.oneOf.11.actions.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"What the agent may do.","isRequired":true,"uniqueKey":"configs.oneOf.11.actions","typeLabel":"enum\u003cstring>[]"},"allowed_screens":{"type":"array","maxItems":50,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,100}$","uniqueKey":"configs.oneOf.11.allowed_screens.items.[INDEX]","typeLabel":"string"},"description":"The screen template keys the agent may show. Required (at least one) with the `screen` action, and only with it.","uniqueKey":"configs.oneOf.11.allowed_screens","typeLabel":"string[]"},"allowed_changes":{"type":"object","additionalProperties":false,"required":["fields"],"description":"What an update may change. Required with the `update` action, and only with it.","properties":{"fields":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","enum":["status","category","team","custom_attributes"],"uniqueKey":"configs.oneOf.11.allowed_changes.fields.items.[INDEX]","typeLabel":"enum\u003cstring>"},"isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.fields","typeLabel":"enum\u003cstring>[]"},"custom_attribute_keys":{"type":"array","minItems":1,"maxItems":20,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,100}$","uniqueKey":"configs.oneOf.11.allowed_changes.custom_attribute_keys.items.[INDEX]","typeLabel":"string"},"description":"Only when `custom_attributes` is in `fields`.","uniqueKey":"configs.oneOf.11.allowed_changes.custom_attribute_keys","typeLabel":"string[]"},"status_options":{"type":"array","minItems":1,"maxItems":100,"description":"The values an update may set this field to, with labels the agent reads. Ids must not repeat. Only when the field is in `fields`; without it, any value is allowed.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.status_options.items.[INDEX].id","typeLabel":"integer"},"label":{"type":"string","minLength":1,"maxLength":200,"isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.status_options.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"configs.oneOf.11.allowed_changes.status_options.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.11.allowed_changes.status_options","typeLabel":"object[]"},"category_options":{"type":"array","minItems":1,"maxItems":100,"description":"The values an update may set this field to, with labels the agent reads. Ids must not repeat. Only when the field is in `fields`; without it, any value is allowed.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.category_options.items.[INDEX].id","typeLabel":"integer"},"label":{"type":"string","minLength":1,"maxLength":200,"isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.category_options.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"configs.oneOf.11.allowed_changes.category_options.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.11.allowed_changes.category_options","typeLabel":"object[]"},"team_options":{"type":"array","minItems":1,"maxItems":100,"description":"The values an update may set this field to, with labels the agent reads. Ids must not repeat. Only when the field is in `fields`; without it, any value is allowed.","items":{"type":"object","additionalProperties":false,"required":["id","label"],"properties":{"id":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.team_options.items.[INDEX].id","typeLabel":"integer"},"label":{"type":"string","minLength":1,"maxLength":200,"isRequired":true,"uniqueKey":"configs.oneOf.11.allowed_changes.team_options.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"configs.oneOf.11.allowed_changes.team_options.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.11.allowed_changes.team_options","typeLabel":"object[]"}},"uniqueKey":"configs.oneOf.11.allowed_changes","typeLabel":"object"},"files":{"type":"array","maxItems":10,"description":"Files the agent may send by key, with the `message` action only. Keys must not repeat.","items":{"type":"object","additionalProperties":false,"required":["key","attachment_id","description"],"properties":{"key":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","isRequired":true,"uniqueKey":"configs.oneOf.11.files.items.[INDEX].key","typeLabel":"string"},"attachment_id":{"type":"integer","minimum":1,"description":"The file in your Clarity support workspace. The agent never sees it.","isRequired":true,"uniqueKey":"configs.oneOf.11.files.items.[INDEX].attachment_id","typeLabel":"integer"},"description":{"type":"string","minLength":1,"maxLength":500,"description":"What the file is, as the agent reads it.","isRequired":true,"uniqueKey":"configs.oneOf.11.files.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"configs.oneOf.11.files.items.[INDEX]","typeLabel":"object"},"uniqueKey":"configs.oneOf.11.files","typeLabel":"object[]"},"allow_document_url":{"type":"boolean","description":"Lets the agent send a document by link, with the `message` action only.","uniqueKey":"configs.oneOf.11.allow_document_url","typeLabel":"boolean"},"max_actions_per_call":{"type":"integer","minimum":1,"maximum":20,"description":"The most actions of this tool in one call. Default 5.","uniqueKey":"configs.oneOf.11.max_actions_per_call","typeLabel":"integer"},"tool_id":{"type":"string","maxLength":100,"description":"Ignored.","uniqueKey":"configs.oneOf.11.tool_id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"configs.oneOf.11","typeLabel":"ticket · object"}],"uniqueKey":"configs","typeLabel":"http · object · knowledgebase · object · code · object · builtin get_dtmf · object · builtin connect_to_human · object · builtin (other) · object · workflow · object · WhatsApp · object · Email · object · WhatsApp · object · Email · object · ticket · object"},"parameters":{"oneOf":[{"type":"object","additionalProperties":true,"description":"JSON Schema (`type: object`, `properties`, `required`) of the arguments the model passes. A `knowledgebase` tool always takes one `query` string, whatever you send.","example":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"uniqueKey":"parameters.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"JSON Schema (`type: object`, `properties`, `required`) of the arguments the model passes. A `knowledgebase` tool always takes one `query` string, whatever you send.","example":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"uniqueKey":"parameters.oneOf.1","typeLabel":"null"}],"uniqueKey":"parameters","typeLabel":"object | null"},"parameter_mapping":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"parameter_mapping.oneOf.0.additionalProperties","typeLabel":"string"},"description":"Renames arguments before the request is built, `{argument: request_field}`.","uniqueKey":"parameter_mapping.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"parameter_mapping.oneOf.1.additionalProperties","typeLabel":"string"},"description":"Renames arguments before the request is built, `{argument: request_field}`.","uniqueKey":"parameter_mapping.oneOf.1","typeLabel":"null"}],"uniqueKey":"parameter_mapping","typeLabel":"object | null"},"hold_message":{"oneOf":[{"type":"string","description":"What the agent says while the tool runs. Blank or `null` says nothing.","uniqueKey":"hold_message.oneOf.0","typeLabel":"string"},{"type":"null","description":"What the agent says while the tool runs. Blank or `null` says nothing.","uniqueKey":"hold_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"hold_message","typeLabel":"string | null"},"hold_messages":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"hold_messages.oneOf.0.additionalProperties","typeLabel":"string"},"description":"The hold message per language of a multilingual agent, keyed by the agent's language label (such as `English (US)`). A missing language falls back to `hold_message`.","uniqueKey":"hold_messages.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"hold_messages.oneOf.1.additionalProperties","typeLabel":"string"},"description":"The hold message per language of a multilingual agent, keyed by the agent's language label (such as `English (US)`). A missing language falls back to `hold_message`.","uniqueKey":"hold_messages.oneOf.1","typeLabel":"null"}],"uniqueKey":"hold_messages","typeLabel":"object | null"},"async_config":{"oneOf":[{"type":"object","additionalProperties":false,"required":["enabled"],"description":"Lets the conversation go on while the tool runs instead of waiting for the result. Not allowed on `builtin` tools. `null` turns it off.","properties":{"enabled":{"type":"boolean","description":"Turns the other settings on.","isRequired":true,"uniqueKey":"async_config.oneOf.0.enabled","typeLabel":"boolean"},"ack_message":{"oneOf":[{"type":"string","description":"What the agent says when the tool starts. `null` falls back to `hold_message`.","uniqueKey":"async_config.oneOf.0.ack_message.oneOf.0","typeLabel":"string"},{"type":"null","description":"What the agent says when the tool starts. `null` falls back to `hold_message`.","uniqueKey":"async_config.oneOf.0.ack_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.ack_message","typeLabel":"string | null"},"ack_messages":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"async_config.oneOf.0.ack_messages.oneOf.0.additionalProperties","typeLabel":"string"},"description":"`ack_message` per language label.","uniqueKey":"async_config.oneOf.0.ack_messages.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"async_config.oneOf.0.ack_messages.oneOf.1.additionalProperties","typeLabel":"string"},"description":"`ack_message` per language label.","uniqueKey":"async_config.oneOf.0.ack_messages.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.ack_messages","typeLabel":"object | null"},"filler_phrases":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"async_config.oneOf.0.filler_phrases.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Phrases the agent picks from while it waits.","uniqueKey":"async_config.oneOf.0.filler_phrases.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Phrases the agent picks from while it waits.","uniqueKey":"async_config.oneOf.0.filler_phrases.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.filler_phrases","typeLabel":"string[] | null"},"filler_phrases_by_language":{"oneOf":[{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.0.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.0.additionalProperties","typeLabel":"string[]"},"description":"`filler_phrases` per language label.","uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"array","items":{"type":"string","uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.1.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.1.additionalProperties","typeLabel":"string[]"},"description":"`filler_phrases` per language label.","uniqueKey":"async_config.oneOf.0.filler_phrases_by_language.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.filler_phrases_by_language","typeLabel":"object | null"},"filler_delay_ms":{"type":"integer","minimum":0,"description":"Accepted for compatibility and ignored. Use `filler_interval_ms`.","uniqueKey":"async_config.oneOf.0.filler_delay_ms","typeLabel":"integer"},"filler_interval_ms":{"oneOf":[{"type":"integer","minimum":1,"description":"Milliseconds of silence before a filler phrase, and between two of them. `null` plays none.","uniqueKey":"async_config.oneOf.0.filler_interval_ms.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Milliseconds of silence before a filler phrase, and between two of them. `null` plays none.","uniqueKey":"async_config.oneOf.0.filler_interval_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.filler_interval_ms","typeLabel":"integer | null"},"filler_max_plays":{"oneOf":[{"type":"integer","minimum":1,"description":"The most filler phrases per run. Needs `filler_interval_ms`.","uniqueKey":"async_config.oneOf.0.filler_max_plays.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"The most filler phrases per run. Needs `filler_interval_ms`.","uniqueKey":"async_config.oneOf.0.filler_max_plays.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config.oneOf.0.filler_max_plays","typeLabel":"integer | null"},"on_duplicate":{"type":"string","enum":["allow","reject"],"description":"What happens when the model calls the tool again while it is running. Default `reject`.","uniqueKey":"async_config.oneOf.0.on_duplicate","typeLabel":"enum\u003cstring>"},"cancellable":{"type":"boolean","description":"The caller may cancel a run in progress. Default false.","uniqueKey":"async_config.oneOf.0.cancellable","typeLabel":"boolean"},"max_lifetime_ms":{"type":"integer","minimum":1000,"maximum":900000,"description":"How long a run may take before it is given up, in milliseconds.","uniqueKey":"async_config.oneOf.0.max_lifetime_ms","typeLabel":"integer"}},"uniqueKey":"async_config.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"required":["enabled"],"description":"Lets the conversation go on while the tool runs instead of waiting for the result. Not allowed on `builtin` tools. `null` turns it off.","properties":{"enabled":{"type":"boolean","description":"Turns the other settings on."},"ack_message":{"oneOf":[{"type":"string","description":"What the agent says when the tool starts. `null` falls back to `hold_message`."},{"type":"null","description":"What the agent says when the tool starts. `null` falls back to `hold_message`."}]},"ack_messages":{"oneOf":[{"type":"object","additionalProperties":{"type":"string"},"description":"`ack_message` per language label."},{"type":"null","additionalProperties":{"type":"string"},"description":"`ack_message` per language label."}]},"filler_phrases":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Phrases the agent picks from while it waits."},{"type":"null","items":{"type":"string"},"description":"Phrases the agent picks from while it waits."}]},"filler_phrases_by_language":{"oneOf":[{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"`filler_phrases` per language label."},{"type":"null","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"`filler_phrases` per language label."}]},"filler_delay_ms":{"type":"integer","minimum":0,"description":"Accepted for compatibility and ignored. Use `filler_interval_ms`."},"filler_interval_ms":{"oneOf":[{"type":"integer","minimum":1,"description":"Milliseconds of silence before a filler phrase, and between two of them. `null` plays none."},{"type":"null","minimum":1,"description":"Milliseconds of silence before a filler phrase, and between two of them. `null` plays none."}]},"filler_max_plays":{"oneOf":[{"type":"integer","minimum":1,"description":"The most filler phrases per run. Needs `filler_interval_ms`."},{"type":"null","minimum":1,"description":"The most filler phrases per run. Needs `filler_interval_ms`."}]},"on_duplicate":{"type":"string","enum":["allow","reject"],"description":"What happens when the model calls the tool again while it is running. Default `reject`."},"cancellable":{"type":"boolean","description":"The caller may cancel a run in progress. Default false."},"max_lifetime_ms":{"type":"integer","minimum":1000,"maximum":900000,"description":"How long a run may take before it is given up, in milliseconds."}},"uniqueKey":"async_config.oneOf.1","typeLabel":"null"}],"uniqueKey":"async_config","typeLabel":"object | null"},"session":{"oneOf":[{"type":"object","additionalProperties":false,"description":"The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null `verification` makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.","properties":{"requires_verified_caller":{"type":"boolean","description":"The runtime refuses the tool until a verification tool verified the caller.","uniqueKey":"session.oneOf.0.requires_verified_caller","typeLabel":"boolean"},"stores":{"type":"array","maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["from","as","visibility"],"properties":{"from":{"type":"string","description":"Dot path into the JSON response.","isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].from","typeLabel":"string"},"as":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Session name, referenced as {{session.\u003cas>}}.","isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].as","typeLabel":"string"},"visibility":{"type":"string","enum":["private","visible"],"isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].visibility","typeLabel":"enum\u003cstring>"}},"uniqueKey":"session.oneOf.0.stores.items.[INDEX]","typeLabel":"object"},"uniqueKey":"session.oneOf.0.stores","typeLabel":"object[]"},"verification":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599,"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.status_in.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.status_in","typeLabel":"integer[]"},"field":{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.field","typeLabel":"string"},"equals":{"oneOf":[{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.1","typeLabel":"number"},{"type":"boolean","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.2","typeLabel":"boolean"}],"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals","typeLabel":"string | number | boolean"}},"uniqueKey":"session.oneOf.0.verification.oneOf.0.success","typeLabel":"object"},"ttl_from":{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.ttl_from","typeLabel":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.max_attempts","typeLabel":"integer"},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent.","uniqueKey":"session.oneOf.0.verification.oneOf.0.on_exhausted","typeLabel":"enum\u003cstring>"},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins).","uniqueKey":"session.oneOf.0.verification.oneOf.0.unreachable_counts_as_failure","typeLabel":"boolean"},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s","typeLabel":"integer | null"}},"uniqueKey":"session.oneOf.0.verification.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}},"uniqueKey":"session.oneOf.0.verification.oneOf.1","typeLabel":"null"}],"uniqueKey":"session.oneOf.0.verification","typeLabel":"object | null"}},"uniqueKey":"session.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"description":"The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null `verification` makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.","properties":{"requires_verified_caller":{"type":"boolean","description":"The runtime refuses the tool until a verification tool verified the caller."},"stores":{"type":"array","maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["from","as","visibility"],"properties":{"from":{"type":"string","description":"Dot path into the JSON response."},"as":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Session name, referenced as {{session.\u003cas>}}."},"visibility":{"type":"string","enum":["private","visible"]}}}},"verification":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}}},{"type":"null","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}}}]}},"uniqueKey":"session.oneOf.1","typeLabel":"null"}],"uniqueKey":"session","typeLabel":"object | null"},"channels":{"type":"array","minItems":1,"maxItems":2,"uniqueItems":true,"items":{"type":"string","enum":["chat","voice"],"uniqueKey":"channels.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Used only when your organization shares tools between projects through its tool library: which kinds of agents can use this project-wide tool. Ignored otherwise.","uniqueKey":"channels","typeLabel":"enum\u003cstring>[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"name":"lookup_order","description":"Look up an order by its number and return its status.","type":"http","configs":{"url":"https://api.example.com/orders","method":"GET","query_params":[{"name":"number","value":"{{order_number}}"}],"authentication":{"type":"bearer","token":"vault:orders_api_token"}},"parameters":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"hold_message":"One moment while I check that order."},"examples":{"Example":{"title":"Example","value":{"name":"lookup_order","description":"Look up an order by its number and return its status.","type":"http","configs":{"url":"https://api.example.com/orders","method":"GET","query_params":[{"name":"number","value":"{{order_number}}"}],"authentication":{"type":"bearer","token":"vault:orders_api_token"}},"parameters":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"hold_message":"One moment while I check that order."}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"56f9fe53-7412-43aa-b232-85b59fb5c692":{"description":"The tool was created.","content":{"application/json":{"schema":{"type":"object","description":"A tool an agent can call during a conversation. Project-wide tools (`agent_id: null`) can be attached to any agent of the project; a private tool belongs to one agent.","required":["id","project_id","agent_id","name","description","type","configs","parameters","parameter_mapping","hold_message","hold_messages","async_config","session","updated_at"],"properties":{"id":{"type":"string","description":"Tool id.","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"project_id":{"type":"string","isRequired":true,"uniqueKey":"project_id","typeLabel":"string"},"agent_id":{"oneOf":[{"type":"string","description":"The agent the tool is private to, or `null` for a project-wide tool.","isRequired":true,"uniqueKey":"agent_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The agent the tool is private to, or `null` for a project-wide tool.","isRequired":true,"uniqueKey":"agent_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"agent_id","typeLabel":"string | null"},"name":{"type":"string","description":"The name the model calls the tool by.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"description":{"type":"string","description":"What the tool does and when to use it, as the model reads it.","isRequired":true,"uniqueKey":"description","typeLabel":"string"},"type":{"type":"string","description":"What the tool does, which decides the shape of `configs`: `http`, `knowledgebase`, `code`, `builtin`, `workflow`, `messaging`, `handoff` or `ticket`.","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"configs":{"type":"object","additionalProperties":true,"description":"The tool's configuration, in the shape of its `type` (see `configs` in Create a tool). It can also carry values Clarity fills in on save, such as a workflow's `url` or a knowledge base's search target.","isRequired":true,"uniqueKey":"configs","typeLabel":"object"},"parameters":{"type":"object","additionalProperties":true,"description":"JSON Schema of the arguments the model passes when it calls the tool.","isRequired":true,"uniqueKey":"parameters","typeLabel":"object"},"parameter_mapping":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"parameter_mapping.oneOf.0.additionalProperties","typeLabel":"string"},"description":"Renames arguments before the request is built, `{argument: request_field}`. `null` when none.","isRequired":true,"uniqueKey":"parameter_mapping.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"parameter_mapping.oneOf.1.additionalProperties","typeLabel":"string"},"description":"Renames arguments before the request is built, `{argument: request_field}`. `null` when none.","isRequired":true,"uniqueKey":"parameter_mapping.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parameter_mapping","typeLabel":"object | null"},"hold_message":{"oneOf":[{"type":"string","description":"What the agent says while the tool runs, or `null` for nothing.","isRequired":true,"uniqueKey":"hold_message.oneOf.0","typeLabel":"string"},{"type":"null","description":"What the agent says while the tool runs, or `null` for nothing.","isRequired":true,"uniqueKey":"hold_message.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hold_message","typeLabel":"string | null"},"hold_messages":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"hold_messages.oneOf.0.additionalProperties","typeLabel":"string"},"description":"The hold message per language of a multilingual agent, keyed by language label.","isRequired":true,"uniqueKey":"hold_messages.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"hold_messages.oneOf.1.additionalProperties","typeLabel":"string"},"description":"The hold message per language of a multilingual agent, keyed by language label.","isRequired":true,"uniqueKey":"hold_messages.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hold_messages","typeLabel":"object | null"},"async_config":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Settings that let the conversation go on while the tool runs, in the shape of `async_config` in Create a tool. `null` means the agent waits for the result.","isRequired":true,"uniqueKey":"async_config.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Settings that let the conversation go on while the tool runs, in the shape of `async_config` in Create a tool. `null` means the agent waits for the result.","isRequired":true,"uniqueKey":"async_config.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"async_config","typeLabel":"object | null"},"session":{"oneOf":[{"type":"object","additionalProperties":false,"description":"The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null `verification` makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.","properties":{"requires_verified_caller":{"type":"boolean","description":"The runtime refuses the tool until a verification tool verified the caller.","uniqueKey":"session.oneOf.0.requires_verified_caller","typeLabel":"boolean"},"stores":{"type":"array","maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["from","as","visibility"],"properties":{"from":{"type":"string","description":"Dot path into the JSON response.","isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].from","typeLabel":"string"},"as":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Session name, referenced as {{session.\u003cas>}}.","isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].as","typeLabel":"string"},"visibility":{"type":"string","enum":["private","visible"],"isRequired":true,"uniqueKey":"session.oneOf.0.stores.items.[INDEX].visibility","typeLabel":"enum\u003cstring>"}},"uniqueKey":"session.oneOf.0.stores.items.[INDEX]","typeLabel":"object"},"uniqueKey":"session.oneOf.0.stores","typeLabel":"object[]"},"verification":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599,"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.status_in.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.status_in","typeLabel":"integer[]"},"field":{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.field","typeLabel":"string"},"equals":{"oneOf":[{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.1","typeLabel":"number"},{"type":"boolean","uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals.oneOf.2","typeLabel":"boolean"}],"uniqueKey":"session.oneOf.0.verification.oneOf.0.success.equals","typeLabel":"string | number | boolean"}},"uniqueKey":"session.oneOf.0.verification.oneOf.0.success","typeLabel":"object"},"ttl_from":{"type":"string","uniqueKey":"session.oneOf.0.verification.oneOf.0.ttl_from","typeLabel":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.max_attempts","typeLabel":"integer"},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent.","uniqueKey":"session.oneOf.0.verification.oneOf.0.on_exhausted","typeLabel":"enum\u003cstring>"},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins).","uniqueKey":"session.oneOf.0.verification.oneOf.0.unreachable_counts_as_failure","typeLabel":"boolean"},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins.","uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s.oneOf.1","typeLabel":"null"}],"uniqueKey":"session.oneOf.0.verification.oneOf.0.default_ttl_s","typeLabel":"integer | null"}},"uniqueKey":"session.oneOf.0.verification.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}},"uniqueKey":"session.oneOf.0.verification.oneOf.1","typeLabel":"null"}],"uniqueKey":"session.oneOf.0.verification","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"session.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"description":"The tool's part in the call-scoped caller authentication session. Null means the tool takes no part. A non-null `verification` makes it a verification tool and carries the verification policy; caller authentication is on for an agent exactly when an attached tool verifies the caller or requires a verified caller. On PATCH, an absent key keeps the stored value and an explicit null clears it.","properties":{"requires_verified_caller":{"type":"boolean","description":"The runtime refuses the tool until a verification tool verified the caller."},"stores":{"type":"array","maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["from","as","visibility"],"properties":{"from":{"type":"string","description":"Dot path into the JSON response."},"as":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Session name, referenced as {{session.\u003cas>}}."},"visibility":{"type":"string","enum":["private","visible"]}}}},"verification":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}}},{"type":"null","additionalProperties":false,"properties":{"success":{"type":"object","additionalProperties":false,"properties":{"status_in":{"type":"array","items":{"type":"integer","minimum":100,"maximum":599}},"field":{"type":"string"},"equals":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"ttl_from":{"type":"string"},"max_attempts":{"type":"integer","minimum":1,"maximum":10,"description":"Failed verifications allowed per call (default 3). With several verifiers on an agent, the smallest wins."},"on_exhausted":{"type":"string","enum":["end_call","transfer","continue"],"description":"What happens when the attempts run out (default end_call). Taken from the verifier with the smallest max_attempts. `transfer` needs a connect_to_human tool attached to the agent."},"unreachable_counts_as_failure":{"type":"boolean","description":"Count a timeout / connection error / 5xx as a failed attempt (default false; true on any verifier wins)."},"default_ttl_s":{"oneOf":[{"type":"integer","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."},{"type":"null","minimum":60,"maximum":86400,"description":"Session lifetime when the response gives none (null - until the call ends). The smallest non-null value wins."}]}}}]}},"isRequired":true,"uniqueKey":"session.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"session","typeLabel":"object | null"},"updated_at":{"oneOf":[{"type":"integer","format":"int64","description":"When the tool was last changed, in milliseconds since the Unix epoch. `null` for a tool not changed since this field was added.","isRequired":true,"uniqueKey":"updated_at.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","format":"int64","description":"When the tool was last changed, in milliseconds since the Unix epoch. `null` for a tool not changed since this field was added.","isRequired":true,"uniqueKey":"updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"updated_at","typeLabel":"integer\u003cint64> | null"},"library_tool_id":{"oneOf":[{"type":"string","description":"The organization tool library entry this tool comes from, or `null` for a tool that belongs to this project only.","uniqueKey":"library_tool_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization tool library entry this tool comes from, or `null` for a tool that belongs to this project only.","uniqueKey":"library_tool_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"library_tool_id","typeLabel":"string | null"},"library_revision":{"oneOf":[{"type":"integer","description":"The library entry's revision this tool holds, or `null`.","uniqueKey":"library_revision.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The library entry's revision this tool holds, or `null`.","uniqueKey":"library_revision.oneOf.1","typeLabel":"null"}],"uniqueKey":"library_revision","typeLabel":"integer | null"},"library_channels":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"library_channels.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Which kinds of agents (`chat`, `voice`) can use the library entry, or `null`.","uniqueKey":"library_channels.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Which kinds of agents (`chat`, `voice`) can use the library entry, or `null`.","uniqueKey":"library_channels.oneOf.1","typeLabel":"null"}],"uniqueKey":"library_channels","typeLabel":"string[] | null"},"used_by_count":{"type":"integer","description":"How many agents of the project have the tool attached. A published agent keeps calling the tool it was published with until it is published again, whatever this count says. Present on reads and lists.","uniqueKey":"used_by_count","typeLabel":"integer"},"used_by_agents":{"type":"array","description":"The agents the tool is attached to. Returned when you get one tool, not in lists.","items":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"used_by_agents.items.[INDEX].id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"used_by_agents.items.[INDEX].name","typeLabel":"string"}},"uniqueKey":"used_by_agents.items.[INDEX]","typeLabel":"object"},"uniqueKey":"used_by_agents","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"id":"6e2a4c8d-1b3f-4a5c-9d7e-0f1a2b3c4d5e","project_id":"3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13","agent_id":null,"name":"lookup_order","description":"Look up an order by its number and return its status.","type":"http","configs":{"url":"https://api.example.com/orders","method":"GET","query_params":[{"name":"number","value":"{{order_number}}"}],"authentication":{"type":"bearer","token":"vault:orders_api_token"}},"parameters":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"parameter_mapping":null,"hold_message":"One moment while I check that order.","hold_messages":null,"async_config":null,"session":null,"updated_at":1794393600000,"library_tool_id":null,"library_revision":null,"library_channels":null},"examples":{"Example":{"title":"Example","value":{"id":"6e2a4c8d-1b3f-4a5c-9d7e-0f1a2b3c4d5e","project_id":"3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13","agent_id":null,"name":"lookup_order","description":"Look up an order by its number and return its status.","type":"http","configs":{"url":"https://api.example.com/orders","method":"GET","query_params":[{"name":"number","value":"{{order_number}}"}],"authentication":{"type":"bearer","token":"vault:orders_api_token"}},"parameters":{"type":"object","required":["order_number"],"properties":{"order_number":{"type":"string","description":"The order number the caller reads out."}}},"parameter_mapping":null,"hold_message":"One moment while I check that order.","hold_messages":null,"async_config":null,"session":null,"updated_at":1794393600000,"library_tool_id":null,"library_revision":null,"library_channels":null}}},"exampleType":"examples"}},"exampleType":"examples"},"40ae8b1d-424b-453d-8a88-34e5dfba690e":{"description":"A knowledge base tool names an article or collection your organization does not have (`support_kb_unknown_article`, `support_kb_unknown_collection`).","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"33721c65-5af2-4e62-a8df-a9049d1f8008":{"description":"No credential was sent, or the API key is invalid or revoked. A key that could not be checked at all answers 503 `AUTH_UPSTREAM_UNAVAILABLE` instead (see Errors).","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid or revoked token"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid or revoked token"}}},"exampleType":"examples"}},"exampleType":"examples"},"76c14ff1-862b-4e1a-94e4-1b168f4813bb":{"description":"Your credential has no administrative access to the project.","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"2e03883d-fae5-48a2-924b-80aad1b13c95":{"description":"The project does not exist or your key cannot reach it.","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"da1732b2-29fe-4aa3-bbaf-fe10b343c32e":{"description":"A tool with this name already exists in the same scope (the agent's private tools for an `agent_id` body, the project-wide tools otherwise; `error: tool_name_already_exists_for_agent`), or a resource the tool points at is not usable: a messaging or handoff channel, template or chat agent (`messaging_tool_invalid`, `handoff_tool_invalid`, with `detail`), a workflow that is missing or not started by a webhook (`workflow_missing`, `workflow_not_webhook`), or a knowledge base your organization does not have (`support_kb_org_missing`, `support_kb_org_empty`).","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"tool_name_already_exists_for_agent","project_id":"3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13","agent_id":null,"name":"lookup_order","hint":"A project-global tool with this name already exists."},"examples":{"Example":{"title":"Example","value":{"error":"tool_name_already_exists_for_agent","project_id":"3f6c1a52-8d0e-4b8f-9a51-2c7d4e0b9f13","agent_id":null,"name":"lookup_order","hint":"A project-global tool with this name already exists."}}},"exampleType":"examples"}},"exampleType":"examples"},"145d0682-9db9-490d-8cac-ccf73a74f1d6":{"description":"The body failed validation: a bad `name`, an unknown `type`, `configs` that do not fit the `type`, or invalid `async_config` or `session`. `issues` locates each problem; for `configs` the message names the offending field. A tool shared through the organization tool library is also refused here when its `channels` do not suit it (`channel_not_allowed`, `voice_only_setting`).","content":{"application/json":{"schema":{"type":"object","description":"A validation failure. `error` is a human-readable summary; `issues` (request validation) or `details` (agent configuration validation) locate each problem. A refused processing speed answers with `error` and `code` both `LLM_SERVICE_TIER_UNAVAILABLE` and the fields `path`, `reason`, `tier`, `provider` and `model`.","properties":{"error":{"type":"string","uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A machine-readable code, on the failures that carry one: `LLM_SERVICE_TIER_UNAVAILABLE` for a processing speed the agent cannot use.","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","uniqueKey":"message","typeLabel":"string"},"path":{"type":"string","description":"With `LLM_SERVICE_TIER_UNAVAILABLE`: the refused field, `agent_model_config.llm_service_tier`.","uniqueKey":"path","typeLabel":"string"},"reason":{"type":"string","enum":["model","organization"],"description":"With `LLM_SERVICE_TIER_UNAVAILABLE`: `model` when the language model does not offer the speed (or the value is not a speed at all), `organization` when your organization does not have it.","uniqueKey":"reason","typeLabel":"enum\u003cstring>"},"tier":{"type":"string","description":"With `LLM_SERVICE_TIER_UNAVAILABLE`, the refused value, as text.","uniqueKey":"tier","typeLabel":"string"},"provider":{"type":"string","description":"With `LLM_SERVICE_TIER_UNAVAILABLE`, the agent's language model provider.","uniqueKey":"provider","typeLabel":"string"},"model":{"type":"string","description":"With `LLM_SERVICE_TIER_UNAVAILABLE`, the agent's language model.","uniqueKey":"model","typeLabel":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","description":"Dotted path of the offending field","uniqueKey":"issues.items.[INDEX].path","typeLabel":"string"},"code":{"type":"string","uniqueKey":"issues.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"},"details":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"details.items.[INDEX]","typeLabel":"any"},"uniqueKey":"details","typeLabel":"any[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"configs: For type http, configs.url is required (a non-empty string)","issues":[{"path":"configs","code":"custom","message":"For type http, configs.url is required (a non-empty string)"}]},"examples":{"Example":{"title":"Example","value":{"error":"configs: For type http, configs.url is required (a non-empty string)","issues":[{"path":"configs","code":"custom","message":"For type http, configs.url is required (a non-empty string)"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"01ebd394-d957-48b5-bdc4-74b9022cf6a3":{"description":"A service the tool depends on (your support platform, for a workflow, knowledge base, messaging or handoff tool, or the organization tool library) could not be reached. Retry later.","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":true,"properties":{"error":{"type":"string","description":"Error message","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"A stable machine-readable reason, present on the refusals a client may branch on. Among them: `PUBLISH_CAPABILITY_REQUIRED` (403, the credential may not change what is live), `AGENT_NOT_PUBLISHED` (409, the agent has no published version yet), `AGENT_TYPE_NOT_DISPATCHABLE` (422, a Voice Assist agent named where an agent must place a call or answer one itself — a campaign, an outbound caller ID, a dispatched call, an eval; a number's inbound dispatch rule accepts one; the body carries `agent_type` and `agent_id`), `ASSIST_FLEET_NOT_CONFIGURED` (422 on a dispatch rule naming a Voice Assist agent in a project whose LiveKit has no Voice Assist listener), `NOT_APPLICABLE_TO_AGENT_TYPE` (422, a voice-only setting written on a Voice Assist agent), `AGENT_TYPE_BOUNDARY` (409), `AGENT_TYPE_NOT_SUPPORTED` (400), `INVALID_CUSTOMER_TIMEZONE` (400, `customer_timezone` is not a time zone name; the body carries the value), `VOICE_ASSISTANT_REQUIRED` (403, the organization is not licensed for Voice Assist), `ORGANIZATION_UNAVAILABLE` (503), `REGION_PROFILE_CONFLICT` (503), `LLM_SERVICE_TIER_UNAVAILABLE` (422, an agent's processing speed is not offered by its model or not enabled for the organization; `reason` says which) and `AUTH_UPSTREAM_UNAVAILABLE` (503 on any endpoint, with `Retry-After`: the credential could not be checked right now; it was not rejected and the request was not carried out).","uniqueKey":"code","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","code":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"79258329-9c11-41e2-825c-e7e86baa03e6":{"organizationApiKey":{"type":"http","scheme":"bearer","description":"Your organization API key (it starts with `anek_org_`). The same key works on the Voice API and the Support API. See [Authentication](/authentication).","scopes":[],"schemeName":"organizationApiKey"}}},"servers":{"c1b5bfaf-ca83-44db-afe9-8385e654f187":{"url":"https://voice-api.onclarity.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Your organization API key (it starts with `anek_org_`). The same key works on the Voice API and the Support API. See [Authentication](/authentication).","scopes":[],"schemeName":"organizationApiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Your organization API key (it starts with `anek_org_`). The same key works on the Voice API and the Support API. See [Authentication](/authentication).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"organizationApiKey","name":"Authorization"}],"title":"organizationApiKey"}]},"originalFileLocation":"api-reference/voice-openapi.json"},"subdomain":"on-clarity","siteName":"Clarity Support Docs","title":"Create a tool - Clarity Support Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T18:23:49.437Z","originalFileLocation":"api-reference/voice/tools/create-a-tool.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent\u0026#x27;s draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Clarity Support Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a tool - Clarity Support Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent\u0026#x27;s draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Clarity Support Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://on-clarity.mintlify.site/_mintlify/api/og/v2?division=Tools\u0026amp;title=Create+a+tool\u0026amp;description=Creates+a+tool.+Without+%60agent_id%60+it+is+project-wide%2C+so+any+agent+of+the+project+can+use+it%3B+with+%60agent_id%60+it+is+private+to+that+agent+and+attached+to+the+a\u0026amp;theme=d4d3ea60eb64236c312935e2\u0026amp;signature=5ebe723f7276b8b9eeed53bd368654e13cb60163b641edd450a09e5edc09a496\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a tool - Clarity Support Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent\u0026#x27;s draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://on-clarity.mintlify.site/_mintlify/api/og/v2?division=Tools\u0026amp;title=Create+a+tool\u0026amp;description=Creates+a+tool.+Without+%60agent_id%60+it+is+project-wide%2C+so+any+agent+of+the+project+can+use+it%3B+with+%60agent_id%60+it+is+private+to+that+agent+and+attached+to+the+a\u0026amp;theme=d4d3ea60eb64236c312935e2\u0026amp;signature=5ebe723f7276b8b9eeed53bd368654e13cb60163b641edd450a09e5edc09a496\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/on-clarity/mFVlSgsYkfg6E9Cg/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Clarity Support Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0aa68a\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/voice/tools/create-a-tool.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.support.onclarity.com/#organization\",\"name\":\"Clarity Support Docs\",\"url\":\"https://docs.support.onclarity.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/on-clarity/wANpiWtgQORdXhk3/logo/light.svg?fit=max\u0026auto=format\u0026n=wANpiWtgQORdXhk3\u0026q=85\u0026s=a67bcf8cb635c40e2371c3f86424d4a0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.support.onclarity.com#website\",\"name\":\"Clarity Support Docs\",\"url\":\"https://docs.support.onclarity.com\",\"publisher\":{\"@id\":\"https://docs.support.onclarity.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool#webpage\",\"url\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool\",\"name\":\"Create a tool\",\"description\":\"Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent's draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.\",\"dateModified\":\"2026-11-11T18:23:49.437Z\",\"isPartOf\":{\"@id\":\"https://docs.support.onclarity.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Voice API\",\"item\":\"https://docs.support.onclarity.com/api-reference/voice/projects/list-projects\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools\",\"item\":\"https://docs.support.onclarity.com/api-reference/voice/tools/list-tools\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a tool\",\"item\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool#apireference\",\"headline\":\"Create a tool\",\"name\":\"Create a tool\",\"description\":\"Creates a tool. Without agent_id it is project-wide, so any agent of the project can use it; with agent_id it is private to that agent and attached to the agent's draft straight away. The shape of configs depends on type (default http). A tool reaches live calls only once an agent using it is published.\",\"url\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool\",\"mainEntityOfPage\":{\"@id\":\"https://docs.support.onclarity.com/api-reference/voice/tools/create-a-tool#webpage\"},\"dateModified\":\"2026-11-11T18:23:49.437Z\",\"publisher\":{\"@id\":\"https://docs.support.onclarity.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.support.onclarity.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Clarity Support Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Clarity Support Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/voice/tools/create-a-tool.md","siteName":"Clarity Support Docs","nav":{"global":{"anchors":[{"anchor":"Open Clarity","icon":"arrow-up-right-from-square","href":"https://support.onclarity.com"},{"anchor":"Support","icon":"envelope","href":"mailto:hello@onclarity.com"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API Reference","groups":[{"group":"Getting started","pages":[{"title":"API introduction","href":"/api-reference/introduction"},{"title":"Errors","href":"/api-reference/errors"}]},{"group":"Voice API","pages":[{"group":"Projects","icon":"folder-open","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects","title":"List projects","icon":"folder-open","href":"/api-reference/voice/projects/list-projects"}]},{"group":"Agents","icon":"robot","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents","title":"List agents","icon":"robot","href":"/api-reference/voice/agents/list-agents"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents","title":"Create an agent","icon":"robot","href":"/api-reference/voice/agents/create-an-agent"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{id}","title":"Get an agent","icon":"robot","href":"/api-reference/voice/agents/get-an-agent"},{"openapi":"api-reference/voice-openapi.json PATCH /v1/projects/{projectId}/agents/{id}","title":"Update an agent","icon":"robot","href":"/api-reference/voice/agents/update-an-agent"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/agents/{id}","title":"Delete an agent","icon":"robot","href":"/api-reference/voice/agents/delete-an-agent"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{id}/clone","title":"Clone an agent","icon":"robot","href":"/api-reference/voice/agents/clone-an-agent"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{id}/publish","title":"Publish the draft","icon":"robot","href":"/api-reference/voice/agents/publish-the-draft"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{id}/discard-draft","title":"Discard the draft","icon":"robot","href":"/api-reference/voice/agents/discard-the-draft"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{id}/versions","title":"List an agent's versions","icon":"robot","href":"/api-reference/voice/agents/list-an-agents-versions"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{id}/versions/{versionId}","title":"Get an agent version","icon":"robot","href":"/api-reference/voice/agents/get-an-agent-version"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{id}/versions/{versionId}/republish","title":"Roll back to an earlier version","icon":"robot","href":"/api-reference/voice/agents/roll-back-to-an-earlier-version"}]},{"group":"Tools","icon":"wrench","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/tools","title":"List tools","icon":"wrench","description":"Returns the project's tools. Without `agent_id` the list holds both the project-wide tools and every agent's private tools. Pass `agent_id=null` for the project-wide tools only, or an agent id for that agent's private tools only. To see which tools an agent uses, list that agent's tools instead.","href":"/api-reference/voice/tools/list-tools"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/tools","title":"Create a tool","icon":"wrench","href":"/api-reference/voice/tools/create-a-tool"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/tools/{id}/push","title":"Push a tool to live agents","icon":"wrench","description":"Puts the tool's current definition into the published version of every agent that uses it, so live calls get the change without republishing each agent. Drafts and older versions are not touched. An agent whose published version would no longer be valid with the change is skipped and listed in `skipped` with the reason. Needs the publish permission, which organization API keys carry.","href":"/api-reference/voice/tools/push-a-tool-to-live-agents"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{id}/tools","title":"List an agent's tools","icon":"wrench","href":"/api-reference/voice/tools/list-an-agents-tools"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/agents/{id}/tools","title":"Set an agent's tools","icon":"wrench","href":"/api-reference/voice/tools/set-an-agents-tools"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/tools/{id}","title":"Get a tool","icon":"wrench","href":"/api-reference/voice/tools/get-a-tool"},{"openapi":"api-reference/voice-openapi.json PATCH /v1/projects/{projectId}/tools/{id}","title":"Update a tool","icon":"wrench","href":"/api-reference/voice/tools/update-a-tool"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/tools/{id}","title":"Delete a tool","icon":"wrench","href":"/api-reference/voice/tools/delete-a-tool"}]},{"group":"Outbound calls","icon":"phone-arrow-up-right","pages":[{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{id}/dispatch-call","title":"Dispatch an outbound call","icon":"phone-arrow-up-right","href":"/api-reference/voice/outbound-calls/dispatch-an-outbound-call"}]},{"group":"Conversations","icon":"comments","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/conversations","title":"List conversations","icon":"comments","href":"/api-reference/voice/conversations/list-conversations"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/conversations/{id}","title":"Get a conversation","icon":"comments","href":"/api-reference/voice/conversations/get-a-conversation"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/conversations/{id}/calls","title":"List a conversation's calls","icon":"comments","href":"/api-reference/voice/conversations/list-a-conversations-calls"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/conversations/{id}/artifacts","title":"Get conversation artifacts","icon":"comments","href":"/api-reference/voice/conversations/get-conversation-artifacts"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/conversations/{id}/metrics","title":"Get conversation metrics","icon":"comments","href":"/api-reference/voice/conversations/get-conversation-metrics"}]},{"group":"Calls","icon":"phone","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/calls","title":"List calls","icon":"phone","href":"/api-reference/voice/calls/list-calls"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/calls/{id}","title":"Get a call","icon":"phone","href":"/api-reference/voice/calls/get-a-call"}]},{"group":"Campaigns","icon":"bullhorn","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/campaigns","title":"List campaigns","icon":"bullhorn","href":"/api-reference/voice/campaigns/list-campaigns"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/campaigns","title":"Create a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/create-a-campaign"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/campaigns/{id}","title":"Get a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/get-a-campaign"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/campaigns/{id}","title":"Update a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/update-a-campaign"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/campaigns/{id}","title":"Delete a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/delete-a-campaign"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/campaigns/{id}/start","title":"Start a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/start-a-campaign"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/campaigns/{id}/cancel","title":"Cancel a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/cancel-a-campaign"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/campaigns/{id}/items","title":"Add contacts to a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/add-contacts-to-a-campaign"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/campaigns/{id}/items/{itemId}","title":"Update a campaign contact","icon":"bullhorn","href":"/api-reference/voice/campaigns/update-a-campaign-contact"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/campaigns/{id}/items/{itemId}","title":"Remove a campaign contact","icon":"bullhorn","href":"/api-reference/voice/campaigns/remove-a-campaign-contact"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/campaigns/{id}/clone","title":"Clone a campaign","icon":"bullhorn","href":"/api-reference/voice/campaigns/clone-a-campaign"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/campaigns/{id}/analytics","title":"Get campaign progress","icon":"bullhorn","href":"/api-reference/voice/campaigns/get-campaign-progress"}]},{"group":"Telephony","icon":"tower-broadcast","pages":[{"group":"Phone numbers","icon":"hashtag","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/phone-numbers","title":"List phone numbers","icon":"hashtag","href":"/api-reference/voice/phone-numbers/list-phone-numbers"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/phone-numbers","title":"Create a phone number","icon":"hashtag","href":"/api-reference/voice/phone-numbers/create-a-phone-number"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/phone-numbers/{id}","title":"Get a phone number","icon":"hashtag","href":"/api-reference/voice/phone-numbers/get-a-phone-number"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/phone-numbers/{id}","title":"Update a phone number","icon":"hashtag","href":"/api-reference/voice/phone-numbers/update-a-phone-number"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/phone-numbers/{id}","title":"Delete a phone number","icon":"hashtag","href":"/api-reference/voice/phone-numbers/delete-a-phone-number"}]},{"group":"Inbound SIP trunks","icon":"arrow-right-to-bracket","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/telephony/sip-trunks","title":"List inbound SIP trunks","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/list-inbound-sip-trunks"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/telephony/sip-trunks","title":"Create an inbound SIP trunk","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/create-an-inbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/telephony/sip-trunks/{id}","title":"Get an inbound SIP trunk","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/get-an-inbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/telephony/sip-trunks/{id}","title":"Update an inbound SIP trunk","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/update-an-inbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/telephony/sip-trunks/{id}","title":"Delete an inbound SIP trunk","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/delete-an-inbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/telephony/sip-trunks/{id}/activate","title":"Activate an inbound SIP trunk","icon":"arrow-right-to-bracket","href":"/api-reference/voice/inbound-sip-trunks/activate-an-inbound-sip-trunk"}]},{"group":"Outbound SIP trunks","icon":"arrow-right-from-bracket","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/telephony/outbound-trunks","title":"List outbound SIP trunks","icon":"arrow-right-from-bracket","href":"/api-reference/voice/outbound-sip-trunks/list-outbound-sip-trunks"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/telephony/outbound-trunks","title":"Create an outbound SIP trunk","icon":"arrow-right-from-bracket","href":"/api-reference/voice/outbound-sip-trunks/create-an-outbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/telephony/outbound-trunks/{id}","title":"Get an outbound SIP trunk","icon":"arrow-right-from-bracket","href":"/api-reference/voice/outbound-sip-trunks/get-an-outbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json PUT /v1/projects/{projectId}/telephony/outbound-trunks/{id}","title":"Update an outbound SIP trunk","icon":"arrow-right-from-bracket","href":"/api-reference/voice/outbound-sip-trunks/update-an-outbound-sip-trunk"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/telephony/outbound-trunks/{id}","title":"Delete an outbound SIP trunk","icon":"arrow-right-from-bracket","href":"/api-reference/voice/outbound-sip-trunks/delete-an-outbound-sip-trunk"}]}]},{"group":"Evals","icon":"flask-vial","pages":[{"group":"Suites","icon":"layer-group","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-suites","title":"List eval suites","icon":"layer-group","href":"/api-reference/voice/eval-suites/list-eval-suites"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/eval-suites","title":"Create an eval suite","icon":"layer-group","href":"/api-reference/voice/eval-suites/create-an-eval-suite"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-suites/{id}","title":"Get an eval suite","icon":"layer-group","href":"/api-reference/voice/eval-suites/get-an-eval-suite"},{"openapi":"api-reference/voice-openapi.json PATCH /v1/projects/{projectId}/eval-suites/{id}","title":"Update an eval suite","icon":"layer-group","href":"/api-reference/voice/eval-suites/update-an-eval-suite"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/eval-suites/{id}","title":"Delete an eval suite","icon":"layer-group","href":"/api-reference/voice/eval-suites/delete-an-eval-suite"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-suites/{id}/compare","title":"Compare submissions on a suite","icon":"layer-group","href":"/api-reference/voice/eval-suites/compare-submissions-on-a-suite"}]},{"group":"Test cases","icon":"list-check","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-test-cases","title":"List eval test cases","icon":"list-check","href":"/api-reference/voice/eval-test-cases/list-eval-test-cases"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-test-cases/{id}","title":"Get an eval test case","icon":"list-check","href":"/api-reference/voice/eval-test-cases/get-an-eval-test-case"}]},{"group":"Scenarios","icon":"masks-theater","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-scenarios","title":"List eval scenarios","icon":"masks-theater","href":"/api-reference/voice/eval-scenarios/list-eval-scenarios"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-scenarios/{id}","title":"Get an eval scenario","icon":"masks-theater","href":"/api-reference/voice/eval-scenarios/get-an-eval-scenario"}]},{"group":"Judges","icon":"scale-balanced","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-judges","title":"List eval judges","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/list-eval-judges"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/eval-judges","title":"Create an eval judge","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/create-an-eval-judge"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-judges/templates","title":"List judge prompt templates","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/list-judge-prompt-templates"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-judges/{id}","title":"Get an eval judge","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/get-an-eval-judge"},{"openapi":"api-reference/voice-openapi.json PATCH /v1/projects/{projectId}/eval-judges/{id}","title":"Update an eval judge","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/update-an-eval-judge"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/eval-judges/{id}","title":"Delete an eval judge","icon":"scale-balanced","href":"/api-reference/voice/eval-judges/delete-an-eval-judge"}]},{"group":"Runs","icon":"play","pages":[{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions","title":"List an agent's eval runs","icon":"play","href":"/api-reference/voice/eval-submissions/list-an-agents-eval-runs"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{agentId}/eval-submissions","title":"Create an eval run","icon":"play","href":"/api-reference/voice/eval-submissions/create-an-eval-run"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}","title":"Get an eval run","icon":"play","href":"/api-reference/voice/eval-submissions/get-an-eval-run"},{"openapi":"api-reference/voice-openapi.json PATCH /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}","title":"Update a paused eval run","icon":"play","href":"/api-reference/voice/eval-submissions/update-a-paused-eval-run"},{"openapi":"api-reference/voice-openapi.json DELETE /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}","title":"Delete an eval run","icon":"play","href":"/api-reference/voice/eval-submissions/delete-an-eval-run"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/verdicts","title":"List an eval run's verdicts","icon":"play","href":"/api-reference/voice/eval-submissions/list-an-eval-runs-verdicts"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/call-results","title":"List an eval run's calls","icon":"play","href":"/api-reference/voice/eval-submissions/list-an-eval-runs-calls"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/report","title":"Get an eval run's report","icon":"play","href":"/api-reference/voice/eval-submissions/get-an-eval-runs-report"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/improve-candidates","title":"Get the failed checks of an eval run and the calls to read for them","icon":"play","href":"/api-reference/voice/eval-submissions/get-the-failed-checks-of-an-eval-run-and-the-calls-to-read-for-them"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/run","title":"Start or resume an eval run","icon":"play","href":"/api-reference/voice/eval-submissions/start-or-resume-an-eval-run"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{agentId}/eval-submissions/{id}/pause","title":"Pause an eval run","icon":"play","href":"/api-reference/voice/eval-submissions/pause-an-eval-run"},{"openapi":"api-reference/voice-openapi.json POST /v1/projects/{projectId}/agents/{agentId}/run-all-evals","title":"Start all of an agent's paused eval runs","icon":"play","href":"/api-reference/voice/eval-submissions/start-all-of-an-agents-paused-eval-runs"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-submissions","title":"List all eval runs in a project","icon":"play","href":"/api-reference/voice/eval-submissions/list-all-eval-runs-in-a-project"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-submissions/{id}","title":"Get an eval run by id","icon":"play","href":"/api-reference/voice/eval-submissions/get-an-eval-run-by-id"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-submissions/{id}/status","title":"Get an eval run's status","icon":"play","href":"/api-reference/voice/eval-submissions/get-an-eval-runs-status"},{"openapi":"api-reference/voice-openapi.json GET /v1/projects/{projectId}/eval-submissions/{id}/verdicts","title":"List an eval run's verdicts by run id","icon":"play","href":"/api-reference/voice/eval-submissions/list-an-eval-runs-verdicts-by-run-id"}]}]}]},{"group":"Support API","pages":[{"group":"AI service","icon":"wand-magic-sparkles","pages":[{"openapi":"api-reference/support-openapi.json GET /api/integration/ai_service/ticket/{ticket_id}/details","title":"Get ticket details","icon":"wand-magic-sparkles","href":"/api-reference/support/ai-service/get-ticket-details"},{"openapi":"api-reference/support-openapi.json POST /api/integration/ai_service/ticket/{ticket_id}/voice_handoff","title":"Request a voice call","icon":"wand-magic-sparkles","href":"/api-reference/support/ai-service/request-a-voice-call"},{"openapi":"api-reference/support-openapi.json GET /api/integration/ai_service/customer/{customer_id}/details","title":"Get customer details","icon":"wand-magic-sparkles","href":"/api-reference/support/ai-service/get-customer-details"},{"openapi":"api-reference/support-openapi.json GET /api/integration/ai_service/customer/{customer_id}/tickets","title":"List a customer's tickets","icon":"wand-magic-sparkles","href":"/api-reference/support/ai-service/list-a-customers-tickets"},{"openapi":"api-reference/support-openapi.json POST /api/integration/ai_service/customer/send","title":"Send a customer message","icon":"wand-magic-sparkles","href":"/api-reference/support/ai-service/send-a-customer-message"}]},{"group":"Messages","icon":"message","pages":[{"openapi":"api-reference/support-openapi.json POST /api/message/send","title":"Send a message on a ticket","icon":"message","href":"/api-reference/support/messages/send-a-message-on-a-ticket"},{"openapi":"api-reference/support-openapi.json POST /api/attachment/upload","title":"Upload an attachment","icon":"message","href":"/api-reference/support/messages/upload-an-attachment"}]},{"group":"Customers","icon":"users","pages":[{"openapi":"api-reference/support-openapi.json POST /api/customer/create","title":"Create a customer","icon":"users","href":"/api-reference/support/customers/create-a-customer"},{"openapi":"api-reference/support-openapi.json POST /api/customer/delete","title":"Delete a customer","icon":"users","href":"/api-reference/support/customers/delete-a-customer"},{"openapi":"api-reference/support-openapi.json GET /api/customer/{customer_id}","title":"Get a customer","icon":"users","href":"/api-reference/support/customers/get-a-customer"},{"openapi":"api-reference/support-openapi.json POST /api/customer/edit","title":"Update a customer","icon":"users","href":"/api-reference/support/customers/update-a-customer"},{"openapi":"api-reference/support-openapi.json POST /api/customer/tags_set","title":"Set a customer's tags","icon":"users","href":"/api-reference/support/customers/set-a-customers-tags"},{"openapi":"api-reference/support-openapi.json GET /api/customer/list","title":"List customers","icon":"users","href":"/api-reference/support/customers/list-customers"},{"openapi":"api-reference/support-openapi.json GET /api/custom-attributes/definitions/list","title":"List custom attribute definitions","icon":"users","href":"/api-reference/support/customers/list-custom-attribute-definitions"},{"openapi":"api-reference/support-openapi.json GET /api/custom-attributes/values","title":"Get custom attribute values","icon":"users","href":"/api-reference/support/customers/get-custom-attribute-values"},{"openapi":"api-reference/support-openapi.json POST /api/custom-attributes/values/set","title":"Set a custom attribute value","icon":"users","href":"/api-reference/support/customers/set-a-custom-attribute-value"}]},{"group":"Tickets","icon":"ticket","pages":[{"openapi":"api-reference/support-openapi.json POST /api/ticket/category_set","title":"Set a ticket's category","icon":"ticket","href":"/api-reference/support/tickets/set-a-tickets-category"},{"openapi":"api-reference/support-openapi.json POST /api/ticket/status_set","title":"Set a ticket's status","icon":"ticket","href":"/api-reference/support/tickets/set-a-tickets-status"},{"openapi":"api-reference/support-openapi.json POST /api/ticket/tags_change","title":"Add or remove ticket tags","icon":"ticket","href":"/api-reference/support/tickets/add-or-remove-ticket-tags"},{"openapi":"api-reference/support-openapi.json POST /api/ticket/tags_set","title":"Set a ticket's tags","icon":"ticket","href":"/api-reference/support/tickets/set-a-tickets-tags"},{"openapi":"api-reference/support-openapi.json POST /api/ticket/assign/v2","title":"Assign a ticket","icon":"ticket","href":"/api-reference/support/tickets/assign-a-ticket"},{"openapi":"api-reference/support-openapi.json GET /api/ticket_priority/list","title":"List ticket priorities","icon":"ticket","href":"/api-reference/support/tickets/list-ticket-priorities"},{"openapi":"api-reference/support-openapi.json GET /api/ticket_status/list","title":"List ticket statuses","icon":"ticket","href":"/api-reference/support/tickets/list-ticket-statuses"},{"openapi":"api-reference/support-openapi.json GET /api/ticket_category/list","title":"List ticket categories","icon":"ticket","href":"/api-reference/support/tickets/list-ticket-categories"},{"openapi":"api-reference/support-openapi.json GET /api/agent/list","title":"List agents","icon":"ticket","href":"/api-reference/support/tickets/list-agents"},{"openapi":"api-reference/support-openapi.json GET /api/team/list","title":"List teams","icon":"ticket","href":"/api-reference/support/tickets/list-teams"},{"openapi":"api-reference/support-openapi.json GET /api/tag/list","title":"List tags","icon":"ticket","href":"/api-reference/support/tickets/list-tags"}]},{"group":"Knowledge base","icon":"book-open","pages":[{"openapi":"api-reference/support-openapi.json POST /api/kb/articles/create","title":"Create an article","icon":"book-open","href":"/api-reference/support/knowledge-base/create-an-article"},{"openapi":"api-reference/support-openapi.json DELETE /api/kb/articles/delete","title":"Delete an article","icon":"book-open","href":"/api-reference/support/knowledge-base/delete-an-article"},{"openapi":"api-reference/support-openapi.json GET /api/kb/articles/detail","title":"Get an article","icon":"book-open","href":"/api-reference/support/knowledge-base/get-an-article"},{"openapi":"api-reference/support-openapi.json GET /api/kb/meta","title":"Get knowledge base metadata","icon":"book-open","href":"/api-reference/support/knowledge-base/get-knowledge-base-metadata"},{"openapi":"api-reference/support-openapi.json POST /api/kb/articles/list","title":"List articles","icon":"book-open","href":"/api-reference/support/knowledge-base/list-articles"},{"openapi":"api-reference/support-openapi.json PATCH /api/kb/articles/update","title":"Update an article","icon":"book-open","href":"/api-reference/support/knowledge-base/update-an-article"},{"openapi":"api-reference/support-openapi.json POST /api/kb/articles/upload","title":"Upload articles from a file","icon":"book-open","href":"/api-reference/support/knowledge-base/upload-articles-from-a-file"}]},{"group":"Webhooks","icon":"bolt","pages":[{"openapi":"api-reference/support-openapi.json POST /api/webhooks/create","title":"Create a webhook","icon":"bolt","href":"/api-reference/support/webhooks/create-a-webhook"},{"openapi":"api-reference/support-openapi.json GET /api/webhooks/{webhook_id}","title":"Get a webhook","icon":"bolt","href":"/api-reference/support/webhooks/get-a-webhook"},{"openapi":"api-reference/support-openapi.json DELETE /api/webhooks/{webhook_id}","title":"Delete a webhook","icon":"bolt","href":"/api-reference/support/webhooks/delete-a-webhook"},{"openapi":"api-reference/support-openapi.json GET /api/webhooks/events/list","title":"List webhook events","icon":"bolt","href":"/api-reference/support/webhooks/list-webhook-events"},{"openapi":"api-reference/support-openapi.json GET /api/webhooks/list","title":"List webhooks","icon":"bolt","href":"/api-reference/support/webhooks/list-webhooks"},{"openapi":"api-reference/support-openapi.json POST /api/webhooks/edit","title":"Update a webhook","icon":"bolt","href":"/api-reference/support/webhooks/update-a-webhook"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Create a tool - Clarity Support Docs","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-NXj-Rqjv.js","utils-m0thOP-_.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D13EKcfm.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema--XTdfsEb.js","snippetPresets-D3s4lmAH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-ChURybxL.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DL8CiXq2.js","shallow-DI2-YB2E.js","getApiPlaygroundDisplay-DxbW7b_y.js","CodeSnippet-CiNYS0pP.js","CodeSnippets-BT87bThu.js","Page-DSpdRuhM.js","getPastedJson-F_g_IrFQ.js","icon-CCIG5BAs.js","MethodPill-DY3E0jwx.js","DuplicateIcon-BN88xnEg.js","createIcon-VCCc5HO5.js","DynamicMarkdown-CaSwclgK.js","SectionHeading-DXV8nWhc.js","axios-vUo_bRtp.js","Markdown-CV32Re6G.js","clsx-5ydLOnhV.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-pFDdfjRe.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BUGO5bPJ.js"]}