curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "inactive",
"debounceDelayMs": 1200
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/agents"
payload = {
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "inactive",
"debounceDelayMs": 1200
}
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: 'Soporte Voz Latam',
agentType: 'voice',
description: 'Flujo automatizado para atención postventa',
status: 'inactive',
debounceDelayMs: 1200
})
};
fetch('https://api-prod.studio.getsupervisor.ai/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-prod.studio.getsupervisor.ai/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' => 'Soporte Voz Latam',
'agentType' => 'voice',
'description' => 'Flujo automatizado para atención postventa',
'status' => 'inactive',
'debounceDelayMs' => 1200
]),
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"
payload := strings.NewReader("{\n \"name\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\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-prod.studio.getsupervisor.ai/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/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\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\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": "inactive",
"avatarUrl": null,
"ownerUserId": "0a3c8cf2-6b54-4e89-8d36-7e67c77dfba5",
"debounceDelayMs": 1200,
"totalCalls": 0,
"totalOperationalDays": 0,
"goalAchievedPercentage": 0,
"knowledgeBaseIds": [],
"version": {
"id": "b8f60a6d-4c3a-4b9f-8cf3-56ad71d2f2bf",
"status": "draft",
"number": 1
},
"createdAt": "2025-10-08T12:34:56.000Z",
"updatedAt": "2025-10-08T12:34:56.000Z"
}{
"statusCode": 400,
"error": "Bad Request",
"message": "El campo languageCode es obligatorio"
}{
"statusCode": 404,
"error": "Not Found",
"message": "ToneId 5ceba0dd-0dd4-47a7-94aa-3ee2eda82780 no existe"
}{
"statusCode": 409,
"error": "Conflict",
"message": "Ya existe un agente con ese nombre en el workspace"
}{
"code": "COPILOT_ATTACHMENTS_CLOSED",
"message": "Adjuntar archivos en el chat no está disponible para este workspace."
}Crear un agente y su versión inicial
Registra un nuevo agente junto con su primera versión de configuración. Ideal para habilitar
rápidamente nuevos casos de uso (soporte, ventas, cobranza) manteniendo trazabilidad multi-tenant.
Soporta agentes de tipo voice y chat.
curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "inactive",
"debounceDelayMs": 1200
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/agents"
payload = {
"name": "Soporte Voz Latam",
"agentType": "voice",
"description": "Flujo automatizado para atención postventa",
"status": "inactive",
"debounceDelayMs": 1200
}
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: 'Soporte Voz Latam',
agentType: 'voice',
description: 'Flujo automatizado para atención postventa',
status: 'inactive',
debounceDelayMs: 1200
})
};
fetch('https://api-prod.studio.getsupervisor.ai/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-prod.studio.getsupervisor.ai/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' => 'Soporte Voz Latam',
'agentType' => 'voice',
'description' => 'Flujo automatizado para atención postventa',
'status' => 'inactive',
'debounceDelayMs' => 1200
]),
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"
payload := strings.NewReader("{\n \"name\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\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-prod.studio.getsupervisor.ai/v1/agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/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\": \"Soporte Voz Latam\",\n \"agentType\": \"voice\",\n \"description\": \"Flujo automatizado para atención postventa\",\n \"status\": \"inactive\",\n \"debounceDelayMs\": 1200\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": "inactive",
"avatarUrl": null,
"ownerUserId": "0a3c8cf2-6b54-4e89-8d36-7e67c77dfba5",
"debounceDelayMs": 1200,
"totalCalls": 0,
"totalOperationalDays": 0,
"goalAchievedPercentage": 0,
"knowledgeBaseIds": [],
"version": {
"id": "b8f60a6d-4c3a-4b9f-8cf3-56ad71d2f2bf",
"status": "draft",
"number": 1
},
"createdAt": "2025-10-08T12:34:56.000Z",
"updatedAt": "2025-10-08T12:34:56.000Z"
}{
"statusCode": 400,
"error": "Bad Request",
"message": "El campo languageCode es obligatorio"
}{
"statusCode": 404,
"error": "Not Found",
"message": "ToneId 5ceba0dd-0dd4-47a7-94aa-3ee2eda82780 no existe"
}{
"statusCode": 409,
"error": "Conflict",
"message": "Ya existe un agente con ese nombre en el workspace"
}{
"code": "COPILOT_ATTACHMENTS_CLOSED",
"message": "Adjuntar archivos en el chat no está disponible para este workspace."
}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.
Body
Campos necesarios para registrar un nuevo agente. El usuario propietario se resuelve automáticamente a partir del token Bearer activo.
1Obligatorio: omitirlo o mandarlo como null responde 400. Para un agente sin descripción, manda la cadena vacía.
1000Tipo de agente (voice o chat).
voice, chat Obligatorio: omitirlo o mandarlo como null responde 400. El alta no admite archived.
inactive, training, active Delay antes de enviar respuestas (milisegundos). Obligatorio: omitirlo o mandarlo como null responde 400; el valor neutro es 0.
x >= 0Imagen del agente alojada fuera. Excluyente con avatarUploadId.
Identificador de una subida ya confirmada en el namespace avatars. El agente guarda la referencia al objeto, no una URL. Mandarlo junto a avatarUrl responde 422: son dos formas distintas de darle cara al agente y adivinar cuál gana es como se construyen los fallos que nadie reproduce.
Prompt de personalización para Claude Code headless. Si se proporciona, la respuesta cambia a SSE (text/event-stream) con eventos de progreso.
10000URL del sitio web del cliente para que Claude investigue contexto.
Voz seleccionada para el agente (UUID del catálogo de voces). Si se proporciona, se aplica al blueprint durante la creación.
Los ficheros que el cliente adjuntó en el chat de creación, ya subidos y confirmados en el namespace agent-briefs, junto con lo que dijo de cada uno. Al crear el agente se reclaman, que es lo que impide que el barrido se los lleve a las 72 h.
Todo o nada: si un id no existe, no terminó de subirse, se subió a otro namespace o ya lo usa otro agente, la petición responde 422 nombrando cuáles fallaron y no se reclama ninguno. Un id de otro workspace se reporta como inexistente. Repetir el mismo uploadId en la lista responde 400.
10Show child attributes
Show child attributes
Response
Agente creado
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.
