curl --request PATCH \
--url https://api.ryvo.so/v1/agents/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sales assistant",
"status": "active",
"expected_version": 4,
"system_prompt": "You are the receptionist of Acme Dental.",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.5
}
}
'import requests
url = "https://api.ryvo.so/v1/agents/{id}"
payload = {
"name": "Sales assistant",
"status": "active",
"expected_version": 4,
"system_prompt": "You are the receptionist of Acme Dental.",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.5
}
}
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({
name: 'Sales assistant',
status: 'active',
expected_version: 4,
system_prompt: 'You are the receptionist of Acme Dental.',
llm: {provider: 'openai', model: 'gpt-4o-mini', temperature: 0.5}
})
};
fetch('https://api.ryvo.so/v1/agents/{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.ryvo.so/v1/agents/{id}",
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([
'name' => 'Sales assistant',
'status' => 'active',
'expected_version' => 4,
'system_prompt' => 'You are the receptionist of Acme Dental.',
'llm' => [
'provider' => 'openai',
'model' => 'gpt-4o-mini',
'temperature' => 0.5
]
]),
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/{id}"
payload := strings.NewReader("{\n \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\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.ryvo.so/v1/agents/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ryvo.so/v1/agents/{id}")
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 \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\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": "insufficient_scope",
"message": "This API key does not have the agents:write scope.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "not_found",
"message": "Resource not found.",
"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"
}Update an agent
Engine agents accept name, status (active or paused) and any
configuration block. Sending a configuration block creates a new
version; pass expected_version (the current_version you last
read) to detect concurrent edits, otherwise the current head is
assumed. Blocks you do not send are carried over from the head.
ElevenLabs agents accept only name; any other key answers
409 unsupported_runtime. Unknown keys are rejected with
400 invalid_body.
curl --request PATCH \
--url https://api.ryvo.so/v1/agents/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sales assistant",
"status": "active",
"expected_version": 4,
"system_prompt": "You are the receptionist of Acme Dental.",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.5
}
}
'import requests
url = "https://api.ryvo.so/v1/agents/{id}"
payload = {
"name": "Sales assistant",
"status": "active",
"expected_version": 4,
"system_prompt": "You are the receptionist of Acme Dental.",
"llm": {
"provider": "openai",
"model": "gpt-4o-mini",
"temperature": 0.5
}
}
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({
name: 'Sales assistant',
status: 'active',
expected_version: 4,
system_prompt: 'You are the receptionist of Acme Dental.',
llm: {provider: 'openai', model: 'gpt-4o-mini', temperature: 0.5}
})
};
fetch('https://api.ryvo.so/v1/agents/{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.ryvo.so/v1/agents/{id}",
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([
'name' => 'Sales assistant',
'status' => 'active',
'expected_version' => 4,
'system_prompt' => 'You are the receptionist of Acme Dental.',
'llm' => [
'provider' => 'openai',
'model' => 'gpt-4o-mini',
'temperature' => 0.5
]
]),
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/{id}"
payload := strings.NewReader("{\n \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\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.ryvo.so/v1/agents/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ryvo.so/v1/agents/{id}")
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 \"name\": \"Sales assistant\",\n \"status\": \"active\",\n \"expected_version\": 4,\n \"system_prompt\": \"You are the receptionist of Acme Dental.\",\n \"llm\": {\n \"provider\": \"openai\",\n \"model\": \"gpt-4o-mini\",\n \"temperature\": 0.5\n }\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": "insufficient_scope",
"message": "This API key does not have the agents:write scope.",
"request_id": "f0c0a9d2-8b1e-4d8a-9c2f-6e5b7a1d2c3b"
}{
"error": "not_found",
"message": "Resource not found.",
"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"
}Autorizaciones
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_...
Parámetros de ruta
The Ryvo uuid of the agent.
"4d0f3c2a-6b7e-4a1c-9f2d-1e2b3c4d5e6f"
Cuerpo
Every field is optional; send at least one besides expected_version. Unknown keys are rejected.
2 - 80active, paused The current_version you last read. Defaults to the current head.
x >= 01 - 40000200035Which model answers. provider and model are validated against the catalog and your plan when saving (see GET /v1/models).
Show child attributes
Show child attributes
Speech recognition. settings and sample_rate are provider-specific and validated when saving.
Show child attributes
Show child attributes
Text to speech. A voice_id is required to publish a voice agent.
Show child attributes
Show child attributes
Which documents and folders the agent consults. Ownership is verified when saving.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Session limits, recording, turn policy, audio, pronunciation and calling hours. Unknown keys are kept.
Show child attributes
Show child attributes
50Respuesta
The agent after the update.
"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

