put_api_management_v1_runners_name_
const url = 'https://example.com/api/management/v1/runners/example';const options = { method: 'PUT', headers: {'Content-Type': 'application/json'}, body: '{"allowed_labels":["example"],"allowed_workspace_ids":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"capabilities":{},"class":"example","drain_state":"example","isolation":"example","labels":["example"],"tier":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://example.com/api/management/v1/runners/example \ --header 'Content-Type: application/json' \ --data '{ "allowed_labels": [ "example" ], "allowed_workspace_ids": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "capabilities": {}, "class": "example", "drain_state": "example", "isolation": "example", "labels": [ "example" ], "tier": "example" }'Authorizations
Section titled “Authorizations”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”Management API runner name
Request Bodyrequired
Section titled “Request Bodyrequired”The desired state of a managed runner (PUT /management/v1/runners/{name}).
object
Optional label ceiling of the grant; empty = no label restriction.
Workspaces an edge runner may serve. null/absent = every workspace, which
only a trusted runner may hold.
Further capabilities, e.g. {"builds": true} or {"connectors": true}. The
labels key is set from labels.
object
trusted (may serve every workspace) or edge (only allowed_workspace_ids).
active, cordoned or draining; absent leaves it unchanged.
container (default) or microvm.
Labels the runner advertises for worker-group routing (capabilities.labels).
docker (default), wasm or both.
Examplegenerated
{ "allowed_labels": [ "example" ], "allowed_workspace_ids": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "capabilities": {}, "class": "example", "drain_state": "example", "isolation": "example", "labels": [ "example" ], "tier": "example"}Responses
Section titled “ Responses ”Created or updated; never carries a token
The result of an upsert: the runner, and whether this call created it.
object
A runner as an automation sees it.
object
object
online and heard from within the liveness window.
The display name.
active, cordoned or draining.
The Management API name (managed_key); null for a runner registered in
the browser or by enrollment.
pending, online, offline or disabled.
Token metadata — never the value.
object
Revoked tokens and tokens past their expiry are not active.
Examplegenerated
{ "created": true, "runner": { "allowed_labels": [ "example" ], "allowed_workspace_ids": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "capabilities": {}, "class": "example", "connected": true, "display_name": "example", "drain_state": "example", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "labels": [ "example" ], "last_seen_at": "2026-04-15T12:00:00Z", "name": "example", "status": "example", "tokens": [ { "active": true, "created_at": "2026-04-15T12:00:00Z", "expires_at": "2026-04-15T12:00:00Z", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "revoked_at": "2026-04-15T12:00:00Z" } ] }}Missing runners:write, or not an instance-level token
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}The runner exists with a different class
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Invalid name, labels, capabilities or grant
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}