curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/api-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "QA Sandbox",
"description": "Suite de tests automáticos",
"environment": "sandbox",
"scopes": [
"agents:read",
"api-keys:read"
]
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/api-keys"
payload = {
"name": "QA Sandbox",
"description": "Suite de tests automáticos",
"environment": "sandbox",
"scopes": ["agents:read", "api-keys:read"]
}
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: 'QA Sandbox',
description: 'Suite de tests automáticos',
environment: 'sandbox',
scopes: ['agents:read', 'api-keys:read']
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/api-keys', 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/api-keys",
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' => 'QA Sandbox',
'description' => 'Suite de tests automáticos',
'environment' => 'sandbox',
'scopes' => [
'agents:read',
'api-keys:read'
]
]),
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/api-keys"
payload := strings.NewReader("{\n \"name\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\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/api-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/api-keys")
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\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "d6ef8c66-3c3d-4a87-9edf-9ec5fa929a9c",
"name": "Backend Integration",
"description": "Servicio interno para métricas",
"environment": "production",
"scopes": [
"agents:read",
"campaigns:read"
],
"keyPreview": "sk_live_d6ef...29a9",
"createdAt": "2025-10-15T15:22:00.000Z",
"updatedAt": "2025-10-15T15:22:00.000Z",
"lastUsedAt": null,
"key": "sk_live_d6ef8c66-3c3d-4a87-9edf-9ec5fa929a9c"
}{
"statusCode": 400,
"error": "Bad Request",
"message": [
"scopes should not be empty"
]
}Crear una API Key
Genera una nueva API Key asociada al usuario autenticado y al workspace activo. La respuesta incluye el valor completo de la llave solo una vez, por lo que debe almacenarse de manera segura inmediatamente.
environment no es una etiqueta: decide si la llave autentica. Cada despliegue
tiene su propio entorno, y al recibir una petición con x-api-key compara el de la
llave contra el suyo: si no coinciden responde 401 API key environment mismatch,
sin importar los scopes. Una llave sandbox emitida contra el host de producción se
crea con 201 y falla en todas las llamadas siguientes. Emite la llave contra el host
donde la vas a usar y con el environment de ese host; si se omite, se usa el del
propio despliegue, que es la opción segura.
curl --request POST \
--url https://api-prod.studio.getsupervisor.ai/v1/api-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "QA Sandbox",
"description": "Suite de tests automáticos",
"environment": "sandbox",
"scopes": [
"agents:read",
"api-keys:read"
]
}
'import requests
url = "https://api-prod.studio.getsupervisor.ai/v1/api-keys"
payload = {
"name": "QA Sandbox",
"description": "Suite de tests automáticos",
"environment": "sandbox",
"scopes": ["agents:read", "api-keys:read"]
}
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: 'QA Sandbox',
description: 'Suite de tests automáticos',
environment: 'sandbox',
scopes: ['agents:read', 'api-keys:read']
})
};
fetch('https://api-prod.studio.getsupervisor.ai/v1/api-keys', 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/api-keys",
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' => 'QA Sandbox',
'description' => 'Suite de tests automáticos',
'environment' => 'sandbox',
'scopes' => [
'agents:read',
'api-keys:read'
]
]),
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/api-keys"
payload := strings.NewReader("{\n \"name\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\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/api-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.studio.getsupervisor.ai/v1/api-keys")
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\": \"QA Sandbox\",\n \"description\": \"Suite de tests automáticos\",\n \"environment\": \"sandbox\",\n \"scopes\": [\n \"agents:read\",\n \"api-keys:read\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "d6ef8c66-3c3d-4a87-9edf-9ec5fa929a9c",
"name": "Backend Integration",
"description": "Servicio interno para métricas",
"environment": "production",
"scopes": [
"agents:read",
"campaigns:read"
],
"keyPreview": "sk_live_d6ef...29a9",
"createdAt": "2025-10-15T15:22:00.000Z",
"updatedAt": "2025-10-15T15:22:00.000Z",
"lastUsedAt": null,
"key": "sk_live_d6ef8c66-3c3d-4a87-9edf-9ec5fa929a9c"
}{
"statusCode": 400,
"error": "Bad Request",
"message": [
"scopes should not be empty"
]
}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
1 - 120255Entorno al que queda atada la llave. Es una puerta de autenticación: el despliegue
que recibe la petición compara este valor contra el suyo y responde 401
API key environment mismatch si no coinciden. Si se omite, hereda el del despliegue
que atiende la creación.
production, sandbox, staging, development 164Response
API Key creada con éxito
Lista de scopes autorizados para esta credencial.
1production, sandbox, staging, development Prefijo y sufijo visibles de la API Key (el valor completo no se expone después de la creación).
Valor completo de la API Key. Solo se entrega una vez y debe almacenarse de forma segura.
255Fecha/hora del último uso registrado.
Fecha/hora en que se revocó la credencial (si aplica).
