curl --request PATCH \
--url https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Soporte Voz Latam",
"status": "active",
"metadata": {
"statusReason": "SLA firmado"
}
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}"
payload = {
"name": "Soporte Voz Latam",
"status": "active",
"metadata": { "statusReason": "SLA firmado" }
}
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: 'Soporte Voz Latam',
status: 'active',
metadata: {statusReason: 'SLA firmado'}
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}', 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-prod.studio.getsupervisor.ai/v1/agents/{agentId}",
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' => 'Soporte Voz Latam',
'status' => 'active',
'metadata' => [
'statusReason' => 'SLA firmado'
]
]),
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-prod.studio.getsupervisor.ai/v1/agents/{agentId}"
payload := strings.NewReader("{\n \"name\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\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-prod.studio.getsupervisor.ai/v1/agents/{agentId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}")
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\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\n }\n}"
response = http.request(request)
puts response.read_body{
"agentId": "5769e110-7267-4cf7-a3ca-2d06e8fffbb3",
"workspaceId": "a44bb95e-9f01-4d19-8b62-1f6f2b8e8363",
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "active",
"avatarUrl": null,
"ownerUserId": "0a3c8cf2-6b54-4e89-8d36-7e67c77dfba5",
"debounceDelayMs": 1200,
"totalCalls": 128,
"totalOperationalDays": 19,
"goalAchievedPercentage": 62.5,
"knowledgeBaseIds": [],
"version": {
"id": "b8f60a6d-4c3a-4b9f-8cf3-56ad71d2f2bf",
"status": "active",
"number": 3
},
"createdAt": "2025-09-20T18:22:04.012Z",
"updatedAt": "2025-10-09T09:31:45.271Z"
}{
"statusCode": 400,
"error": "Bad Request",
"message": "El estado solicitado no es válido para agentes voice"
}{
"statusCode": 404,
"error": "Not Found",
"message": "El agente solicitado no pertenece al workspace"
}{
"statusCode": 409,
"error": "Conflict",
"message": "No puedes activar un agente sin horario configurado"
}{
"code": "AGENT_AMBIGUOUS_AVATAR",
"message": "Manda `avatarUploadId` o `avatarUrl`, no las dos: son dos formas distintas de darle cara al agente."
}Actualizar atributos configurables del agente
Permite ajustar campos operativos (nombre, estado, metadata) sin recrear el agente. Soporta
actualizaciones parciales siguiendo semántica PATCH.
curl --request PATCH \
--url https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Soporte Voz Latam",
"status": "active",
"metadata": {
"statusReason": "SLA firmado"
}
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}"
payload = {
"name": "Soporte Voz Latam",
"status": "active",
"metadata": { "statusReason": "SLA firmado" }
}
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: 'Soporte Voz Latam',
status: 'active',
metadata: {statusReason: 'SLA firmado'}
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}', 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-prod.studio.getsupervisor.ai/v1/agents/{agentId}",
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' => 'Soporte Voz Latam',
'status' => 'active',
'metadata' => [
'statusReason' => 'SLA firmado'
]
]),
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-prod.studio.getsupervisor.ai/v1/agents/{agentId}"
payload := strings.NewReader("{\n \"name\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\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-prod.studio.getsupervisor.ai/v1/agents/{agentId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/agents/{agentId}")
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\": \"Soporte Voz Latam\",\n \"status\": \"active\",\n \"metadata\": {\n \"statusReason\": \"SLA firmado\"\n }\n}"
response = http.request(request)
puts response.read_body{
"agentId": "5769e110-7267-4cf7-a3ca-2d06e8fffbb3",
"workspaceId": "a44bb95e-9f01-4d19-8b62-1f6f2b8e8363",
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "active",
"avatarUrl": null,
"ownerUserId": "0a3c8cf2-6b54-4e89-8d36-7e67c77dfba5",
"debounceDelayMs": 1200,
"totalCalls": 128,
"totalOperationalDays": 19,
"goalAchievedPercentage": 62.5,
"knowledgeBaseIds": [],
"version": {
"id": "b8f60a6d-4c3a-4b9f-8cf3-56ad71d2f2bf",
"status": "active",
"number": 3
},
"createdAt": "2025-09-20T18:22:04.012Z",
"updatedAt": "2025-10-09T09:31:45.271Z"
}{
"statusCode": 400,
"error": "Bad Request",
"message": "El estado solicitado no es válido para agentes voice"
}{
"statusCode": 404,
"error": "Not Found",
"message": "El agente solicitado no pertenece al workspace"
}{
"statusCode": 409,
"error": "Conflict",
"message": "No puedes activar un agente sin horario configurado"
}{
"code": "AGENT_AMBIGUOUS_AVATAR",
"message": "Manda `avatarUploadId` o `avatarUrl`, no las dos: son dos formas distintas de darle cara al agente."
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Identificador del workspace multi-tenant. Obligatorio al autenticar con Authorization: Bearer, donde su ausencia devuelve 400 Workspace context is required. Con x-api-key es opcional: la llave ya identifica a su workspace y lo que mandes aquí se ignora.
Path Parameters
Identificador del agente
Body
inactive, training, active, archived, building, failed Imagen del agente alojada fuera. En este PATCH, omitirlo es «no lo toques» y mandar null es «bórralo» — no son lo mismo. Excluyente con avatarUploadId.
Identificador de una subida ya confirmada en el namespace avatars. Reemplaza la cara anterior y libera su objeto. Mandarlo junto a avatarUrl responde 422.
Omitirlo es «no lo toques»; 0 es un retardo válido y vuelve a poner el agente sin espera. No admite null: no hay nada que borrar, el valor neutro es 0.
x >= 0Response
Agente actualizado
chat, voice inactive, training, active, archived, building, failed Total de llamadas realizadas por el agente.
x >= 0Total de días operativos desde la creación del agente.
x >= 0Porcentaje de llamadas donde el objetivo fue alcanzado.
0 <= x <= 100La versión vigente del agente: la active si la hay y, si no, el borrador más
reciente. Es de aquí de donde sale el identificador de versión que piden las rutas
de blueprint, instrucciones y publicación — no hay un versionId plano.
Se omite cuando el agente todavía no tiene ninguna versión.
Show child attributes
Show child attributes
URL pública opcional utilizada para representar al agente.
Delay opcional antes de enviar respuestas (milisegundos).
x >= 0Las bases de conocimiento que este agente consulta durante la conversación. Vacío significa que no consulta ninguna, no que no se sepa. Es la selección del cliente, leída del mismo sitio del que la lee el sync al publicar una versión, así que no puede divergir de lo que se toma como entrada al publicar. Al publicar, el proveedor de voz recibe sólo las que además están listas y son suyas: una base a medio indexar aparece aquí y todavía no viaja.
