Update a tool description
Change only the description of one existing in-call tool. Call GET /api/agent-builder/agents/{id}?view=tools, then copy the installed tool’s exact tools[].name into toolName. For example, an installed tool with name: "transfer_call" is updated with toolName: "transfer_call". Names are case-sensitive.
GET /api/agent-builder/tools is a catalog: its name is a display label such as “Live Transfer”, and its type is the kind of skill to install. Neither is necessarily the installed tool name. One catalog entry can create several tools. Use the installed list to choose the one to edit. This operation does not install a tool.
If a skill owns the tool, a later skill save may regenerate its description, so edit the owning skill instead.
Required API key scope: agents:write.
curl --request PATCH \
--url https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"toolName": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}'import requests
url = "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools"
payload = {
"toolName": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
toolName: 'transfer_call',
description: 'Use when the caller asks to speak with a person.'
})
};
fetch('https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'toolName' => 'transfer_call',
'description' => 'Use when the caller asks to speak with a person.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools"
payload := strings.NewReader("{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"tool": {
"name": "transfer_call",
"type": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "SUBACCOUNT_DISCONNECTED",
"message": "This sub-account is disconnected. Please reconnect it before editing the agent."
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}Authorizations
Body
curl --request PATCH \
--url https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"toolName": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}'import requests
url = "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools"
payload = {
"toolName": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
toolName: 'transfer_call',
description: 'Use when the caller asks to speak with a person.'
})
};
fetch('https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'toolName' => 'transfer_call',
'description' => 'Use when the caller asks to speak with a person.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools"
payload := strings.NewReader("{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/agent-builder/agents/{id}/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"toolName\": \"transfer_call\",\n \"description\": \"Use when the caller asks to speak with a person.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"tool": {
"name": "transfer_call",
"type": "transfer_call",
"description": "Use when the caller asks to speak with a person."
}
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "SUBACCOUNT_DISCONNECTED",
"message": "This sub-account is disconnected. Please reconnect it before editing the agent."
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}{
"success": false,
"error": "NotFound",
"message": "We couldn't find that. It may have been moved or deleted.",
"errors": [
{
"field": "name",
"code": "FieldRequired",
"message": "Please fill this in."
}
],
"details": {},
"ref": "3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b"
}