Salta ai contenuti

API del Computer Agente

Provalo nel API Playground.

https://api.rebyte.ai/v1

Ogni richiesta richiede un’intestazione API_KEY. Ottieni la tua chiave da Impostazioni > Chiavi API.

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

Il nome dell’intestazione non è sensibile alle maiuscole. API_KEY, api-key e x-api-key funzionano tutti.


MetodoPercorsoDescrizione
POST/tasksCrea un’attività
GET/tasksElenca attività
GET/tasks/:idOttieni attività con stato e cronologia dei prompt
POST/tasks/:id/promptsInvia un prompt di follow-up
PATCH/tasks/:id/visibilityCambia visibilità attività
DELETE/tasks/:idElimina (soft-delete) un’attività
GET/tasks/:id/eventsStream SSE di eventi di esecuzione
POST/filesOttieni un URL di caricamento file firmato
POST/webhooksRegistra un webhook
GET/webhooksElenca webhook
GET/webhooks/:idOttieni dettagli webhook
DELETE/webhooks/:idElimina un webhook
Tutti i percorsi sono relativi all’URL base (https://api.rebyte.ai/v1).

POST /tasks

Crea una nuova attività. Per impostazione predefinita, effettua il provisioning di una nuova VM (Computer Agente). Passa workspaceId per eseguire l’attività su un workspace esistente invece — questo salta il provisioning ed è significativamente più veloce.

La chiamata si blocca finché la VM non è stata sottoposta a provisioning e il primo prompt non è stato inviato.

Corpo della richiesta:

CampoTipoObbligatorioDescrizione
promptstringDescrizione dell’attività (max 100.000 caratteri)
executorstringNoclaude (predefinito), gemini, codex, opencode
modelstringNoLivello del modello per l’executor. Vedi Modelli.
workspaceIdstringNoUUID di un workspace esistente da riutilizzare
filesobject[]NoFile da POST /files. Ciascuno: {"id": "...", "filename": "..."}
skillsstring[]NoSlug delle skill (es. ["deep-research", "pdf"])
githubUrlstringNoRepo GitHub nel formato owner/repo
branchNamestringNoNome del branch (predefinito: 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"
}'

Risposta (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"
}

Salva il workspaceId dalla risposta per creare attività successive sullo stesso Computer 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\"}"

I modelli disponibili dipendono dall’executor:

ExecutorModelli DisponibiliPredefinito
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 (bring your own API key), sono disponibili solo i modelli del provider nativo dell’executor (es. l’executor claude con BYOK ottiene solo claude-sonnet-4.6 e claude-opus-4.6).

GET /tasks?limit=50&offset=0

Restituisce le attività create tramite l’API, ordinate per data di creazione (le più recenti per prime).

ParametroTipoPredefinitoDescrizione
limitnumber50Risultati per pagina (max 100)
offsetnumber0Offset di paginazione
Terminal window
curl "https://api.rebyte.ai/v1/tasks?limit=10" \
-H "API_KEY: rbk_xxx"

Risposta:

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

Restituisce i dettagli completi dell’attività, inclusa la cronologia dei prompt e lo stato derivato.

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

Risposta:

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

Lo stato dell’attività è derivato dagli stati dei prompt:

StatoCondizione
runningQualsiasi prompt è pending o running
completedTutti i prompt sono terminali, l’ultimo è succeeded
failedTutti i prompt sono terminali, l’ultimo è failed
canceledTutti i prompt sono terminali, l’ultimo è canceled
POST /tasks/:id/prompts

Invia un prompt di follow-up a un’attività in esecuzione o completata. Se la VM è ferma, viene riavviata automaticamente.

CampoTipoObbligatorioDescrizione
promptstringPrompt di follow-up (max 100.000 caratteri)
skillsstring[]NoSlug di skill aggiuntive per questo 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"}'

Risposta (201):

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

Apre uno stream di Server-Sent Events per l’ultimo prompt dell’attività. Gli eventi includono l’output dell’agente (stdout, stderr), le chiamate agli strumenti e i segnali di completamento.

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

Lo stream emette due tipi di eventi:

  • event — eventi di esecuzione (output dell’agente, chiamate agli strumenti)
  • done — evento finale con stato di completamento, quindi lo stream si chiude
PATCH /tasks/:id/visibility
CampoTipoObbligatorioDescrizione
visibilitystringprivate, shared, o public
LivelloChi può visualizzare
privateSolo il proprietario della chiave API
sharedTutti i membri dell’organizzazione (predefinito)
publicChiunque abbia il link (sola lettura)
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"}'

Quando impostato su public, la risposta include un shareUrl per l’accesso non autenticato.

DELETE /tasks/:id

Elimina (soft-delete) l’attività. Restituisce 204 No Content.

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

Carica file da allegare alle attività. Utilizza un flusso di URL firmato in due passaggi.

POST /files
CampoTipoObbligatorioDescrizione
filenamestringNome del file (max 255 caratteri)
contentTypestringNoTipo MIME (predefinito: application/octet-stream)

Risposta (201):

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

L’URL di caricamento scade in 1 ora.

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

Passa id e filename dal Passaggio 1 quando crei un’attività:

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

I file vengono copiati automaticamente nella VM dell’attività all’inizio dell’esecuzione.


Ricevi notifiche HTTP POST quando si verificano eventi dell’attività. I webhook sono universali — si attivano per tutte le attività della tua organizzazione, sia che siano state create tramite API, UI o qualsiasi altro canale.

EventoSi attiva quando
task.createdViene creata una nuova attività
task.runningL’agente inizia l’esecuzione
task.completedL’attività termina con successo
task.failedL’attività fallisce
task.canceledL’attività viene annullata dall’utente
POST /webhooks
CampoTipoObbligatorioDescrizione
urlstringURL dell’endpoint HTTPS
eventsstring[]Eventi a cui iscriversi
descriptionstringNoEtichetta leggibile dall’uomo (max 500 caratteri)
secretstringNoSegreto pre-condiviso (max 500 caratteri). Se impostato, incluso come intestazione X-Webhook-Secret in ogni consegna.
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"
}'

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

Note sul comportamento:

  • URL duplicati: la registrazione dello stesso URL due volte restituisce il webhook esistente (idempotente)
  • Limite: massimo 3 webhook per organizzazione. Il 4° restituisce limit_exceeded.
  • Archiviazione del segreto: il valore del segreto non viene mai restituito in nessuna risposta. Viene esposto solo hasSecret: true/false.
GET /webhooks

Restituisce tutti i webhook per la tua organizzazione con informazioni sullo stato (lastTriggeredAt, failureCount, isActive). I segreti non vengono mai esposti.

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

Restituisce 204 No Content. I webhook eliminati smettono immediatamente di ricevere consegne.

Quando un evento dell’attività corrisponde agli eventi sottoscritti da un webhook, Rebyte invia una richiesta HTTP POST all’URL del webhook.

Payload:

{
"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 — stato del prompt: pending (task.created), running (task.running), succeeded (task.completed), failed (task.failed), canceled (task.canceled)
  • taskUrl — link diretto all’attività nell’interfaccia utente di Rebyte (sempre presente)
  • result — testo di output finale dell’IA (presente negli eventi terminali: task.completed, task.failed, task.canceled; assente su task.created e task.running)

Chiama GET /tasks/:id per i dettagli completi dell’attività, inclusa la cronologia dei prompt.

Intestazioni di consegna:

IntestazioneSempre presenteDescrizione
Content-Typeapplication/json
X-Webhook-SignatureFirma RSA-SHA256 codificata in Base64
X-Webhook-TimestampTimestamp Unix (secondi)
X-Webhook-SecretSolo se il segreto è configuratoIl valore del segreto pre-condiviso che hai impostato alla creazione

Timeout: le consegne vanno in timeout dopo 10 secondi.

Gestione dei fallimenti:

  • La consegna è fire-and-forget — nessun tentativo automatico in caso di fallimento
  • Le risposte non-2xx incrementano failureCount
  • Dopo 10 fallimenti consecutivi, il webhook viene automaticamente disabilitato (isActive: false)
  • Le consegne riuscite azzerano failureCount

Ogni consegna è firmata con la coppia di chiavi RSA-2048 della tua organizzazione, indipendentemente dal fatto che sia configurato un segreto pre-condiviso.

Come funziona:

  1. Rebyte concatena {timestamp}.{body} (es. 1706443200.{"event":"task.completed",...})
  2. Firma la stringa con RSA-SHA256 utilizzando la chiave privata della tua organizzazione
  3. Invia la firma codificata in base64 in X-Webhook-Signature

Ottieni la tua chiave pubblica: contatta il supporto o recuperala dalla dashboard di Rebyte. La coppia di chiavi RSA-2048 viene generata automaticamente alla prima creazione del webhook e persiste per l’organizzazione.

Esempio di verifica (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');
});

Esempio di verifica (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

I webhook supportano due metodi di verifica indipendenti che possono essere utilizzati insieme:

MetodoIntestazioneCome funzionaCaso d’uso
Firma RSAX-Webhook-SignatureProva crittografica che il payload proviene da RebyteVerifica anti-manomissione
Segreto pre-condivisoX-Webhook-SecretStringa statica impostata alla creazione, riprodotta in ogni consegnaSemplice controllo del segreto condiviso

Le firme RSA sono sempre presenti. Il segreto pre-condiviso è opzionale — impostalo quando crei il webhook se desideri un percorso di verifica più semplice.


Esempio completo: crea un’attività, esegui il polling fino al completamento, quindi invia un follow-up.

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"}'

Tutti gli errori seguono questa struttura:

{
"error": {
"code": "validation_error",
"message": "Invalid request body"
}
}
CodiceStato HTTPDescrizione
missing_api_key401Intestazione API_KEY non fornita
invalid_api_key401Chiave API non valida o scaduta
validation_error400Il corpo della richiesta non ha superato la convalida
not_found404La risorsa non esiste o non è accessibile
limit_exceeded400Limite dell’organizzazione raggiunto (es. max webhook)
agent_disabled403L’executor richiesto è disabilitato per questa organizzazione
internal_error500Errore lato server

L’API attualmente non impone limiti di frequenza per chiave. Ogni POST /tasks effettua il provisioning di una VM reale, quindi i costi aumentano con l’utilizzo. Utilizza i webhook invece di un polling aggressivo per ridurre le richieste non necessarie.