Agent Computer API
Probieren Sie es im API Playground aus.
Base URL
Section titled “Base URL”https://api.rebyte.ai/v1Authentication
Section titled “Authentication”Jede Anfrage erfordert einen API_KEY-Header. Holen Sie sich Ihren Schlüssel unter Einstellungen > API-Schlüssel.
curl https://api.rebyte.ai/v1/tasks \ -H "API_KEY: rbk_your_key_here"Der Header-Name ist nicht zwischen Groß- und Kleinschreibung zu unterscheiden. API_KEY, api-key und x-api-key funktionieren alle.
Endpoints
Section titled “Endpoints”| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /tasks | Eine Aufgabe erstellen |
| GET | /tasks | Aufgaben auflisten |
| GET | /tasks/:id | Aufgabe mit Status und Prompt-Verlauf abrufen |
| POST | /tasks/:id/prompts | Einen Folge-Prompt senden |
| PATCH | /tasks/:id/visibility | Aufgabensichtbarkeit ändern |
| DELETE | /tasks/:id | Eine Aufgabe soft-löschen |
| GET | /tasks/:id/events | SSE-Stream von Ausführungsereignissen |
| POST | /files | Eine signierte Datei-Upload-URL abrufen |
| POST | /webhooks | Einen Webhook registrieren |
| GET | /webhooks | Webhooks auflisten |
| GET | /webhooks/:id | Webhook-Details abrufen |
| DELETE | /webhooks/:id | Einen Webhook löschen |
Alle Pfade sind relativ zur Basis-URL (https://api.rebyte.ai/v1). |
Create Task
Section titled “Create Task”POST /tasksErstellt eine neue Aufgabe. Standardmäßig wird eine neue VM (Agent Computer) bereitgestellt. Übergeben Sie workspaceId, um die Aufgabe stattdessen in einem bestehenden Workspace auszuführen – dies überspringt die Bereitstellung und ist deutlich schneller.
Der Aufruf blockiert, bis die VM bereitgestellt und der erste Prompt übermittelt wurde.
Anfragekörper:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
prompt | string | Ja | Aufgabenbeschreibung (max. 100.000 Zeichen) |
executor | string | Nein | claude (Standard), gemini, codex, opencode |
model | string | Nein | Modell-Tier für den Executor. Siehe Modelle. |
workspaceId | string | Nein | UUID eines bestehenden Workspaces zur Wiederverwendung |
files | object[] | Nein | Dateien von POST /files. Jeweils: {"id": "...", "filename": "..."} |
skills | string[] | Nein | Skill-Slugs (z.B. ["deep-research", "pdf"]) |
githubUrl | string | Nein | GitHub-Repo im Format owner/repo |
branchName | string | Nein | Branch-Name (Standard: main) |
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" }'Antwort (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"}Speichern Sie die workspaceId aus der Antwort, um Folgeaufgaben auf demselben Agent Computer zu erstellen:
# First task -- provisions a new VMRESP=$(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\"}"Models
Section titled “Models”Verfügbare Modelle hängen vom Executor ab:
| Executor | Verfügbare Modelle | Standard |
|---|---|---|
claude | claude-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-flash | claude-sonnet-4.6 |
codex | gpt-5.4, gpt-5.3-codex | gpt-5.4 |
gemini | auto-gemini-3 (auto-routes between flash and pro) | auto-gemini-3 |
opencode | Same as claude | gemini-3.1-pro |
Mit BYOK (bring your own API key) sind nur die nativen Provider-Modelle des Executors verfügbar (z.B. erhält der claude-Executor mit BYOK nur claude-sonnet-4.6 und claude-opus-4.6).
List Tasks
Section titled “List Tasks”GET /tasks?limit=50&offset=0Gibt über die API erstellte Aufgaben zurück, sortiert nach Erstellungszeit (neueste zuerst).
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
limit | number | 50 | Ergebnisse pro Seite (max. 100) |
offset | number | 0 | Paginierungs-Offset |
curl "https://api.rebyte.ai/v1/tasks?limit=10" \ -H "API_KEY: rbk_xxx"Antwort:
{ "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 Task
Section titled “Get Task”GET /tasks/:idGibt vollständige Aufgabendetails einschließlich Prompt-Verlauf und abgeleitetem Status zurück.
curl https://api.rebyte.ai/v1/tasks/550e8400-... \ -H "API_KEY: rbk_xxx"Antwort:
{ "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" } ]}Der Aufgabenstatus wird aus den Prompt-Zuständen abgeleitet:
| Status | Bedingung |
|---|---|
running | Jeder Prompt ist pending oder running |
completed | Alle Prompts sind terminal, der neueste ist succeeded |
failed | Alle Prompts sind terminal, der neueste ist failed |
canceled | Alle Prompts sind terminal, der neueste ist canceled |
Send Follow-Up
Section titled “Send Follow-Up”POST /tasks/:id/promptsSenden Sie einen Folge-Prompt an eine laufende oder abgeschlossene Aufgabe. Wenn die VM gestoppt ist, wird sie automatisch fortgesetzt.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
prompt | string | Ja | Folge-Prompt (max. 100.000 Zeichen) |
skills | string[] | Nein | Zusätzliche Skill-Slugs für diesen Prompt |
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"}'Antwort (201):
{ "promptId": "770f9500-..."}Stream Events (SSE)
Section titled “Stream Events (SSE)”GET /tasks/:id/eventsÖffnet einen Server-Sent Events Stream für den neuesten Prompt der Aufgabe. Ereignisse umfassen Agenten-Output (stdout, stderr), Tool-Aufrufe und Abschluss-Signale.
curl -N https://api.rebyte.ai/v1/tasks/550e8400-.../events \ -H "API_KEY: rbk_xxx"Der Stream sendet zwei Ereignistypen aus:
event— Ausführungsereignisse (Agenten-Output, Tool-Aufrufe)done— finales Ereignis mit Abschlussstatus, danach schließt der Stream
Change Visibility
Section titled “Change Visibility”PATCH /tasks/:id/visibility| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
visibility | string | Ja | private, shared oder public |
| Stufe | Wer kann sehen |
|---|---|
private | Nur der API-Schlüsselbesitzer |
shared | Alle Organisationsmitglieder (Standard) |
public | Jeder mit dem Link (schreibgeschützt) |
curl -X PATCH https://api.rebyte.ai/v1/tasks/550e8400-.../visibility \ -H "API_KEY: rbk_xxx" \ -H "Content-Type: application/json" \ -d '{"visibility": "public"}'Wenn auf public gesetzt, enthält die Antwort eine shareUrl für den nicht authentifizierten Zugriff.
Delete Task
Section titled “Delete Task”DELETE /tasks/:idLöscht die Aufgabe ‘soft’. Gibt 204 No Content zurück.
curl -X DELETE https://api.rebyte.ai/v1/tasks/550e8400-... \ -H "API_KEY: rbk_xxx"Laden Sie Dateien hoch, um sie an Aufgaben anzuhängen. Verwendet einen zweistufigen Signed-URL-Flow.
Step 1: Get Upload URL
Section titled “Step 1: Get Upload URL”POST /files| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
filename | string | Ja | Dateiname (max. 255 Zeichen) |
contentType | string | Nein | MIME-Typ (Standard: application/octet-stream) |
Antwort (201):
{ "id": "550e8400-...", "filename": "data.csv", "uploadUrl": "https://storage.googleapis.com/...", "maxFileSize": 52428800}Die Upload-URL läuft in 1 Stunde ab.
Step 2: Upload the File
Section titled “Step 2: Upload the File”curl -X PUT "UPLOAD_URL_FROM_STEP_1" \ -H "Content-Type: application/octet-stream" \ --data-binary @data.csvStep 3: Attach to Task
Section titled “Step 3: Attach to Task”Übergeben Sie id und filename aus Schritt 1 beim Erstellen einer Aufgabe:
{ "prompt": "Analyze the uploaded data", "files": [ {"id": "550e8400-...", "filename": "data.csv"} ]}Dateien werden automatisch in die VM der Aufgabe kopiert, wenn die Ausführung beginnt.
Webhooks
Section titled “Webhooks”Erhalten Sie HTTP POST-Benachrichtigungen, wenn Aufgabenereignisse auftreten. Webhooks sind universell – sie werden für alle Aufgaben in Ihrer Organisation ausgelöst, unabhängig davon, ob sie über API, UI oder einen anderen Kanal erstellt wurden.
Events
Section titled “Events”| Ereignis | Wird ausgelöst, wenn |
|---|---|
task.created | Eine neue Aufgabe erstellt wird |
task.running | Der Agent mit der Ausführung beginnt |
task.completed | Aufgabe erfolgreich abgeschlossen wird |
task.failed | Aufgabe fehlschlägt |
task.canceled | Aufgabe vom Benutzer abgebrochen wird |
Create Webhook
Section titled “Create Webhook”POST /webhooks| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url | string | Ja | HTTPS-Endpunkt-URL |
events | string[] | Ja | Ereignisse, die abonniert werden sollen |
description | string | Nein | Menschlich lesbare Bezeichnung (max. 500 Zeichen) |
secret | string | Nein | Vorab geteiltes Geheimnis (max. 500 Zeichen). Wenn gesetzt, wird es als X-Webhook-Secret-Header in jeder Zustellung enthalten sein. |
# Webhook without secretcurl -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 secretcurl -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" }'Antwort (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}Verhaltenshinweise:
- Doppelte URLs: Das zweimalige Registrieren derselben URL gibt den bestehenden Webhook zurück (idempotent)
- Limit: maximal 3 Webhooks pro Organisation. Der 4. gibt
limit_exceededzurück. - Geheimnis-Speicherung: Der Geheimniswert wird niemals in einer Antwort zurückgegeben. Nur
hasSecret: true/falsewird offengelegt.
List Webhooks
Section titled “List Webhooks”GET /webhooksGibt alle Webhooks für Ihre Organisation mit Statusinformationen (lastTriggeredAt, failureCount, isActive) zurück. Geheimnisse werden niemals offengelegt.
Get Webhook
Section titled “Get Webhook”GET /webhooks/:idDelete Webhook
Section titled “Delete Webhook”DELETE /webhooks/:idGibt 204 No Content zurück. Gelöschte Webhooks erhalten sofort keine Zustellungen mehr.
Delivery
Section titled “Delivery”Wenn ein Aufgabenereignis mit den abonnierten Ereignissen eines Webhooks übereinstimmt, sendet Rebyte einen HTTP POST an die Webhook-URL.
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— Prompt-Status:pending(task.created),running(task.running),succeeded(task.completed),failed(task.failed),canceled(task.canceled)taskUrl— direkter Link zur Aufgabe in der Rebyte UI (immer vorhanden)result— finaler KI-Ausgabetext (vorhanden bei terminalen Ereignissen:task.completed,task.failed,task.canceled; nicht vorhanden beitask.createdundtask.running)
Rufen Sie GET /tasks/:id auf, um vollständige Aufgabendetails einschließlich Prompt-Verlauf zu erhalten.
Zustellungs-Header:
| Header | Immer vorhanden | Beschreibung |
|---|---|---|
Content-Type | Ja | application/json |
X-Webhook-Signature | Ja | Base64-kodierte RSA-SHA256-Signatur |
X-Webhook-Timestamp | Ja | Unix-Zeitstempel (Sekunden) |
X-Webhook-Secret | Nur wenn Geheimnis konfiguriert | Der vorab geteilte Geheimniswert, den Sie bei der Erstellung festgelegt haben |
Timeout: Zustellungen laufen nach 10 Sekunden ab.
Fehlerbehandlung:
- Die Zustellung ist Fire-and-Forget – keine automatischen Wiederholungsversuche bei Fehlern
- Nicht-2xx-Antworten erhöhen
failureCount - Nach 10 aufeinanderfolgenden Fehlern wird der Webhook automatisch deaktiviert (
isActive: false) - Erfolgreiche Zustellungen setzen
failureCountauf 0 zurück
Signature Verification
Section titled “Signature Verification”Jede Zustellung wird mit dem RSA-2048-Schlüsselpaar Ihrer Organisation signiert, unabhängig davon, ob ein vorab geteiltes Geheimnis konfiguriert ist.
So funktioniert es:
- Rebyte verkettet
{timestamp}.{body}(z.B.1706443200.{"event":"task.completed",...}) - Signiert die Zeichenkette mit RSA-SHA256 unter Verwendung des privaten Schlüssels Ihrer Organisation
- Sendet die base64-kodierte Signatur im
X-Webhook-Signature-Header
Holen Sie sich Ihren öffentlichen Schlüssel: Kontaktieren Sie den Support oder rufen Sie ihn über das Rebyte-Dashboard ab. Das RSA-2048-Schlüsselpaar wird automatisch bei der ersten Webhook-Erstellung generiert und bleibt für die Organisation bestehen.
Verifizierungsbeispiel (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');});Verifizierungsbeispiel (Python):
from cryptography.hazmat.primitives import hashes, serializationfrom cryptography.hazmat.primitives.asymmetric import paddingimport 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 FalseTwo-layer security
Section titled “Two-layer security”Webhooks unterstützen zwei unabhängige Verifizierungsmethoden, die zusammen verwendet werden können:
| Methode | Header | Funktionsweise | Anwendungsfall |
|---|---|---|---|
| RSA signature | X-Webhook-Signature | Kryptografischer Nachweis, dass die Payload von Rebyte stammt | Manipulationssichere Verifizierung |
| Pre-shared secret | X-Webhook-Secret | Statische Zeichenkette, die Sie bei der Erstellung festlegen und die in jeder Zustellung zurückgegeben wird | Einfache Überprüfung mit geteiltem Geheimnis |
RSA-Signaturen sind immer vorhanden. Das vorab geteilte Geheimnis ist optional – legen Sie es bei der Erstellung des Webhooks fest, wenn Sie einen einfacheren Verifizierungspfad wünschen.
Polling Example
Section titled “Polling Example”Vollständiges Beispiel: Eine Aufgabe erstellen, bis zum Abschluss abfragen und dann einen Folge-Prompt senden.
# Create taskTASK_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 donewhile 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 5done
# Send a follow-upcurl -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"}'Error Format
Section titled “Error Format”Alle Fehler folgen dieser Struktur:
{ "error": { "code": "validation_error", "message": "Invalid request body" }}| Code | HTTP-Status | Beschreibung |
|---|---|---|
missing_api_key | 401 | API_KEY-Header nicht angegeben |
invalid_api_key | 401 | Ungültiger oder abgelaufener API-Schlüssel |
validation_error | 400 | Anfragekörper konnte nicht validiert werden |
not_found | 404 | Ressource existiert nicht oder ist nicht zugänglich |
limit_exceeded | 400 | Organisationslimit erreicht (z.B. maximale Webhooks) |
agent_disabled | 403 | Der angeforderte Executor ist für diese Organisation deaktiviert |
internal_error | 500 | Serverseitiger Fehler |
Rate Limiting
Section titled “Rate Limiting”Die API erzwingt derzeit keine Ratenbegrenzungen pro Schlüssel. Jedes POST /tasks stellt eine echte VM bereit, sodass die Kosten mit der Nutzung skalieren. Verwenden Sie Webhooks anstelle von aggressivem Polling, um unnötige Anfragen zu reduzieren.