Assistants
Create assistant
Create an AI voice agent in your workspace. Send as little as a name — the configuration is completed with the same defaults a dashboard-created assistant gets.
POST
/
assistant
Create assistant
curl --request POST \
--url https://api.verbeo.ai/v1/assistant \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agent_name": "<string>",
"agent_type": "<string>",
"config": {}
}
'import requests
url = "https://api.verbeo.ai/v1/assistant"
payload = {
"agent_name": "<string>",
"agent_type": "<string>",
"config": {}
}
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({agent_name: '<string>', agent_type: '<string>', config: {}})
};
fetch('https://api.verbeo.ai/v1/assistant', 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/assistant",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent_name' => '<string>',
'agent_type' => '<string>',
'config' => [
]
]),
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/assistant"
payload := strings.NewReader("{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.verbeo.ai/v1/assistant")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v1/assistant")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}"
response = http.request(request)
puts response.read_bodyCreates an assistant in the workspace your API key belongs to, provisions the native tools its configuration enables, and returns the finished object.
Unknown fields are ignored rather than rejected, so you can send an assistant object straight back.
Nothing is created when a request fails — if the tools cannot be provisioned, the assistant is removed again rather than left half-built.
Body
string
required
Display name, 1–255 characters. Trimmed before it is stored.
string
default:"Single Prompt"
Prompt style.
object
The configuration document — see the assistant object. Every key you leave out is filled in, so
{} produces a working assistant.Request
curl -X POST "https://api.verbeo.ai/v1/assistant" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_name": "Customer Support",
"config": {
"systemPrompt": "You are a friendly support agent for Acme.",
"voice": { "voiceId": "Charon" },
"settings": { "maxCallDuration": 10 }
}
}'
const res = await fetch("https://api.verbeo.ai/v1/assistant", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VERBEO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
agent_name: "Customer Support",
config: {
systemPrompt: "You are a friendly support agent for Acme.",
voice: { voiceId: "Charon" },
},
}),
});
const { data: assistant } = await res.json();
import os, requests
res = requests.post(
"https://api.verbeo.ai/v1/assistant",
headers={"Authorization": f"Bearer {os.environ['VERBEO_API_KEY']}"},
json={
"agent_name": "Customer Support",
"config": {
"systemPrompt": "You are a friendly support agent for Acme.",
"voice": {"voiceId": "Charon"},
},
},
)
assistant = res.json()["data"]
Response
201 Created with the complete assistant, including the defaults that were filled in and the toolIds that were provisioned for it.
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"agent_name": "Customer Support",
"agent_type": "Single Prompt",
"config": {
"systemPrompt": "You are a friendly support agent for Acme.",
"voice": { "voiceId": "Charon" },
"toolIds": ["4f1c2d8e-77a1-4a5e-9b31-1f0a2c3d4e5f"],
"fileSearchStoreIds": [],
"nativeTools": { "end_call": { "enabled": true } },
"settings": {
"initialMessage": { "enabled": true },
"maxCallDuration": 10,
"endCallOnSilence": true,
"silenceTimeoutMinutes": 2,
"voicemailDetection": { "enabled": true, "action": "hangup" },
"thinkingLevel": "medium",
"webhookUrl": "",
"postCallAnalysis": { "enabled": false, "fields": [] }
}
},
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-15T10:30:00.000Z"
}
}
A new assistant gets
end_call switched on unless you send nativeTools.end_call.enabled: false. Without it, an assistant stays on the line — billing — after the caller has said goodbye.Errors
| Code | Status | When |
|---|---|---|
VALIDATION_FAILED | 422 | Missing agent_name, or a config.voice.voiceId outside the supported catalogue, or a knowledge-base id from another workspace. |
UNAUTHORIZED | 401 | Missing, invalid, inactive or expired key. |
FORBIDDEN | 403 | A public (vbr_pub_…) key. |
Was this page helpful?
⌘I
Create assistant
curl --request POST \
--url https://api.verbeo.ai/v1/assistant \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agent_name": "<string>",
"agent_type": "<string>",
"config": {}
}
'import requests
url = "https://api.verbeo.ai/v1/assistant"
payload = {
"agent_name": "<string>",
"agent_type": "<string>",
"config": {}
}
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({agent_name: '<string>', agent_type: '<string>', config: {}})
};
fetch('https://api.verbeo.ai/v1/assistant', 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/assistant",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent_name' => '<string>',
'agent_type' => '<string>',
'config' => [
]
]),
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/assistant"
payload := strings.NewReader("{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.verbeo.ai/v1/assistant")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v1/assistant")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_name\": \"<string>\",\n \"agent_type\": \"<string>\",\n \"config\": {}\n}"
response = http.request(request)
puts response.read_body