Saltearse al contenido

API de Computadora Agente

Pruébalo en el API Playground.

https://api.rebyte.ai/v1

Cada solicitud requiere un encabezado API_KEY. Obtén tu clave en Configuración > Claves API.

Terminal window
curl https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_your_key_here"

El nombre del encabezado no distingue entre mayúsculas y minúsculas. API_KEY, api-key y x-api-key funcionan.


MétodoRutaDescripción
POST/tasksCrear una tarea
GET/tasksListar tareas
GET/tasks/:idObtener tarea con estado e historial de prompts
POST/tasks/:id/promptsEnviar un prompt de seguimiento
PATCH/tasks/:id/visibilityCambiar visibilidad de la tarea
DELETE/tasks/:idEliminar una tarea (borrado suave)
GET/tasks/:id/eventsFlujo SSE de eventos de ejecución
POST/filesObtener una URL firmada para subir archivos
POST/webhooksRegistrar un webhook
GET/webhooksListar webhooks
GET/webhooks/:idObtener detalles del webhook
DELETE/webhooks/:idEliminar un webhook
Todas las rutas son relativas a la URL base (https://api.rebyte.ai/v1).

POST /tasks

Crea una nueva tarea. Por defecto, provisiona una nueva VM (Computadora Agente). Pasa workspaceId para ejecutar la tarea en un espacio de trabajo existente en su lugar — esto omite el aprovisionamiento y es significativamente más rápido.

La llamada se bloquea hasta que la VM es provisionada y el primer prompt es enviado.

Cuerpo de la solicitud:

CampoTipoRequeridoDescripción
promptstringDescripción de la tarea (máx. 100.000 caracteres)
executorstringNoclaude (por defecto), gemini, codex, opencode
modelstringNoNivel de modelo para el ejecutor. Ver Modelos.
workspaceIdstringNoUUID de un espacio de trabajo existente para reutilizar
filesobject[]NoArchivos de POST /files. Cada uno: {"id": "...", "filename": "..."}
skillsstring[]NoSlugs de habilidades (ej., ["deep-research", "pdf"])
githubUrlstringNoRepositorio de GitHub en formato propietario/repositorio
branchNamestringNoNombre de la rama (por defecto: main)
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Build a REST API with Express and add tests",
"executor": "claude",
"skills": ["deep-research"],
"githubUrl": "your-org/your-repo"
}'

Respuesta (201):

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"workspaceId": "660e8400-e29b-41d4-a716-446655440001",
"url": "https://app.rebyte.ai/run/550e8400-e29b-41d4-a716-446655440000",
"status": "running",
"createdAt": "2026-01-28T12:00:00.000Z"
}

Guarda el workspaceId de la respuesta para crear tareas de seguimiento en la misma Computadora Agente:

Terminal window
# First task -- provisions a new VM
RESP=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d '{"prompt": "Set up the project"}')
WS_ID=$(echo $RESP | jq -r '.workspaceId')
# Second task -- reuses the same VM (much faster)
curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d "{\"prompt\": \"Now add tests\", \"workspaceId\": \"$WS_ID\"}"

Los modelos disponibles dependen del ejecutor:

EjecutorModelos DisponiblesPor Defecto
claudeclaude-sonnet-4.6, claude-opus-4.6, gemini-3.1-pro, gpt-5.3-codex, gpt-5.4, minimax-m2.7, kimi-k2.5, glm-5, gemini-3-flashclaude-sonnet-4.6
codexgpt-5.4, gpt-5.3-codexgpt-5.4
geminiauto-gemini-3 (auto-routes between flash and pro)auto-gemini-3
opencodeSame as claudegemini-3.1-pro

Con BYOK (trae tu propia clave API), solo los modelos del proveedor nativo del ejecutor están disponibles (ej., el ejecutor claude con BYOK solo obtiene claude-sonnet-4.6 y claude-opus-4.6).

GET /tasks?limit=50&offset=0

Devuelve las tareas creadas a través de la API, ordenadas por fecha de creación (las más recientes primero).

ParámetroTipoPor DefectoDescripción
limitnumber50Resultados por página (máx. 100)
offsetnumber0Desplazamiento de paginación
Terminal window
curl "https://api.rebyte.ai/v1/tasks?limit=10" \
-H "API_KEY: rbk_xxx"

Respuesta:

{
"data": [
{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": "2026-01-28T12:05:00.000000+00:00"
}
],
"total": 42,
"limit": 10,
"offset": 0
}
GET /tasks/:id

Devuelve los detalles completos de la tarea, incluyendo el historial de prompts y el estado derivado.

Terminal window
curl https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

Respuesta:

{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"status": "running",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": null,
"prompts": [
{
"id": "660e8400-...",
"status": "running",
"submittedAt": "2026-01-28T12:05:00.000000+00:00",
"completedAt": null
},
{
"id": "550e8400-...",
"status": "succeeded",
"submittedAt": "2026-01-28T12:00:01.000000+00:00",
"completedAt": "2026-01-28T12:03:00.000000+00:00"
}
]
}

El estado de la tarea se deriva de los estados de los prompts:

EstadoCondición
runningCualquier prompt está pending o running
completedTodos los prompts son terminales, el último es succeeded
failedTodos los prompts son terminales, el último es failed
canceledTodos los prompts son terminales, el último es canceled
POST /tasks/:id/prompts

Envía un prompt de seguimiento a una tarea en ejecución o completada. Si la VM está detenida, se reanuda automáticamente.

CampoTipoRequeridoDescripción
promptstringPrompt de seguimiento (máx. 100.000 caracteres)
skillsstring[]NoSlugs de habilidades adicionales para este prompt
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks/550e8400-.../prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add authentication with JWT"}'

Respuesta (201):

{
"promptId": "770f9500-..."
}
GET /tasks/:id/events

Abre un flujo de Eventos Enviados por el Servidor (Server-Sent Events) para el último prompt de la tarea. Los eventos incluyen la salida del agente (stdout, stderr), llamadas a herramientas y señales de finalización.

Terminal window
curl -N https://api.rebyte.ai/v1/tasks/550e8400-.../events \
-H "API_KEY: rbk_xxx"

El flujo emite dos tipos de eventos:

  • event — eventos de ejecución (salida del agente, llamadas a herramientas)
  • done — evento final con estado de finalización, luego el flujo se cierra
PATCH /tasks/:id/visibility
CampoTipoRequeridoDescripción
visibilitystringprivate, shared o public
NivelQuién puede ver
privateSolo el propietario de la clave API
sharedTodos los miembros de la organización (por defecto)
publicCualquiera con el enlace (solo lectura)
Terminal window
curl -X PATCH https://api.rebyte.ai/v1/tasks/550e8400-.../visibility \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"visibility": "public"}'

Cuando se establece en public, la respuesta incluye una shareUrl para acceso no autenticado.

DELETE /tasks/:id

Elimina la tarea (borrado suave). Devuelve 204 No Content.

Terminal window
curl -X DELETE https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

Sube archivos para adjuntarlos a las tareas. Utiliza un flujo de URL firmada de dos pasos.

POST /files
CampoTipoRequeridoDescripción
filenamestringNombre del archivo (máx. 255 caracteres)
contentTypestringNoTipo MIME (por defecto: application/octet-stream)

Respuesta (201):

{
"id": "550e8400-...",
"filename": "data.csv",
"uploadUrl": "https://storage.googleapis.com/...",
"maxFileSize": 52428800
}

La URL de subida expira en 1 hora.

Terminal window
curl -X PUT "UPLOAD_URL_FROM_STEP_1" \
-H "Content-Type: application/octet-stream" \
--data-binary @data.csv

Pasa id y filename del Paso 1 al crear una tarea:

{
"prompt": "Analyze the uploaded data",
"files": [
{"id": "550e8400-...", "filename": "data.csv"}
]
}

Los archivos se copian automáticamente en la VM de la tarea cuando comienza la ejecución.


Recibe notificaciones HTTP POST cuando ocurren eventos de tareas. Los webhooks son universales — se activan para todas las tareas de tu organización, ya sean creadas a través de la API, la UI o cualquier otro canal.

EventoSe activa cuando
task.createdSe crea una nueva tarea
task.runningEl agente comienza a ejecutarse
task.completedLa tarea finaliza con éxito
task.failedLa tarea falla
task.canceledLa tarea es cancelada por el usuario
POST /webhooks
CampoTipoRequeridoDescripción
urlstringURL del endpoint HTTPS
eventsstring[]Eventos a los que suscribirse
descriptionstringNoEtiqueta legible por humanos (máx. 500 caracteres)
secretstringNoSecreto pre-compartido (máx. 500 caracteres). Cuando se establece, se incluye como encabezado X-Webhook-Secret en cada entrega.
Terminal window
# Webhook without secret
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"]
}'
# Webhook with pre-shared secret
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"secret": "my-shared-secret-value"
}'

Respuesta (201):

{
"id": "880e8400-...",
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"description": null,
"hasSecret": true,
"isActive": true,
"createdAt": "2026-01-28T12:00:00.000Z",
"lastTriggeredAt": null,
"failureCount": 0
}

Notas de comportamiento:

  • URLs duplicadas: registrar la misma URL dos veces devuelve el webhook existente (idempotente)
  • Límite: máximo 3 webhooks por organización. El 4º devuelve limit_exceeded.
  • Almacenamiento del secreto: el valor del secreto nunca se devuelve en ninguna respuesta. Solo se expone hasSecret: true/false.
GET /webhooks

Devuelve todos los webhooks de tu organización con información de estado (lastTriggeredAt, failureCount, isActive). Los secretos nunca se exponen.

GET /webhooks/:id
DELETE /webhooks/:id

Devuelve 204 No Content. Los webhooks eliminados dejan de recibir entregas inmediatamente.

Cuando un evento de tarea coincide con los eventos suscritos de un webhook, Rebyte envía un HTTP POST a la URL del webhook.

Carga útil:

{
"event": "task.completed",
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1706443200,
"data": {
"status": "succeeded",
"taskUrl": "https://app.rebyte.ai/run/550e8400-...",
"result": "Created CSV file with 10 Hacker News posts..."
}
}
  • status — estado del prompt: pending (task.created), running (task.running), succeeded (task.completed), failed (task.failed), canceled (task.canceled)
  • taskUrl — enlace directo a la tarea en la UI de Rebyte (siempre presente)
  • result — texto de salida final de la IA (presente en eventos terminales: task.completed, task.failed, task.canceled; ausente en task.created y task.running)

Llama a GET /tasks/:id para obtener los detalles completos de la tarea, incluyendo el historial de prompts.

Encabezados de entrega:

EncabezadoSiempre presenteDescripción
Content-Typeapplication/json
X-Webhook-SignatureFirma RSA-SHA256 codificada en Base64
X-Webhook-TimestampMarca de tiempo Unix (segundos)
X-Webhook-SecretSolo si el secreto está configuradoEl valor del secreto pre-compartido que configuraste al crear

Tiempo de espera: las entregas expiran después de 10 segundos.

Manejo de fallos:

  • La entrega es fire-and-forget — no hay reintentos automáticos en caso de fallo
  • Las respuestas que no son 2xx incrementan failureCount
  • Después de 10 fallos consecutivos, el webhook se deshabilita automáticamente (isActive: false)
  • Las entregas exitosas restablecen failureCount a 0

Cada entrega se firma con el par de claves RSA-2048 de tu organización, independientemente de si se ha configurado un secreto pre-compartido.

Cómo funciona:

  1. Rebyte concatena {timestamp}.{body} (ej., 1706443200.{"event":"task.completed",...})
  2. Firma la cadena con RSA-SHA256 usando la clave privada de tu organización
  3. Envía la firma codificada en base64 en X-Webhook-Signature

Obtén tu clave pública: contacta con soporte o recupérala desde el panel de Rebyte. El par de claves RSA-2048 se genera automáticamente en la primera creación de webhook y persiste para la organización.

Ejemplo de verificación (Node.js):

const crypto = require('crypto');
function verifyWebhook(rawBody, timestamp, signature, publicKey) {
const payload = `${timestamp}.${rawBody}`;
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(payload);
return verifier.verify(publicKey, signature, 'base64');
}
// In your webhook handler:
app.post('/webhook', (req, res) => {
const rawBody = req.body; // must be raw string, not parsed JSON
const timestamp = req.headers['x-webhook-timestamp'];
const signature = req.headers['x-webhook-signature'];
if (!verifyWebhook(rawBody, timestamp, signature, PUBLIC_KEY)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(rawBody);
console.log(`Task ${event.taskId}: ${event.event}`);
res.status(200).send('OK');
});

Ejemplo de verificación (Python):

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
import base64
def verify_webhook(raw_body: str, timestamp: str, signature: str, public_key_pem: str) -> bool:
public_key = serialization.load_pem_public_key(public_key_pem.encode())
payload = f"{timestamp}.{raw_body}".encode()
try:
public_key.verify(
base64.b64decode(signature),
payload,
padding.PKCS1v15(),
hashes.SHA256()
)
return True
except Exception:
return False

Los webhooks admiten dos métodos de verificación independientes que se pueden usar juntos:

MétodoEncabezadoCómo funcionaCaso de uso
Firma RSAX-Webhook-SignaturePrueba criptográfica de que la carga útil proviene de RebyteVerificación a prueba de manipulaciones
Secreto pre-compartidoX-Webhook-SecretCadena estática que estableces al crear, devuelta en cada entregaVerificación simple de secreto compartido

Las firmas RSA siempre están presentes. El secreto pre-compartido es opcional — configúralo al crear el webhook si deseas una ruta de verificación más sencilla.


Ejemplo completo: crea una tarea, consulta su estado hasta que se complete y luego envía un seguimiento.

Terminal window
# Create task
TASK_ID=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Write a Python CLI that converts CSV to JSON"}' | jq -r '.id')
echo "Task: https://app.rebyte.ai/run/$TASK_ID"
# Poll until done
while true; do
STATUS=$(curl -s https://api.rebyte.ai/v1/tasks/$TASK_ID \
-H "API_KEY: rbk_xxx" | jq -r '.status')
echo "Status: $STATUS"
[[ "$STATUS" == "completed" || "$STATUS" == "failed" ]] && break
sleep 5
done
# Send a follow-up
curl -s -X POST https://api.rebyte.ai/v1/tasks/$TASK_ID/prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add support for nested JSON objects"}'

Todos los errores siguen esta estructura:

{
"error": {
"code": "validation_error",
"message": "Invalid request body"
}
}
CódigoEstado HTTPDescripción
missing_api_key401Encabezado API_KEY no proporcionado
invalid_api_key401Clave API inválida o expirada
validation_error400El cuerpo de la solicitud falló la validación
not_found404El recurso no existe o no es accesible
limit_exceeded400Límite de la organización alcanzado (ej., máximo de webhooks)
agent_disabled403El ejecutor solicitado está deshabilitado para esta organización
internal_error500Fallo del lado del servidor

Actualmente, la API no impone límites de tasa por clave. Cada POST /tasks provisiona una VM real, por lo que los costos escalan con el uso. Utiliza webhooks en lugar de un sondeo agresivo para reducir las solicitudes innecesarias.