Tools
Update native tool
Change a native tool’s settings: its wording, a transfer’s destination, an SMS tool’s content or Twilio account. Send only the fields you are changing; saved credentials are kept when you send them back as the placeholder.
PUT
/
tool
/
native
/
{id}
Update native tool
curl --request PUT \
--url https://api.verbeo.ai/v1/tool/native/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": {},
"transfer_call_mode": "<string>",
"transfer_call_destination": {},
"transfer_call_type": "<string>",
"sms_content_type": "<string>",
"sms_static_message": {},
"twilio_account_sid": {},
"twilio_auth_token": {},
"twilio_from_number": {},
"timeout_seconds": 123
}
'import requests
url = "https://api.verbeo.ai/v1/tool/native/{id}"
payload = {
"description": {},
"transfer_call_mode": "<string>",
"transfer_call_destination": {},
"transfer_call_type": "<string>",
"sms_content_type": "<string>",
"sms_static_message": {},
"twilio_account_sid": {},
"twilio_auth_token": {},
"twilio_from_number": {},
"timeout_seconds": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: {},
transfer_call_mode: '<string>',
transfer_call_destination: {},
transfer_call_type: '<string>',
sms_content_type: '<string>',
sms_static_message: {},
twilio_account_sid: {},
twilio_auth_token: {},
twilio_from_number: {},
timeout_seconds: 123
})
};
fetch('https://api.verbeo.ai/v1/tool/native/{id}', 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.verbeo.ai/v1/tool/native/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'description' => [
],
'transfer_call_mode' => '<string>',
'transfer_call_destination' => [
],
'transfer_call_type' => '<string>',
'sms_content_type' => '<string>',
'sms_static_message' => [
],
'twilio_account_sid' => [
],
'twilio_auth_token' => [
],
'twilio_from_number' => [
],
'timeout_seconds' => 123
]),
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.verbeo.ai/v1/tool/native/{id}"
payload := strings.NewReader("{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.verbeo.ai/v1/tool/native/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v1/tool/native/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}"
response = http.request(request)
puts response.read_bodyUpdates a native tool in place and copies the result into the assistant’s
The rules that span fields are checked against the tool as it would be saved, the stored settings plus your changes. A static transfer needs a destination, a static SMS needs its message, and a Twilio SID and token are saved both or neither. So you can replace the token alone, and you remove a tool’s own Twilio account by sending both as
config.nativeTools, so the assistant shows the same settings. It never switches the tool on or off: do that with nativeTools on the assistant, or delete the tool.
Path parameters
string
required
UUID of the native tool. A custom tool’s id answers
404 NOT_FOUND: change those with Update custom tool.Body
At least one field is required. A tool takes only its own settings, the ones Create native tool lists for its name; anything else,tool_name included, is ignored. Every field is optional and anything you leave out is untouched.
string | null
null stores an empty description.string
transfer_call only: static or dynamic. The tool’s argument schema follows the mode. null is read as “not sent”.string | null
transfer_call only. null clears it, which a static transfer refuses.string
transfer_call only: cold or warm. null is read as “not sent”.string
send_sms only: prompt or static. The tool’s argument schema follows it. null is read as “not sent”.string | null
send_sms only.string | null
send_sms only. "********", which is what a read returns, keeps the saved one; a new SID replaces it; null clears it.string | null
send_sms only. Leave it out, or send "********", to keep the saved token; a new token replaces it; null clears it.string | null
send_sms only. null clears it.number
send_sms only: 5–300. null is read as “not sent”.null:
{ "twilio_account_sid": null, "twilio_auth_token": null }
Request
curl -X PUT "https://api.verbeo.ai/v1/tool/native/5a7d1c3e-2b4f-4e6a-8c9d-0e1f2a3b4c5d" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "transfer_call_destination": "+15557654321", "transfer_call_type": "warm" }'
const id = "5a7d1c3e-2b4f-4e6a-8c9d-0e1f2a3b4c5d";
const res = await fetch(`https://api.verbeo.ai/v1/tool/native/${id}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.VERBEO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ transfer_call_destination: "+15557654321", transfer_call_type: "warm" }),
});
const { data: tool } = await res.json();
import os, requests
tool_id = "5a7d1c3e-2b4f-4e6a-8c9d-0e1f2a3b4c5d"
tool = requests.put(
f"https://api.verbeo.ai/v1/tool/native/{tool_id}",
headers={"Authorization": f"Bearer {os.environ['VERBEO_API_KEY']}"},
json={"transfer_call_destination": "+15557654321", "transfer_call_type": "warm"},
).json()["data"]
Response
200 OK with the updated tool object.
{
"success": true,
"data": {
"id": "5a7d1c3e-2b4f-4e6a-8c9d-0e1f2a3b4c5d",
"tool_name": "transfer_call",
"is_native": true,
"transfer_call_mode": "static",
"transfer_call_destination": "+15557654321",
"transfer_call_type": "warm",
"updated_at": "2026-01-23T09:12:00.456789+00:00",
"…": "the rest of the tool object"
}
}
Errors
| Code | Status | When |
|---|---|---|
VALIDATION_FAILED | 422 | id is not a UUID; an empty body, or one with none of this tool’s settings (No fields to update); a malformed field; or a change that breaks a rule that spans fields: transfer_call_destination: required for a static transfer, sms_static_message: required when sms_content_type is static, twilio_auth_token: required when twilio_account_sid is set, or the reverse. |
NOT_FOUND | 404 | No such tool, or it belongs to another workspace (Tool not found); or the id is a custom tool’s (Native tool not found). |
Was this page helpful?
⌘I
Update native tool
curl --request PUT \
--url https://api.verbeo.ai/v1/tool/native/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": {},
"transfer_call_mode": "<string>",
"transfer_call_destination": {},
"transfer_call_type": "<string>",
"sms_content_type": "<string>",
"sms_static_message": {},
"twilio_account_sid": {},
"twilio_auth_token": {},
"twilio_from_number": {},
"timeout_seconds": 123
}
'import requests
url = "https://api.verbeo.ai/v1/tool/native/{id}"
payload = {
"description": {},
"transfer_call_mode": "<string>",
"transfer_call_destination": {},
"transfer_call_type": "<string>",
"sms_content_type": "<string>",
"sms_static_message": {},
"twilio_account_sid": {},
"twilio_auth_token": {},
"twilio_from_number": {},
"timeout_seconds": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: {},
transfer_call_mode: '<string>',
transfer_call_destination: {},
transfer_call_type: '<string>',
sms_content_type: '<string>',
sms_static_message: {},
twilio_account_sid: {},
twilio_auth_token: {},
twilio_from_number: {},
timeout_seconds: 123
})
};
fetch('https://api.verbeo.ai/v1/tool/native/{id}', 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.verbeo.ai/v1/tool/native/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'description' => [
],
'transfer_call_mode' => '<string>',
'transfer_call_destination' => [
],
'transfer_call_type' => '<string>',
'sms_content_type' => '<string>',
'sms_static_message' => [
],
'twilio_account_sid' => [
],
'twilio_auth_token' => [
],
'twilio_from_number' => [
],
'timeout_seconds' => 123
]),
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.verbeo.ai/v1/tool/native/{id}"
payload := strings.NewReader("{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.verbeo.ai/v1/tool/native/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v1/tool/native/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": {},\n \"transfer_call_mode\": \"<string>\",\n \"transfer_call_destination\": {},\n \"transfer_call_type\": \"<string>\",\n \"sms_content_type\": \"<string>\",\n \"sms_static_message\": {},\n \"twilio_account_sid\": {},\n \"twilio_auth_token\": {},\n \"twilio_from_number\": {},\n \"timeout_seconds\": 123\n}"
response = http.request(request)
puts response.read_body