Saltar al contingut

API d'Ordinadors Agent

Prova-ho a l’API Playground.

https://api.rebyte.ai/v1

Cada sol·licitud requereix una capçalera API_KEY. Obtén la teva clau des de Configuració > Claus API.

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

El nom de la capçalera no distingeix entre majúscules i minúscules. API_KEY, api-key i x-api-key funcionen tots.


MètodeRutaDescripció
POST/tasksCrear una tasca
GET/tasksLlistar tasques
GET/tasks/:idObtenir tasca amb estat i historial de prompts
POST/tasks/:id/promptsEnviar un prompt de seguiment
PATCH/tasks/:id/visibilityCanviar la visibilitat de la tasca
DELETE/tasks/:idEliminar una tasca (soft-delete)
GET/tasks/:id/eventsFlux SSE d’esdeveniments d’execució
POST/filesObtenir una URL de càrrega de fitxers signada
POST/webhooksRegistrar un webhook
GET/webhooksLlistar webhooks
GET/webhooks/:idObtenir detalls del webhook
DELETE/webhooks/:idEliminar un webhook
Totes les rutes són relatives a la URL base (https://api.rebyte.ai/v1).

POST /tasks

Crea una nova tasca. Per defecte, aprovisiona una nova VM (Ordinador Agent). Passa workspaceId per executar la tasca en un espai de treball existent en lloc d’això — això omet l’aprovisionament i és significativament més ràpid.

La crida es bloqueja fins que la VM s’aprovisiona i el primer prompt s’envia.

Cos de la sol·licitud:

CampTipusRequeritDescripció
promptstringDescripció de la tasca (màx. 100.000 caràcters)
executorstringNoclaude (per defecte), gemini, codex, opencode
modelstringNoNivell de model per a l’executor. Vegeu Models.
workspaceIdstringNoUUID d’un espai de treball existent per reutilitzar
filesobject[]NoFitxers de POST /files. Cadascun: {"id": "...", "filename": "..."}
skillsstring[]NoSlugs d’habilitats (p. ex., ["deep-research", "pdf"])
githubUrlstringNoRepositori de GitHub en format owner/repo
branchNamestringNoNom de la branca (per defecte: 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"
}'

Resposta (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 resposta per crear tasques de seguiment al mateix Ordinador Agent:

Terminal window
# Primera tasca -- aprovisiona una nova 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')
# Segona tasca -- reutilitza la mateixa VM (molt més ràpid)
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\"}"

Els models disponibles depenen de l’executor:

ExecutorModels disponiblesPer defecte
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
opencodeIgual que claudegemini-3.1-pro

Amb BYOK (porta la teva pròpia clau API), només els models del proveïdor natiu de l’executor estan disponibles (p. ex., l’executor claude amb BYOK només obté claude-sonnet-4.6 i claude-opus-4.6).

GET /tasks?limit=50&offset=0

Retorna les tasques creades mitjançant l’API, ordenades per hora de creació (les més noves primer).

ParàmetreTipusPer defecteDescripció
limitnumber50Resultats per pàgina (màx. 100)
offsetnumber0Desplaçament de paginació
Terminal window
curl "https://api.rebyte.ai/v1/tasks?limit=10" \
-H "API_KEY: rbk_xxx"

Resposta:

{
"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

Retorna els detalls complets de la tasca, incloent l’historial de prompts i l’estat derivat.

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

Resposta:

{
"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"
}
]
}

L’estat de la tasca es deriva dels estats dels prompts:

EstatCondició
runningQualsevol prompt està pending o running
completedTots els prompts terminals, l’últim ha tingut succeeded
failedTots els prompts terminals, l’últim ha failed
canceledTots els prompts terminals, l’últim ha estat canceled
POST /tasks/:id/prompts

Envia un prompt de seguiment a una tasca en execució o completada. Si la VM està aturada, es reprèn automàticament.

CampTipusRequeritDescripció
promptstringPrompt de seguiment (màx. 100.000 caràcters)
skillsstring[]NoSlugs d’habilitats addicionals per a aquest 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"}'

Resposta (201):

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

Obre un flux d’Esdeveniments Enviats pel Servidor (Server-Sent Events) per al darrer prompt de la tasca. Els esdeveniments inclouen la sortida de l’agent (stdout, stderr), les crides a eines i els senyals de finalització.

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

El flux emet dos tipus d’esdeveniments:

  • event — esdeveniments d’execució (sortida de l’agent, crides a eines)
  • done — esdeveniment final amb l’estat de finalització, després el flux es tanca
PATCH /tasks/:id/visibility
CampTipusRequeritDescripció
visibilitystringprivate, shared, o public
NivellQui pot veure
privateNomés el propietari de la clau API
sharedTots els membres de l’organització (per defecte)
publicQualsevol amb l’enllaç (només 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"}'

Quan s’estableix a public, la resposta inclou una shareUrl per a l’accés no autenticat.

DELETE /tasks/:id

Elimina la tasca de forma lògica (soft-delete). Retorna 204 No Content.

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

Puja fitxers per adjuntar a les tasques. Utilitza un flux d’URL signat en dos passos.

POST /files
CampTipusRequeritDescripció
filenamestringNom del fitxer (màx. 255 caràcters)
contentTypestringNoTipus MIME (per defecte: application/octet-stream)

Resposta (201):

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

La URL de càrrega caduca en 1 hora.

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

Passa id i filename del Pas 1 en crear una tasca:

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

Els fitxers es copien automàticament a la VM de la tasca quan comença l’execució.


Rep notificacions HTTP POST quan es produeixen esdeveniments de tasca. Els webhooks són universals — s’activen per a totes les tasques de la teva organització, ja siguin creades mitjançant API, UI o qualsevol altre canal.

EsdevenimentS’activa quan
task.createdEs crea una nova tasca
task.runningL’agent comença a executar-se
task.completedLa tasca finalitza amb èxit
task.failedLa tasca falla
task.canceledLa tasca és cancel·lada per l’usuari
POST /webhooks
CampTipusRequeritDescripció
urlstringURL de l’endpoint HTTPS
eventsstring[]Esdeveniments als quals subscriure’s
descriptionstringNoEtiqueta llegible per humans (màx. 500 caràcters)
secretstringNoSecret precompartit (màx. 500 caràcters). Quan s’estableix, s’inclou com a capçalera X-Webhook-Secret en cada lliurament.
Terminal window
# Webhook sense 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 amb secret precompartit
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"
}'

Resposta (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
}

Notes de comportament:

  • URLs duplicades: registrar la mateixa URL dues vegades retorna el webhook existent (idempotent)
  • Límit: màxim 3 webhooks per organització. El 4t retorna limit_exceeded.
  • Emmagatzematge del secret: el valor del secret mai es retorna en cap resposta. Només s’exposa hasSecret: true/false.
GET /webhooks

Retorna tots els webhooks de la teva organització amb informació d’estat (lastTriggeredAt, failureCount, isActive). Els secrets mai s’exposen.

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

Retorna 204 No Content. Els webhooks eliminats deixen de rebre lliuraments immediatament.

Quan un esdeveniment de tasca coincideix amb els esdeveniments subscrits d’un webhook, Rebyte envia un HTTP POST a la URL del webhook.

Càrrega ú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 — estat del prompt: pending (task.created), running (task.running), succeeded (task.completed), failed (task.failed), canceled (task.canceled)
  • taskUrl — enllaç directe a la tasca a la UI de Rebyte (sempre present)
  • result — text de sortida final de l’IA (present en esdeveniments terminals: task.completed, task.failed, task.canceled; absent en task.created i task.running)

Crida GET /tasks/:id per obtenir els detalls complets de la tasca, incloent l’historial de prompts.

Capçaleres de lliurament:

CapçaleraSempre presentDescripció
Content-Typeapplication/json
X-Webhook-SignatureSignatura RSA-SHA256 codificada en Base64
X-Webhook-TimestampTimestamp Unix (segons)
X-Webhook-SecretNomés si el secret està configuratEl valor del secret precompartit que vas establir en la creació

Temps d’espera: els lliuraments caduquen després de 10 segons.

Gestió d’errors:

  • El lliurament és fire-and-forget — no hi ha reintents automàtics en cas d’error
  • Les respostes que no són 2xx incrementen failureCount
  • Després de 10 errors consecutius, el webhook es deshabilita automàticament (isActive: false)
  • Els lliuraments exitosos reinicien failureCount a 0

Cada lliurament està signat amb el parell de claus RSA-2048 de la teva organització, independentment de si s’ha configurat un secret precompartit.

Com funciona:

  1. Rebyte concatena {timestamp}.{body} (p. ex., 1706443200.{"event":"task.completed",...})
  2. Signa la cadena amb RSA-SHA256 utilitzant la clau privada de la teva organització
  3. Envia la signatura codificada en base64 a X-Webhook-Signature

Obtén la teva clau pública: contacta amb el suport o recupera-la des del panell de control de Rebyte. El parell de claus RSA-2048 es genera automàticament en la primera creació del webhook i persisteix per a l’organització.

Exemple de verificació (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');
}
// Al teu gestor de webhook:
app.post('/webhook', (req, res) => {
const rawBody = req.body; // ha de ser una cadena bruta, no JSON analitzat
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');
});

Exemple de verificació (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

Els webhooks admeten dos mètodes de verificació independents que es poden utilitzar junts:

MètodeCapçaleraCom funcionaCas d’ús
Signatura RSAX-Webhook-SignatureProva criptogràfica que la càrrega útil prové de RebyteVerificació a prova de manipulacions
Secret precompartitX-Webhook-SecretCadena estàtica que estableixes en la creació, retornada en cada lliuramentComprovació simple de secret compartit

Les signatures RSA sempre estan presents. El secret precompartit és opcional — estableix-lo en crear el webhook si vols una ruta de verificació més senzilla.


Exemple complet: crea una tasca, consulta l’estat fins a la finalització i després envia un seguiment.

Terminal window
# Crear tasca
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"
# Consultar fins que estigui fet
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
# Enviar un seguiment
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"}'

Tots els errors segueixen aquesta estructura:

{
"error": {
"code": "validation_error",
"message": "Invalid request body"
}
}
CodiEstat HTTPDescripció
missing_api_key401Capçalera API_KEY no proporcionada
invalid_api_key401Clau API no vàlida o caducada
validation_error400El cos de la sol·licitud no ha superat la validació
not_found404El recurs no existeix o no és accessible
limit_exceeded400S’ha assolit el límit de l’organització (p. ex., màxim de webhooks)
agent_disabled403L’executor sol·licitat està deshabilitat per a aquesta organització
internal_error500Error del servidor

Actualment, l’API no aplica límits de taxa per clau. Cada POST /tasks aprovisiona una VM real, de manera que els costos s’escalen amb l’ús. Utilitza webhooks en lloc de consultes agressives per reduir les sol·licituds innecessàries.