Workbenches is an open standard. Read why
Docs Workers

API reference

Workers

A worker is a member's own machine that takes runs in place of a cloud sandbox. It is registered and operated with wb worker; see Setup. Every member may read the organization's workers and their logs. Another organization's worker reads as 404.

The worker object#

Field Type Meaning
id UUID
organization_id UUID
name string, 1 to 80 characters
slug string From the name, unique among the organization's workers. Pass it as worker to POST /v1/runs.
owner_member_id UUID or null
owner_name string or null
shared boolean Shared with the organization, or personal to its owner.
online boolean
machine object or null os (linux, macos, windows), arch (x64, arm64), cpus, memory_gb, gpus (each name, optional memory_gb), docker (version, or null), runners (each name, version).
runtimes list of docker, local The runtimes it offers.
slots object busy, total.
current_runs integer Its runs that have not ended, waiting ones included.
wb_version string or null
connected_at, seen_at date-time or null
created_at date-time

Register a worker#

POST /v1/workers with { "name": "mini" }

Key runs:write of a member. 10 a minute per address; past that, 429. This is what wb worker start does with the CLI's login key. The key's member owns the new personal worker.

Response 201:

{
    "worker": { "id": "uuid", "slug": "mini", "name": "mini", "shared": false },
    "key": "wbk_..."
}

The worker key, wbk_ and 64 hex characters, is returned once. Only its hash is kept. Each registration is audited.

List workers#

GET /v1/workers

Key runs:read, or session: member.

Query Type Meaning
organization slug For a session.

Response 200 { "workers": [ ... ] }.

Get a worker#

GET /v1/workers/:id

Key runs:read, or session: member. Response 200: the worker.

Share or unshare#

PATCH /v1/workers/:id with { "shared": true }

Its owner: a session, or a key with runs:write. Response 200: the worker. A shared worker takes runs from every member; a personal one only from its owner.

Read its log#

GET /v1/workers/:id/logs

Key runs:read, or session: member. The latest 300 lines, scrubbed of secrets:

{
    "lines": [
        {
            "at": "2026-10-28T14:02:11Z",
            "text": "online, 1 slot, docker 27.3.1, runtimes docker"
        }
    ]
}

Remove a worker#

DELETE /v1/workers/:id

Its owner, or an owner or admin (a session, or a key with runs:write). Response 204. Its key stops working, its connection closes, and the runs it held fail. The slug is freed.

DELETE /v1/workers/self, with the worker key, revokes the worker's own key with the same effect. wb worker remove calls it.

Runs on a worker#

Pass worker to POST /v1/runs. The refusals (404, 403, 409 worker_offline, 422 worker_unsuitable) are on Runs and sessions. GET /v1/runs?worker=<uuid> lists a worker's runs.

Member sign-ins#

wb connect --worker <slug> <runner> uses these to sign a member in to a runner on a worker.

Start a sign-in#

POST /v1/workers/:slug/connections

Key runs:write of a member who may run on the worker (it is shared, or theirs).

Field Type Meaning
runner string opencode, claude-code, or pi.
provider string The provider, such as openai.
method string The method, such as chatgpt or api-key.

Response 201 { "id": "uuid", "owner": "Ada Lovelace" }. owner names whose machine it is when it is not the caller's own, or is null. 409 worker_offline when the worker is not connected. A sign-in expires 10 minutes after it was created.

Attach the terminal#

GET /v1/workers/:slug/connections/:id/terminal?cols=<n>&rows=<n>

The same member, as a WebSocket. Nothing runs on the worker until this terminal attaches. It relays the runner's sign-in terminal to the member at that size; closing it cancels the sign-in. Terminal bytes and secrets are relayed, never stored or logged. Whatever the runner signs in with stays on the worker, in that member's directory.

The worker's own socket#

GET /v1/workers/connect is the WebSocket a worker holds with its wbk_ key. PUT /v1/runs/:id/outcome and GET /v1/runs/:id/package carry a worker run's outcome and package with credentials only the worker receives. These are for wb worker itself and are not documented here.