API Komputera Agenta
Wypróbuj w API Playground.
Bazowy URL
Section titled “Bazowy URL”https://api.rebyte.ai/v1Uwierzytelnianie
Section titled “Uwierzytelnianie”Każde żądanie wymaga nagłówka API_KEY. Swój klucz uzyskasz w Ustawieniach > Klucze API.
curl https://api.rebyte.ai/v1/tasks \ -H "API_KEY: rbk_your_key_here"Nazwa nagłówka jest niewrażliwa na wielkość liter. API_KEY, api-key i x-api-key działają.
Punkty końcowe
Section titled “Punkty końcowe”| Method | Path | Opis |
|---|---|---|
| POST | /tasks | Utwórz zadanie |
| GET | /tasks | Wyświetl zadania |
| GET | /tasks/:id | Pobierz zadanie ze statusem i historią promptów |
| POST | /tasks/:id/prompts | Wyślij kolejny prompt |
| PATCH | /tasks/:id/visibility | Zmień widoczność zadania |
| DELETE | /tasks/:id | Usuń zadanie (miękkie usunięcie) |
| GET | /tasks/:id/events | Strumień zdarzeń wykonania SSE |
| POST | /files | Pobierz podpisany URL do przesyłania plików |
| POST | /webhooks | Zarejestruj webhook |
| GET | /webhooks | Wyświetl webhooki |
| GET | /webhooks/:id | Pobierz szczegóły webhooka |
| DELETE | /webhooks/:id | Usuń webhook |
Wszystkie ścieżki są względne w stosunku do bazowego URL (https://api.rebyte.ai/v1). |
Zadania
Section titled “Zadania”Utwórz zadanie
Section titled “Utwórz zadanie”POST /tasksTworzy nowe zadanie. Domyślnie, udostępnia nową maszynę wirtualną (Komputer Agenta). Przekaż workspaceId, aby zamiast tego uruchomić zadanie w istniejącym obszarze roboczym — to pomija udostępnianie i jest znacznie szybsze.
Wywołanie blokuje się do momentu udostępnienia maszyny wirtualnej i przesłania pierwszego promptu.
Treść żądania:
| Field | Type | Required | Opis |
|---|---|---|---|
prompt | string | Yes | Opis zadania (maks. 100 000 znaków) |
executor | string | No | claude (domyślnie), gemini, codex, opencode |
model | string | No | Poziom modelu dla wykonawcy. Zobacz Modele. |
workspaceId | string | No | UUID istniejącego obszaru roboczego do ponownego użycia |
files | object[] | No | Pliki z POST /files. Każdy: {"id": "...", "filename": "..."} |
skills | string[] | No | Slugi umiejętności (np. ["deep-research", "pdf"]) |
githubUrl | string | No | Repozytorium GitHub w formacie owner/repo |
branchName | string | No | Nazwa gałęzi (domyślnie: 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" }'Odpowiedź (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"}Zapisz workspaceId z odpowiedzi, aby tworzyć kolejne zadania na tym samym Komputerze Agenta:
# 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\"}"Modele
Section titled “Modele”Dostępne modele zależą od wykonawcy:
| Executor | Dostępne modele | Domyślny |
|---|---|---|
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 |
Z BYOK (bring your own API key), dostępne są tylko natywne modele dostawcy wykonawcy (np. wykonawca claude z BYOK otrzymuje tylko claude-sonnet-4.6 i claude-opus-4.6).
Wyświetl zadania
Section titled “Wyświetl zadania”GET /tasks?limit=50&offset=0Zwraca zadania utworzone za pośrednictwem API, posortowane według czasu utworzenia (najnowsze najpierw).
| Param | Type | Default | Opis |
|---|---|---|---|
limit | number | 50 | Wyniki na stronę (maks. 100) |
offset | number | 0 | Przesunięcie paginacji |
curl "https://api.rebyte.ai/v1/tasks?limit=10" \ -H "API_KEY: rbk_xxx"Odpowiedź:
{ "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}Pobierz zadanie
Section titled “Pobierz zadanie”GET /tasks/:idZwraca pełne szczegóły zadania, w tym historię promptów i status pochodny.
curl https://api.rebyte.ai/v1/tasks/550e8400-... \ -H "API_KEY: rbk_xxx"Odpowiedź:
{ "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" } ]}Status zadania jest pochodny od stanów promptów:
| Status | Warunek |
|---|---|
running | Dowolny prompt jest pending lub running |
completed | Wszystkie prompty zakończone, ostatni to succeeded |
failed | Wszystkie prompty zakończone, ostatni to failed |
canceled | Wszystkie prompty zakończone, ostatni to canceled |
Wyślij kontynuację
Section titled “Wyślij kontynuację”POST /tasks/:id/promptsWyślij kolejny prompt do uruchomionego lub zakończonego zadania. Jeśli maszyna wirtualna jest zatrzymana, zostanie automatycznie wznowiona.
| Field | Type | Required | Opis |
|---|---|---|---|
prompt | string | Yes | Kolejny prompt (maks. 100 000 znaków) |
skills | string[] | No | Dodatkowe slugi umiejętności dla tego promptu |
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"}'Odpowiedź (201):
{ "promptId": "770f9500-..."}Strumieniowanie zdarzeń (SSE)
Section titled “Strumieniowanie zdarzeń (SSE)”GET /tasks/:id/eventsOtwiera strumień zdarzeń Server-Sent Events dla najnowszego promptu zadania. Zdarzenia obejmują wyjście agenta (stdout, stderr), wywołania narzędzi i sygnały ukończenia.
curl -N https://api.rebyte.ai/v1/tasks/550e8400-.../events \ -H "API_KEY: rbk_xxx"Strumień emituje dwa typy zdarzeń:
event— zdarzenia wykonania (wyjście agenta, wywołania narzędzi)done— końcowe zdarzenie ze statusem ukończenia, po czym strumień się zamyka
Zmień widoczność
Section titled “Zmień widoczność”PATCH /tasks/:id/visibility| Field | Type | Required | Opis |
|---|---|---|---|
visibility | string | Yes | prywatne, udostępnione lub publiczne |
| Poziom | Kto może wyświetlić |
|---|---|
private | Tylko właściciel klucza API |
shared | Wszyscy członkowie organizacji (domyślnie) |
public | Każdy z linkiem (tylko do odczytu) |
curl -X PATCH https://api.rebyte.ai/v1/tasks/550e8400-.../visibility \ -H "API_KEY: rbk_xxx" \ -H "Content-Type: application/json" \ -d '{"visibility": "public"}'Po ustawieniu na public, odpowiedź zawiera shareUrl dla nieautoryzowanego dostępu.
Usuń zadanie
Section titled “Usuń zadanie”DELETE /tasks/:idMiękkie usunięcie zadania. Zwraca 204 No Content.
curl -X DELETE https://api.rebyte.ai/v1/tasks/550e8400-... \ -H "API_KEY: rbk_xxx"Przesyłaj pliki, aby dołączyć je do zadań. Wykorzystuje dwuetapowy przepływ z podpisanym URL.
Krok 1: Pobierz URL do przesłania
Section titled “Krok 1: Pobierz URL do przesłania”POST /files| Field | Type | Required | Opis |
|---|---|---|---|
filename | string | Yes | Nazwa pliku (maks. 255 znaków) |
contentType | string | No | Typ MIME (domyślnie: application/octet-stream) |
Odpowiedź (201):
{ "id": "550e8400-...", "filename": "data.csv", "uploadUrl": "https://storage.googleapis.com/...", "maxFileSize": 52428800}URL do przesłania wygasa po 1 godzinie.
Krok 2: Prześlij plik
Section titled “Krok 2: Prześlij plik”curl -X PUT "UPLOAD_URL_FROM_STEP_1" \ -H "Content-Type: application/octet-stream" \ --data-binary @data.csvKrok 3: Dołącz do zadania
Section titled “Krok 3: Dołącz do zadania”Przekaż id i filename z Kroku 1 podczas tworzenia zadania:
{ "prompt": "Analyze the uploaded data", "files": [ {"id": "550e8400-...", "filename": "data.csv"} ]}Pliki są automatycznie kopiowane do maszyny wirtualnej zadania po rozpoczęciu wykonania.
Webhooki
Section titled “Webhooki”Otrzymuj powiadomienia HTTP POST, gdy wystąpią zdarzenia zadania. Webhooki są uniwersalne — uruchamiają się dla wszystkich zadań w Twojej organizacji, niezależnie od tego, czy zostały utworzone za pośrednictwem API, interfejsu użytkownika, czy innego kanału.
Zdarzenia
Section titled “Zdarzenia”| Zdarzenie | Uruchamia się, gdy |
|---|---|
task.created | Nowe zadanie zostało utworzone |
task.running | Agent rozpoczyna wykonywanie |
task.completed | Zadanie zakończyło się pomyślnie |
task.failed | Zadanie nie powiodło się |
task.canceled | Zadanie zostało anulowane przez użytkownika |
Utwórz Webhook
Section titled “Utwórz Webhook”POST /webhooks| Field | Type | Required | Opis |
|---|---|---|---|
url | string | Yes | URL punktu końcowego HTTPS |
events | string[] | Yes | Zdarzenia do subskrybowania |
description | string | No | Etykieta czytelna dla człowieka (maks. 500 znaków) |
secret | string | No | Współdzielony sekret (maks. 500 znaków). Po ustawieniu, dołączany jako nagłówek X-Webhook-Secret w każdej dostawie. |
# 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" }'Odpowiedź (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}Uwagi dotyczące zachowania:
- Zduplikowane URL: zarejestrowanie tego samego URL dwukrotnie zwraca istniejący webhook (idempotentne)
- Limit: maksymalnie 3 webhooki na organizację. Czwarty zwraca
limit_exceeded. - Przechowywanie sekretu: wartość sekretu nigdy nie jest zwracana w żadnej odpowiedzi. Ujawniane jest tylko
hasSecret: true/false.
Wyświetl Webhooki
Section titled “Wyświetl Webhooki”GET /webhooksZwraca wszystkie webhooki dla Twojej organizacji z informacjami o statusie (lastTriggeredAt, failureCount, isActive). Sekrety nigdy nie są ujawniane.
Pobierz Webhook
Section titled “Pobierz Webhook”GET /webhooks/:idUsuń Webhook
Section titled “Usuń Webhook”DELETE /webhooks/:idZwraca 204 No Content. Usunięte webhooki natychmiast przestają otrzymywać dostawy.
Dostawa
Section titled “Dostawa”Gdy zdarzenie zadania pasuje do subskrybowanych zdarzeń webhooka, Rebyte wysyła żądanie HTTP POST na URL webhooka.
Ładunek:
{ "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— status promptu:pending(task.created),running(task.running),succeeded(task.completed),failed(task.failed),canceled(task.canceled)taskUrl— bezpośredni link do zadania w interfejsie użytkownika Rebyte (zawsze obecny)result— końcowy tekst wyjściowy AI (obecny w zdarzeniach końcowych:task.completed,task.failed,task.canceled; nieobecny wtask.createditask.running)
Wywołaj GET /tasks/:id, aby uzyskać pełne szczegóły zadania, w tym historię promptów.
Nagłówki dostawy:
| Header | Zawsze obecny | Opis |
|---|---|---|
Content-Type | Yes | application/json |
X-Webhook-Signature | Yes | Podpis RSA-SHA256 zakodowany w Base64 |
X-Webhook-Timestamp | Yes | Znacznik czasu Unix (sekundy) |
X-Webhook-Secret | Only if secret configured | Współdzielony sekret, który ustawiłeś podczas tworzenia |
Limit czasu: dostawy przekraczają limit czasu po 10 sekundach.
Obsługa błędów:
- Dostawa jest typu fire-and-forget — brak automatycznych ponownych prób w przypadku awarii
- Odpowiedzi inne niż 2xx zwiększają
failureCount - Po 10 kolejnych niepowodzeniach, webhook jest automatycznie wyłączany (
isActive: false) - Udane dostawy resetują
failureCountdo 0
Weryfikacja podpisu
Section titled “Weryfikacja podpisu”Każda dostawa jest podpisywana parą kluczy RSA-2048 Twojej organizacji, niezależnie od tego, czy skonfigurowano współdzielony sekret.
Jak to działa:
- Rebyte łączy
{timestamp}.{body}(np.1706443200.{"event":"task.completed",...}) - Podpisuje ciąg znaków za pomocą RSA-SHA256, używając klucza prywatnego Twojej organizacji
- Wysyła podpis zakodowany w Base64 w
X-Webhook-Signature
Pobierz swój klucz publiczny: skontaktuj się z pomocą techniczną lub pobierz go z pulpitu nawigacyjnego Rebyte. Para kluczy RSA-2048 jest generowana automatycznie przy pierwszym utworzeniu webhooka i utrzymuje się dla organizacji.
Przykład weryfikacji (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');}
// W Twoim handlerze webhooka: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');});Przykład weryfikacji (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 FalseDwupoziomowe zabezpieczenia
Section titled “Dwupoziomowe zabezpieczenia”Webhooki obsługują dwie niezależne metody weryfikacji, które mogą być używane razem:
| Metoda | Header | Jak to działa | Przypadek użycia |
|---|---|---|---|
| RSA signature | X-Webhook-Signature | Kryptograficzny dowód, że ładunek pochodzi z Rebyte | Weryfikacja odporna na manipulacje |
| Pre-shared secret | X-Webhook-Secret | Statyczny ciąg znaków, który ustawiasz podczas tworzenia, zwracany w każdej dostawie | Prosta weryfikacja współdzielonego sekretu |
Podpisy RSA są zawsze obecne. Współdzielony sekret jest opcjonalny — ustaw go podczas tworzenia webhooka, jeśli chcesz prostszej ścieżki weryfikacji.
Przykład odpytywania (Polling)
Section titled “Przykład odpytywania (Polling)”Kompletny przykład: utwórz zadanie, odpytuj do momentu ukończenia, a następnie wyślij kontynuację.
# 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"}'Format błędu
Section titled “Format błędu”Wszystkie błędy mają następującą strukturę:
{ "error": { "code": "validation_error", "message": "Invalid request body" }}| Kod | Status HTTP | Opis |
|---|---|---|
missing_api_key | 401 | Nagłówek API_KEY nie został dostarczony |
invalid_api_key | 401 | Nieprawidłowy lub wygasły klucz API |
validation_error | 400 | Treść żądania nie przeszła walidacji |
not_found | 404 | Zasób nie istnieje lub jest niedostępny |
limit_exceeded | 400 | Osiągnięto limit organizacji (np. maks. liczba webhooków) |
agent_disabled | 403 | Żądany wykonawca jest wyłączony dla tej organizacji |
internal_error | 500 | Błąd po stronie serwera |
Ograniczenie szybkości (Rate Limiting)
Section titled “Ograniczenie szybkości (Rate Limiting)”API obecnie nie narzuca limitów szybkości na klucz. Każde POST /tasks udostępnia rzeczywistą maszynę wirtualną, więc koszty skalują się wraz z użyciem. Używaj webhooków zamiast agresywnego odpytywania, aby zmniejszyć liczbę niepotrzebnych żądań.