curl --request POST \
--url https://api.ryvo.so/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sales assistant",
"preset_id": "<string>"
}
'import requests
url = "https://api.ryvo.so/v1/agents"
payload = {
"name": "Sales assistant",
"preset_id": "<string>"
}
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: 'Sales assistant', preset_id: '<string>'})
};
fetch('https://api.ryvo.so/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.ryvo.so/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' => 'Sales assistant',
'preset_id' => '<string>'
]),
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.ryvo.so/v1/agents"
payload := strings.NewReader("{\n \"name\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\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.ryvo.so/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ryvo.so/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\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "4d0f3c2a-6b7e-4a1c-9f2d-1e2b3c4d5e6f",
"runtime": "engine",
"name": "Sales assistant",
"status": "active",
"language": "es-MX",
"created_at": "2026-09-01T15:04:05.000Z",
"updated_at": "2026-09-20T10:11:12.000Z",
"phone_numbers": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number": "+5215555550100",
"label": "Main line"
}
],
"config": {
"version": 4,
"system_prompt": "You are the receptionist of Acme Dental. Book appointments and answer questions about opening hours.",
"first_message": "Hi, this is Acme Dental. How can I help you?",
"language": "es-MX",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.7,
"routing": "auto",
"fallback": [
{
"provider": "<string>",
"model": "<string>"
}
],
"endpoint": "<string>"
},
"stt": {
"provider": "deepgram",
"model": "nova-3",
"language": "<string>",
"settings": {},
"sample_rate": 123
},
"voice": {
"provider": "elevenlabs",
"model": "eleven_flash_v2_5",
"voice_id": "<string>",
"fallback_voices": {},
"language": "<string>",
"settings": {},
"sample_rate": 123
},
"knowledge_base": {
"doc_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"folder_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "off",
"top_k": 2
},
"dynamic_variables": {
"lead_name": {
"default": "there"
}
},
"conversation": {
"max_duration_s": 43200,
"recording": {
"enabled": true,
"consent_text": "<string>"
},
"turns": {},
"audio": {},
"pronunciation": [
{
"term": "<string>",
"say": "<string>",
"match_case": true
}
],
"calling_hours": {
"timezone": "<string>",
"days": [
123
],
"start": "<string>",
"end": "<string>"
}
},
"tool_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"provider_agent_id": "agent_8801kpabc123",
"current_version": 4,
"published_version": 3
}{
"error": "invalid_query",
"message": "limit must be an integer between 1 and 100.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "unauthorized",
"message": "Invalid or revoked API key.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "unauthorized",
"message": "Invalid or revoked API key.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry in 32s (see the Retry-After header).",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}Create an agent
Creates an Engine agent in draft status, optionally from a preset.
Configure it with PATCH /v1/agents/{id} and then publish it.
ElevenLabs agents are created from the portal.
curl --request POST \
--url https://api.ryvo.so/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sales assistant",
"preset_id": "<string>"
}
'import requests
url = "https://api.ryvo.so/v1/agents"
payload = {
"name": "Sales assistant",
"preset_id": "<string>"
}
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: 'Sales assistant', preset_id: '<string>'})
};
fetch('https://api.ryvo.so/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.ryvo.so/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' => 'Sales assistant',
'preset_id' => '<string>'
]),
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.ryvo.so/v1/agents"
payload := strings.NewReader("{\n \"name\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\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.ryvo.so/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ryvo.so/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\": \"Sales assistant\",\n \"preset_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "4d0f3c2a-6b7e-4a1c-9f2d-1e2b3c4d5e6f",
"runtime": "engine",
"name": "Sales assistant",
"status": "active",
"language": "es-MX",
"created_at": "2026-09-01T15:04:05.000Z",
"updated_at": "2026-09-20T10:11:12.000Z",
"phone_numbers": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number": "+5215555550100",
"label": "Main line"
}
],
"config": {
"version": 4,
"system_prompt": "You are the receptionist of Acme Dental. Book appointments and answer questions about opening hours.",
"first_message": "Hi, this is Acme Dental. How can I help you?",
"language": "es-MX",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.7,
"routing": "auto",
"fallback": [
{
"provider": "<string>",
"model": "<string>"
}
],
"endpoint": "<string>"
},
"stt": {
"provider": "deepgram",
"model": "nova-3",
"language": "<string>",
"settings": {},
"sample_rate": 123
},
"voice": {
"provider": "elevenlabs",
"model": "eleven_flash_v2_5",
"voice_id": "<string>",
"fallback_voices": {},
"language": "<string>",
"settings": {},
"sample_rate": 123
},
"knowledge_base": {
"doc_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"folder_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"mode": "off",
"top_k": 2
},
"dynamic_variables": {
"lead_name": {
"default": "there"
}
},
"conversation": {
"max_duration_s": 43200,
"recording": {
"enabled": true,
"consent_text": "<string>"
},
"turns": {},
"audio": {},
"pronunciation": [
{
"term": "<string>",
"say": "<string>",
"match_case": true
}
],
"calling_hours": {
"timezone": "<string>",
"days": [
123
],
"start": "<string>",
"end": "<string>"
}
},
"tool_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"provider_agent_id": "agent_8801kpabc123",
"current_version": 4,
"published_version": 3
}{
"error": "invalid_query",
"message": "limit must be an integer between 1 and 100.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "unauthorized",
"message": "Invalid or revoked API key.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "unauthorized",
"message": "Invalid or revoked API key.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry in 32s (see the Retry-After header).",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}Authorizations
A Bearer token. Create keys in the portal under Settings > API keys
(https://app.ryvo.so/developers). The token has the form
ryvo_live_<64 hex characters> and is shown once.
Header: Authorization: Bearer ryvo_live_...
Body
Response
The agent, as GET /v1/agents/{id} would return it.
"4d0f3c2a-6b7e-4a1c-9f2d-1e2b3c4d5e6f"
engine is the Ryvo runtime; elevenlabs is the legacy voice runtime.
engine, elevenlabs "engine"
"Sales assistant"
draft, active, paused, archived, error "active"
"es-MX"
"2026-09-01T15:04:05.000Z"
"2026-09-20T10:11:12.000Z"
The numbers assigned to the agent. Empty for Engine agents today.
Show child attributes
Show child attributes
The head definition (engine), the stored summary (elevenlabs), or null when nothing is saved yet.
- Option 1
- Option 2
Show child attributes
Show child attributes
Only on elevenlabs agents. The agent id at the provider (agent_...).
"agent_8801kpabc123"
Only on engine agents. The latest saved version.
4
Only on engine agents. The version serving traffic; 0 when never published.
3

