API
Submit issues, start agents from webhooks and manage your Inbox from code.
Authentication
| Endpoint | Token |
|---|---|
/api/v1/signals | Authorization: Bearer sig_… (or Cloudflare's cf-webhook-auth) from the source's page under Integrations |
/api/v1/webhooks/:id | Authorization: Bearer bxw_… from the webhook's page |
| Everything else | Authorization: Bearer <token> from skyfleet login (in ~/.config/box/config.json), or a dashboard session |
When something goes wrong, you get { "error": "…" } back, saying what happened and what to do about it.
Submit issues
Starts one agent per issue, as you, from the environment you pick. Each one shows up in your Inbox.
POST /api/issues{
"envId": "env_8c1f…",
"issues": [
{ "title": "Fix the flaky checkout test", "prompt": "checkout.spec.ts fails 1 in 10 runs. Find why, fix it, open a PR." }
]
}Send 1 to 10 issues at a time. Titles can be up to 200 characters and prompts up to 20,000. Submitting the same title twice won't start a second agent.
{ "data": [{ "issue": "is_…", "title": "Fix the flaky checkout test", "agent": "acme-app-fix-the-flaky-…", "error": null, "url": "https://…/inbox/is_…" }] }If an agent couldn't start, agent is null and error says why. You can look up envId with GET /api/environments.
List issues
GET /api/issuesReturns the 200 most recent issues as { "data": [...] }, newest first:
| Field | |
|---|---|
id | is_… |
source | errors, linear or submitted |
service | The service, Linear identifier, or who submitted it |
title, detail | The headline and the error, ticket or prompt |
count | Events so far |
status | open, resolved or ignored |
box | The agent working on it, or null |
firstAt, lastAt | Timestamps |
Update an issue
PATCH /api/issues/:id{ "status": "resolved", "title": "Double charge on annual upgrade" }Send either field, or both. If a resolved issue comes back, it starts a new agent. An ignored one never does.
Report an error
POST /api/v1/signals. See Errors API.
Call a webhook
POST /api/v1/webhooks/:id
Authorization: Bearer bxw_…Send any body up to 256 KB, and the agent gets it as context. You'll get back 202 {"box": "<name>"}.
| Status | When |
|---|---|
401 | Unknown webhook or wrong token |
403 | The webhook's creator left the team |
409 | The creator isn't signed in to Claude |
413 | Body over 256 KB |
Agents
| Request | |
|---|---|
GET /api/boxes | Every agent on the team |
POST /api/boxes/:id/pause | Put it to sleep |
POST /api/boxes/:id/resume | Wake it |
PATCH /api/boxes/:id | {"alwaysOn": true}, {"size": "large"} or {"title": "…"} |
DELETE /api/boxes/:id | Delete it; add ?force=1 while it's in use |
GET /api/environments | Environments you can use |