List a workspace's self-hosted runners
GET/api/workspaces/{workspace_id}/runners
listWorkspaceRunners
Runners bound to this workspace, newest first (at most 500). A workspace admin or owner sees every one — shared workspace-bound runners and each member's personal (actor-bound) runner — and may deregister any. A plain member sees the workspace-bound runners read-only plus their own actor-bound runners; other members' personal machines are never listed. `status` is effective: `offline` once the runner stopped polling. 404 for a non-member.
Requires authentication using a bearer token or a session cookie — see tokens and scopes.
curl
curl -X GET 'https://neosource.dev/api/workspaces/WORKSPACE_ID/runners' \
-H 'Authorization: Bearer $NEOSOURCE_TOKEN'fetch
fetch("https://neosource.dev/api/workspaces/WORKSPACE_ID/runners", {
method: "GET",
headers: {
Authorization: "Bearer $NEOSOURCE_TOKEN",
},
});Path parameters
workspace_idrequired
Responses
200Runners the caller may see
application/json
403Forbidden — one of: forbidden, needs_scope
application/json
Standard errors
Bodies documented once for the whole API — see standard errors.
- 400Bad Request — one of: invalid_input
- 401Authentication required
- 404Not Found — one of: not_found
- 429Rate limited — retry after the `Retry-After` header
- 500Internal server error
- 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
- 504Gateway timeout — the request exceeded the server's handling budget
Schemas
Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.
RunnerBindingKind
Which trust binding a job executed under (ADR 0056 §1/§7). Serialized on the wire and in `workflow_run_jobs.executed_on` as the `snake_case` strings `hosted` / `workspace` / `actor`.
"hosted""workspace""actor"
RunnerMachineInfo
What a runner agent reports about the machine it runs on (issue #777): `POST /api/runners` (`machine`) and `PUT /api/runners/{runner_id}/machine`. Every field is optional. A value of the wrong JSON type (a string for `cpu_cores`, a negative `memory_bytes`) fails request extraction like any other malformed body; a well-typed value is never rejected for its content — strings are trimmed, stripped of control and invisible formatting characters and truncated, and counts are clamped — since this is untrusted tenant-hardware input.
agent_versionAgent build that reported, e.g. `neo 0.1.0 (abc1234)`.
archCPU architecture as Rust's `std::env::consts::ARCH` spells it (`x86_64`, `aarch64`, …). Open vocabulary — render, don't match.
cpu_coresLogical CPUs available to the agent.
cpu_modelCPU model string, e.g. `AMD Ryzen 9 7950X 16-Core Processor`.
memory_bytesTotal physical memory in bytes.
nameDisplay name shown in the web UI and `neo runner list`. Defaults to the machine's hostname agent-side. On a report, `null` keeps the name already stored.
osOperating system as Rust's `std::env::consts::OS` spells it (`linux`, `macos`, `windows`, …). Open vocabulary — render, don't match.
RunnerStatus
"online""draining""offline"
VmBackendKind
"docker_shell""kata_clh""kata_fc""lib_krun""k8s_runc""cloud_hypervisor"