Create a standalone agent
Create an agent without a sender. It is created disabled; connect a sender and enable it when you are ready for it to answer.
Sub-resources. An agent’s tools, flows and knowledge bases are reachable at /v1/agents/{agentId}/tools, /v1/agents/{agentId}/flows and /v1/agents/{agentId}/knowledge-bases, mirroring the sender-scoped routes documented under /v1/senders/{senderId}/agent/... exactly. Use the agent-scoped form while the agent has no sender: the sender-scoped one cannot address it.
curl --request POST \
--url https://api.zavu.dev/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"model": "<string>",
"systemPrompt": "<string>",
"apiKey": "<string>",
"contextWindowMessages": 10,
"includeContactMetadata": true,
"triggerOnChannels": [
"*"
],
"triggerOnMessageTypes": [
"text"
],
"maxTokens": 2048,
"temperature": 1
}
'import requests
url = "https://api.zavu.dev/v1/agents"
payload = {
"name": "<string>",
"model": "<string>",
"systemPrompt": "<string>",
"apiKey": "<string>",
"contextWindowMessages": 10,
"includeContactMetadata": True,
"triggerOnChannels": ["*"],
"triggerOnMessageTypes": ["text"],
"maxTokens": 2048,
"temperature": 1
}
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: '<string>',
model: '<string>',
systemPrompt: '<string>',
apiKey: '<string>',
contextWindowMessages: 10,
includeContactMetadata: true,
triggerOnChannels: ['*'],
triggerOnMessageTypes: ['text'],
maxTokens: 2048,
temperature: 1
})
};
fetch('https://api.zavu.dev/v1/agents', 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.zavu.dev/v1/agents",
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([
'name' => '<string>',
'model' => '<string>',
'systemPrompt' => '<string>',
'apiKey' => '<string>',
'contextWindowMessages' => 10,
'includeContactMetadata' => true,
'triggerOnChannels' => [
'*'
],
'triggerOnMessageTypes' => [
'text'
],
'maxTokens' => 2048,
'temperature' => 1
]),
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.zavu.dev/v1/agents"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\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.zavu.dev/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zavu.dev/v1/agents")
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 \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\n}"
response = http.request(request)
puts response.read_body{
"agent": {
"id": "agent_abc123",
"name": "Customer Support Agent",
"enabled": true,
"provider": "openai",
"model": "gpt-4o-mini",
"systemPrompt": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"senderId": "sender_12345",
"contextWindowMessages": 10,
"includeContactMetadata": true,
"maxTokens": 123,
"temperature": 123,
"triggerOnChannels": [
"sms",
"whatsapp"
],
"triggerOnMessageTypes": [
"text"
],
"stats": {
"totalInvocations": 123,
"totalTokensUsed": 123,
"totalCost": 123
},
"voice": {
"enabled": true,
"greeting": "Hi, thanks for calling Acme. How can I help you today?",
"greetings": {
"es": "Hola, soy Atlas. Preguntame lo que quieras."
},
"language": "en",
"model": "openai/gpt-4o",
"sttProvider": "<string>",
"sttModel": "<string>",
"ttsProvider": "<string>",
"ttsVoiceId": "aria",
"voiceSpeed": 1,
"interruptible": true,
"maxCallDurationMinutes": 15,
"maxIdleSeconds": 30,
"recordCalls": true,
"voicemailAction": "hangup",
"voicemailMessage": "<string>",
"transferPhoneNumber": "+14155551234"
},
"senderIds": [
"<string>"
]
}
}{
"code": "invalid_request",
"message": "Phone number is invalid",
"details": {}
}{
"code": "invalid_request",
"message": "Phone number is invalid",
"details": {}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Create an agent that exists on its own. Connect senders afterwards; an agent answers on any number of them.
Sub-resources. An agent's tools, flows and knowledge bases are reachable at /v1/agents/{agentId}/tools, /v1/agents/{agentId}/flows and /v1/agents/{agentId}/knowledge-bases, mirroring the sender-scoped routes documented under /v1/senders/{senderId}/agent/... exactly. Use the agent-scoped form while the agent has no sender: the sender-scoped one cannot address it.
100LLM provider for the AI agent.
openai, anthropic, google, mistral, zavu 10000API key for the LLM provider. Required unless provider is 'zavu'. Stored encrypted and never returned.
1 <= x <= 501 <= x <= 40960 <= x <= 2Voice Agent configuration on a sender's AI agent. Controls how the agent behaves on inbound and outbound phone calls through Zavu's managed voice pipeline (speech recognition, the agent's LLM, and speech synthesis, with real-time interruption handling).
Show child attributes
Show child attributes
Response
Agent created.
AI Agent configuration for a sender.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.zavu.dev/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"model": "<string>",
"systemPrompt": "<string>",
"apiKey": "<string>",
"contextWindowMessages": 10,
"includeContactMetadata": true,
"triggerOnChannels": [
"*"
],
"triggerOnMessageTypes": [
"text"
],
"maxTokens": 2048,
"temperature": 1
}
'import requests
url = "https://api.zavu.dev/v1/agents"
payload = {
"name": "<string>",
"model": "<string>",
"systemPrompt": "<string>",
"apiKey": "<string>",
"contextWindowMessages": 10,
"includeContactMetadata": True,
"triggerOnChannels": ["*"],
"triggerOnMessageTypes": ["text"],
"maxTokens": 2048,
"temperature": 1
}
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: '<string>',
model: '<string>',
systemPrompt: '<string>',
apiKey: '<string>',
contextWindowMessages: 10,
includeContactMetadata: true,
triggerOnChannels: ['*'],
triggerOnMessageTypes: ['text'],
maxTokens: 2048,
temperature: 1
})
};
fetch('https://api.zavu.dev/v1/agents', 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.zavu.dev/v1/agents",
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([
'name' => '<string>',
'model' => '<string>',
'systemPrompt' => '<string>',
'apiKey' => '<string>',
'contextWindowMessages' => 10,
'includeContactMetadata' => true,
'triggerOnChannels' => [
'*'
],
'triggerOnMessageTypes' => [
'text'
],
'maxTokens' => 2048,
'temperature' => 1
]),
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.zavu.dev/v1/agents"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\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.zavu.dev/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zavu.dev/v1/agents")
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 \"name\": \"<string>\",\n \"model\": \"<string>\",\n \"systemPrompt\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"contextWindowMessages\": 10,\n \"includeContactMetadata\": true,\n \"triggerOnChannels\": [\n \"*\"\n ],\n \"triggerOnMessageTypes\": [\n \"text\"\n ],\n \"maxTokens\": 2048,\n \"temperature\": 1\n}"
response = http.request(request)
puts response.read_body{
"agent": {
"id": "agent_abc123",
"name": "Customer Support Agent",
"enabled": true,
"provider": "openai",
"model": "gpt-4o-mini",
"systemPrompt": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"senderId": "sender_12345",
"contextWindowMessages": 10,
"includeContactMetadata": true,
"maxTokens": 123,
"temperature": 123,
"triggerOnChannels": [
"sms",
"whatsapp"
],
"triggerOnMessageTypes": [
"text"
],
"stats": {
"totalInvocations": 123,
"totalTokensUsed": 123,
"totalCost": 123
},
"voice": {
"enabled": true,
"greeting": "Hi, thanks for calling Acme. How can I help you today?",
"greetings": {
"es": "Hola, soy Atlas. Preguntame lo que quieras."
},
"language": "en",
"model": "openai/gpt-4o",
"sttProvider": "<string>",
"sttModel": "<string>",
"ttsProvider": "<string>",
"ttsVoiceId": "aria",
"voiceSpeed": 1,
"interruptible": true,
"maxCallDurationMinutes": 15,
"maxIdleSeconds": 30,
"recordCalls": true,
"voicemailAction": "hangup",
"voicemailMessage": "<string>",
"transferPhoneNumber": "+14155551234"
},
"senderIds": [
"<string>"
]
}
}{
"code": "invalid_request",
"message": "Phone number is invalid",
"details": {}
}{
"code": "invalid_request",
"message": "Phone number is invalid",
"details": {}
}