API reference
Tools
Functions an agent calls during the call: your HTTPS endpoint, a search of web pages, an SMS or an email. A tool is attached to an agent through its call flow.
List tools
/v1/toolsList every tool of the account, sorted by name.
A tool is a function the agent can call during a conversation. Four types are available:
custom— POST the arguments the agent collected to your own HTTPS endpoint (OpenAI function calling:config.parametersis the JSON Schema of the arguments).query— let the agent search the content of one or more web pages to answer a question.sendSms— send a templated SMS during the call (to a fixed number, or to the caller whenconfig.tois omitted).sendEmail— send a templated email during the call; the agent's notes are passed as thenotesargument.
Transferring the call to a phone number, handing over to another agent and ending the call are not tools: they are nodes of the agent diagram (forwardCall, forwardAgent, endCall in GET /v1/agents/{agentId}). MCP servers, code execution and transfer cancellation are not available.
A tool is attached to an agent by referencing it in a knowHow node prompt of the agent diagram (see AgentDiagram).
Authorization
AuthorizationstringrequiredBearer <API key>, a key created at app.callshift.ai/api-keys.
Responses
Tools retrieved successfully
dataobject[]requiredShow the variants
idstring<uuid>requiredtypeenum<string>requiredcustomnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlstring<uri>requiredHTTPS endpoint that receives a POST with the collected arguments.
apiTimeoutintegerSeconds to wait for the endpoint (default 10).
parametersobjectJSON Schema of the arguments the agent collects before calling the tool, in the OpenAI function calling format. The root must be an object.
Show child attributes
typeenum<string>requiredobjectpropertiesobjectrequiredrequiredstring[]asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredquerynamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlsobject[]requiredWeb pages the agent may search.
Show child attributes
urlstring<uri>requiredasyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendSmsnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
bodystringrequiredSMS text.
tostringRecipient in E.164 format. Omit to send the SMS to the caller.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendEmailnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
subjectstringrequiredEmail subject. <email-placeholder-node variablename="…">…</email-placeholder-node> tokens are replaced at call time; variables: contact.email, contact.firstName, contact.lastName, caller.phoneNumber, notes.
bodystringrequiredHTML body. Accepts the same variable tokens as the subject.
tostring[]requiredRecipients: email addresses, or <email-placeholder-node variablename="contact.email">contact email</email-placeholder-node> to email the contact on the call.
notesInstructionsstringWhat the agent should put in the notes argument it passes to the tool.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredUnauthorized
errorstringrequiredInternal server error
errorstringrequiredcurl "https://api.callshift.ai/v1/tools" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY"const res = await fetch("https://api.callshift.ai/v1/tools", {
headers: {
Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
"https://api.callshift.ai/v1/tools",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
)
print(res.json()){
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"async": false,
"messages": {
"requestStart": {
"content": "Let me check that for you.",
"blocking": true
},
"requestFailed": {
"content": "I could not check that right now."
}
}
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
]
}{
"error": "Authentication error"
}{
"error": "Internal server error"
}Create a tool
/v1/toolsCreate a tool of one of the four types. The body is discriminated by type; each variant documents a complete example.
A tool is a function the agent can call during a conversation. Four types are available:
custom— POST the arguments the agent collected to your own HTTPS endpoint (OpenAI function calling:config.parametersis the JSON Schema of the arguments).query— let the agent search the content of one or more web pages to answer a question.sendSms— send a templated SMS during the call (to a fixed number, or to the caller whenconfig.tois omitted).sendEmail— send a templated email during the call; the agent's notes are passed as thenotesargument.
Transferring the call to a phone number, handing over to another agent and ending the call are not tools: they are nodes of the agent diagram (forwardCall, forwardAgent, endCall in GET /v1/agents/{agentId}). MCP servers, code execution and transfer cancellation are not available.
A tool is attached to an agent by referencing it in a knowHow node prompt of the agent diagram (see AgentDiagram).
Authorization
AuthorizationstringrequiredBearer <API key>, a key created at app.callshift.ai/api-keys.
Body application/json
typeenum<string>requiredcustomnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstringTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlstring<uri>requiredHTTPS endpoint that receives a POST with the collected arguments.
apiTimeoutintegerSeconds to wait for the endpoint (default 10).
parametersobjectJSON Schema of the arguments the agent collects before calling the tool, in the OpenAI function calling format. The root must be an object.
Show child attributes
typeenum<string>requiredobjectpropertiesobjectrequiredrequiredstring[]asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegertypeenum<string>requiredquerynamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstringTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlsobject[]requiredWeb pages the agent may search.
Show child attributes
urlstring<uri>requiredasyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegertypeenum<string>requiredsendSmsnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstringTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
bodystringrequiredSMS text.
tostringRecipient in E.164 format. Omit to send the SMS to the caller.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegertypeenum<string>requiredsendEmailnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstringTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
subjectstringrequiredEmail subject. <email-placeholder-node variablename="…">…</email-placeholder-node> tokens are replaced at call time; variables: contact.email, contact.firstName, contact.lastName, caller.phoneNumber, notes.
bodystringrequiredHTML body. Accepts the same variable tokens as the subject.
tostring[]requiredRecipients: email addresses, or <email-placeholder-node variablename="contact.email">contact email</email-placeholder-node> to email the contact on the call.
notesInstructionsstringWhat the agent should put in the notes argument it passes to the tool.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegerResponses
Tool created successfully
idstring<uuid>requiredtypeenum<string>requiredcustomnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlstring<uri>requiredHTTPS endpoint that receives a POST with the collected arguments.
apiTimeoutintegerSeconds to wait for the endpoint (default 10).
parametersobjectJSON Schema of the arguments the agent collects before calling the tool, in the OpenAI function calling format. The root must be an object.
Show child attributes
typeenum<string>requiredobjectpropertiesobjectrequiredrequiredstring[]asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredquerynamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlsobject[]requiredWeb pages the agent may search.
Show child attributes
urlstring<uri>requiredasyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendSmsnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
bodystringrequiredSMS text.
tostringRecipient in E.164 format. Omit to send the SMS to the caller.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendEmailnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
subjectstringrequiredEmail subject. <email-placeholder-node variablename="…">…</email-placeholder-node> tokens are replaced at call time; variables: contact.email, contact.firstName, contact.lastName, caller.phoneNumber, notes.
bodystringrequiredHTML body. Accepts the same variable tokens as the subject.
tostring[]requiredRecipients: email addresses, or <email-placeholder-node variablename="contact.email">contact email</email-placeholder-node> to email the contact on the call.
notesInstructionsstringWhat the agent should put in the notes argument it passes to the tool.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredInvalid request body
successenum<boolean>requiredfalseerrorobjectrequiredShow child attributes
nameenum<string>requiredZodErrorissuesobject[]requiredShow child attributes
codestringrequiredpathstring | number[]requiredmessagestringrequiredUnauthorized
errorstringrequiredInternal server error
errorstringrequiredcurl -X POST "https://api.callshift.ai/v1/tools" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"messages": {
"requestStart": {
"content": "Let me look that up."
}
}
}
}'const res = await fetch("https://api.callshift.ai/v1/tools", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"messages": {
"requestStart": {
"content": "Let me look that up."
}
}
}
}),
});
const data = await res.json();import os
import requests
res = requests.post(
"https://api.callshift.ai/v1/tools",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
json={
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234",
},
},
"required": [
"orderNumber",
],
},
"messages": {
"requestStart": {
"content": "Let me look that up.",
},
},
},
},
)
print(res.json()){
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"async": false,
"messages": {
"requestStart": {
"content": "Let me check that for you.",
"blocking": true
},
"requestFailed": {
"content": "I could not check that right now."
}
}
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}{
"success": false,
"error": {
"name": "ZodError",
"issues": [
{
"code": "invalid_enum_value",
"path": [
"contacts",
0,
"email"
],
"message": "Invalid email"
}
]
}
}{
"error": "Authentication error"
}{
"error": "Internal server error"
}Get a tool
/v1/tools/{toolId}Authorization
AuthorizationstringrequiredBearer <API key>, a key created at app.callshift.ai/api-keys.
Path parameters
toolIdstring<uuid>requiredResponses
Tool retrieved successfully
idstring<uuid>requiredtypeenum<string>requiredcustomnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlstring<uri>requiredHTTPS endpoint that receives a POST with the collected arguments.
apiTimeoutintegerSeconds to wait for the endpoint (default 10).
parametersobjectJSON Schema of the arguments the agent collects before calling the tool, in the OpenAI function calling format. The root must be an object.
Show child attributes
typeenum<string>requiredobjectpropertiesobjectrequiredrequiredstring[]asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredquerynamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlsobject[]requiredWeb pages the agent may search.
Show child attributes
urlstring<uri>requiredasyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendSmsnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
bodystringrequiredSMS text.
tostringRecipient in E.164 format. Omit to send the SMS to the caller.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendEmailnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
subjectstringrequiredEmail subject. <email-placeholder-node variablename="…">…</email-placeholder-node> tokens are replaced at call time; variables: contact.email, contact.firstName, contact.lastName, caller.phoneNumber, notes.
bodystringrequiredHTML body. Accepts the same variable tokens as the subject.
tostring[]requiredRecipients: email addresses, or <email-placeholder-node variablename="contact.email">contact email</email-placeholder-node> to email the contact on the call.
notesInstructionsstringWhat the agent should put in the notes argument it passes to the tool.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredUnauthorized
errorstringrequiredTool not found
errorstringrequiredInternal server error
errorstringrequiredcurl "https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY"const res = await fetch("https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000", {
headers: {
Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
"https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
)
print(res.json()){
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"async": false,
"messages": {
"requestStart": {
"content": "Let me check that for you.",
"blocking": true
},
"requestFailed": {
"content": "I could not check that right now."
}
}
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}{
"error": "Authentication error"
}{
"error": "Tool not found"
}{
"error": "Internal server error"
}Update a tool
/v1/tools/{toolId}Change the name, the description or part of the config. Each top-level config field sent replaces the stored one as a whole (send all of messages or parameters to change one entry), omitted fields keep their value, and null clears an optional field. The resulting config is validated against the tool's type.
Authorization
AuthorizationstringrequiredBearer <API key>, a key created at app.callshift.ai/api-keys.
Path parameters
toolIdstring<uuid>requiredBody application/json
namestringName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullTells the agent what the tool does and when to use it.
configobjectTop-level fields to change in the tool's config, each replacing the stored value as a whole (null clears it). They are merged over the stored config and the result is validated against the schema of the tool's type (CustomToolConfig, QueryToolConfig, SendSmsToolConfig or SendEmailToolConfig). The type itself cannot change: delete the tool and create a new one.
Responses
Tool updated successfully
idstring<uuid>requiredtypeenum<string>requiredcustomnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlstring<uri>requiredHTTPS endpoint that receives a POST with the collected arguments.
apiTimeoutintegerSeconds to wait for the endpoint (default 10).
parametersobjectJSON Schema of the arguments the agent collects before calling the tool, in the OpenAI function calling format. The root must be an object.
Show child attributes
typeenum<string>requiredobjectpropertiesobjectrequiredrequiredstring[]asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredquerynamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
urlsobject[]requiredWeb pages the agent may search.
Show child attributes
urlstring<uri>requiredasyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendSmsnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
bodystringrequiredSMS text.
tostringRecipient in E.164 format. Omit to send the SMS to the caller.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredidstring<uuid>requiredtypeenum<string>requiredsendEmailnamestringrequiredName shown in the dashboard. Its camelCase form is the function name the agent calls, so keep it unique per tenant. Agent prompts reference a tool by that function name: renaming a tool detaches it from the agents that use it until their <tool-node functionname> is updated.
descriptionstring | nullrequiredTells the agent what the tool does and when to use it.
configobjectrequiredShow child attributes
subjectstringrequiredEmail subject. <email-placeholder-node variablename="…">…</email-placeholder-node> tokens are replaced at call time; variables: contact.email, contact.firstName, contact.lastName, caller.phoneNumber, notes.
bodystringrequiredHTML body. Accepts the same variable tokens as the subject.
tostring[]requiredRecipients: email addresses, or <email-placeholder-node variablename="contact.email">contact email</email-placeholder-node> to email the contact on the call.
notesInstructionsstringWhat the agent should put in the notes argument it passes to the tool.
asyncbooleanWhen true the agent does not wait for the result and continues the conversation.
messagesobjectOptional sentences the agent speaks around the tool call. An omitted requestStart or requestDelayed gets a default; one sent without content is silent.
Show child attributes
requestStartobjectSpoken when the tool call starts.
Show child attributes
contentstringWhat the agent says, in the agent's language.
blockingbooleanWait for the message to be spoken before calling the tool.
requestCompleteobjectSpoken when the tool call succeeds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
roleenum<string>assistantsystemrequestFailedobjectSpoken when the tool call fails.
Show child attributes
contentstringWhat the agent says, in the agent's language.
requestDelayedobjectSpoken when the tool has not answered after timingMilliseconds.
Show child attributes
contentstringWhat the agent says, in the agent's language.
timingMillisecondsintegercreatedAtstringrequiredupdatedAtstring | nullrequiredInvalid request body
successenum<boolean>requiredfalseerrorobjectrequiredShow child attributes
nameenum<string>requiredZodErrorissuesobject[]requiredShow child attributes
codestringrequiredpathstring | number[]requiredmessagestringrequiredUnauthorized
errorstringrequiredTool not found
errorstringrequiredInternal server error
errorstringrequiredcurl -X PATCH "https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"config": {
"url": "https://example.com/api/v2/orders/lookup"
}
}'const res = await fetch("https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"config": {
"url": "https://example.com/api/v2/orders/lookup"
}
}),
});
const data = await res.json();import os
import requests
res = requests.patch(
"https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
json={
"config": {
"url": "https://example.com/api/v2/orders/lookup",
},
},
)
print(res.json()){
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "custom",
"name": "Check order",
"description": "Looks up an order by its number and returns its status.",
"config": {
"url": "https://example.com/api/orders/lookup",
"apiTimeout": 10,
"parameters": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, e.g. ORD-1234"
}
},
"required": [
"orderNumber"
]
},
"async": false,
"messages": {
"requestStart": {
"content": "Let me check that for you.",
"blocking": true
},
"requestFailed": {
"content": "I could not check that right now."
}
}
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}{
"success": false,
"error": {
"name": "ZodError",
"issues": [
{
"code": "invalid_enum_value",
"path": [
"contacts",
0,
"email"
],
"message": "Invalid email"
}
]
}
}{
"error": "Authentication error"
}{
"error": "Tool not found"
}{
"error": "Internal server error"
}Delete a tool
/v1/tools/{toolId}Delete a tool. Refused with a 409 while an agent prompt still references it, unless force=true.
Authorization
AuthorizationstringrequiredBearer <API key>, a key created at app.callshift.ai/api-keys.
Path parameters
toolIdstring<uuid>requiredQuery parameters
forceenum<string>Delete the tool even if agents still reference it. Their prompts keep the reference, which is skipped when the agent is built.
truefalseResponses
Tool deleted successfully
No content.
Unauthorized
errorstringrequiredTool not found
errorstringrequiredThe tool is referenced by at least one agent
errorenum<string>requiredTool is attached to agentsagentsobject[]requiredShow child attributes
idstring<uuid>requirednamestringrequiredInternal server error
errorstringrequiredcurl -X DELETE "https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY"const res = await fetch("https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}`,
},
});
console.log(res.status); // 204import os
import requests
res = requests.delete(
"https://api.callshift.ai/v1/tools/550e8400-e29b-41d4-a716-446655440000",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
)
print(res.status_code) # 204No content{
"error": "Authentication error"
}{
"error": "Tool not found"
}{
"error": "Tool is attached to agents",
"agents": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Alice"
}
]
}{
"error": "Internal server error"
}