Admin
List the normalized bare registry refs that this cell routes globally. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The set is evaluated in the cell-local routing snapshot alongside images.global.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Global registry refs for this cell
application/json- response
refs*array<>curl -X GET 'https://example.com/manage/global-refs'{ "refs": [ { "created_at": "2019-08-24T14:15:22Z", "note": "string", "ref": "string" } ]}Add or update a normalized bare registry ref in this cell's global-routing set. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The set is cell-local because the routing snapshot is cell-local.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
application/json- body
note?string|nullref*stringGlobal ref added or updated
application/json- response
created_at*stringdate-timenote?string|nullref*stringcurl -X POST 'https://example.com/manage/global-refs' \ -H 'Content-Type: application/json' \ -d '{ "ref": "string"}'{ "created_at": "2019-08-24T14:15:22Z", "note": "string", "ref": "string"}Remove one normalized bare registry ref from this cell's global-routing set. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The ref is a query parameter because image refs contain / and :.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
ref*stringGlobal ref removed
application/json- response
ref*stringremoved*booleancurl -X DELETE 'https://example.com/manage/global-refs?ref=string'{ "ref": "string", "removed": true}List the global-region groups. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The global-region catalog is served centrally: served on home and central cells (central is the write authority for this replicated tenancy metadata); a workload cell answers 501 MANAGEMENT_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Global-region catalog
application/json- response
[index: integer]?A cached Geo group or the Global root (Earth, ID earth): a broad placement
selector expanded to one Edge descendant at create time. Geo groups are
arbitrary abstract groups of Macros, not geographic constraints. The
global_regions catalog and this DTO retain their technical names. id is the
slug (shares the create-time region selector namespace with regions.id; a
DB trigger forbids collisions).
curl -X GET 'https://example.com/manage/global-regions'[ { "id": "string", "member_count": 0, "name": "string", "selectable": true }]Create a global-region group. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The global-region catalog is served centrally: served on home and central cells (central is the write authority for this replicated tenancy metadata); a workload cell answers 501 MANAGEMENT_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
application/json- body
id*stringname*stringGlobal-region group created
application/json- response
A cached Geo group or the Global root (Earth, ID earth): a broad placement
selector expanded to one Edge descendant at create time. Geo groups are
arbitrary abstract groups of Macros, not geographic constraints. The
global_regions catalog and this DTO retain their technical names. id is the
slug (shares the create-time region selector namespace with regions.id; a
DB trigger forbids collisions).
id*stringmember_count?|Number of eligible Edge descendants (for discovery via GET /global-regions).
Fleet discovery eligibility (issue #1867): tenant-visible descendants
that are active, routable and opted into broad placement, INDEPENDENT of
whether the process answering happens to serve them itself. It is
inventory, not capacity, and not a promise that a create will be
accepted. [Self::selectable] describes the answering API's local
execution scope, not the capabilities of a separately configured router.
None means "this process cannot count them", not "zero". A central
deployment owns the groups but no concrete region rows, so membership
lives in the cells and is not locally computable; reporting 0 there
told the operator every group was empty.
0 <= valuename*stringselectable?booleanWhether this API cell serves an eligible member of the group.
Deliberately distinct from [Self::member_count]: the count is a
fleet-wide inventory fact, this is an execution fact about the API
answering the request. A control plane serving no regions reports positive
counts with selectable: false. That does not forbid a client from using
a separately configured shared workload router: that path requires a
positive fleet count and its own supported routing configuration.
Global/Geo creates must use the shared router's binding/receipt protocol even when this flag is true. Capacity, class compatibility, artifact locality and admission still apply; this flag is not an execution grant.
curl -X POST 'https://example.com/manage/global-regions' \ -H 'Content-Type: application/json' \ -d '{ "id": "string", "name": "string"}'{ "id": "string", "member_count": 0, "name": "string", "selectable": true}Rename a global-region group. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The global-region catalog is served centrally: served on home and central cells (central is the write authority for this replicated tenancy metadata); a workload cell answers 501 MANAGEMENT_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringglobal-region id
application/json- body
name*stringGlobal-region group renamed
application/json- response
A cached Geo group or the Global root (Earth, ID earth): a broad placement
selector expanded to one Edge descendant at create time. Geo groups are
arbitrary abstract groups of Macros, not geographic constraints. The
global_regions catalog and this DTO retain their technical names. id is the
slug (shares the create-time region selector namespace with regions.id; a
DB trigger forbids collisions).
id*stringmember_count?|Number of eligible Edge descendants (for discovery via GET /global-regions).
Fleet discovery eligibility (issue #1867): tenant-visible descendants
that are active, routable and opted into broad placement, INDEPENDENT of
whether the process answering happens to serve them itself. It is
inventory, not capacity, and not a promise that a create will be
accepted. [Self::selectable] describes the answering API's local
execution scope, not the capabilities of a separately configured router.
None means "this process cannot count them", not "zero". A central
deployment owns the groups but no concrete region rows, so membership
lives in the cells and is not locally computable; reporting 0 there
told the operator every group was empty.
0 <= valuename*stringselectable?booleanWhether this API cell serves an eligible member of the group.
Deliberately distinct from [Self::member_count]: the count is a
fleet-wide inventory fact, this is an execution fact about the API
answering the request. A control plane serving no regions reports positive
counts with selectable: false. That does not forbid a client from using
a separately configured shared workload router: that path requires a
positive fleet count and its own supported routing configuration.
Global/Geo creates must use the shared router's binding/receipt protocol even when this flag is true. Capacity, class compatibility, artifact locality and admission still apply; this flag is not an execution grant.
curl -X PATCH 'https://example.com/manage/global-regions/string' \ -H 'Content-Type: application/json' \ -d '{ "name": "string"}'{ "id": "string", "member_count": 0, "name": "string", "selectable": true}List the affinity-group routing state for the current cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Group membership, breaker state, and vslot routing are cell-local, so callers must query the cell whose fleet they want to inspect.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Affinity-group state for this cell
application/json- response
enabled_regions*array<string>Per-region routing flag (regions.affinity_enabled).
groups*array<>curl -X GET 'https://example.com/manage/groups'{ "enabled_regions": [ "string" ], "groups": [ { "best_free_mem_mib": 0, "breaker_open": true, "breaker_reason": "string", "cpu_arch": "string", "cpu_type": "string", "disk_class": "string", "group_id": "string", "healthy_members": 0, "members": 0, "network_class": "string", "oldest_pending_ms": 0, "pending": 0, "recruits": [ "string" ], "region_id": "string", "seq": 0, "total_free_mem_mib": 0, "vslots": 0 } ]}List the registry and Dockerfile images known to this cell's layer index; capture and Windows images are not listed. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Image routing flags and indexed layer totals are cell-local because the manifest and layer index describe the current cell's storage.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Images and indexed layer totals for this cell
application/json- response
images*array<>curl -X GET 'https://example.com/manage/images'{ "images": [ { "global": true, "id": "string", "indexed_bytes": 0, "indexed_layers": 0, "layer_count": 0, "manifest_name": "string", "name": "string", "status": "string" } ]}Update operator-only image flags on the owning cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The global flag changes only routing within the image's own cell; it does not copy artifacts, mutate workload-plane JSON fields, or make the image visible to any other project. Only setting global: true is restricted to registry and dockerfile images; global: false is accepted on any image to clear a stale flag.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringimage id (region-tagged external id or raw UUID)
application/json- body
global?boolean|nullImage flags updated
application/json- response
global*booleanid*stringname*stringstatus*stringcurl -X PATCH 'https://example.com/manage/images/string' \ -H 'Content-Type: application/json' \ -d '{}'{ "global": true, "id": "string", "name": "string", "status": "string"}List the indexed layer stack for one image on the owning cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Layer sharing and reclaimability are cell-local because the manifest and layer index describe the current cell's storage.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringimage id (region-tagged external id or raw UUID)
Image layer stack
application/json- response
exclusive_bytes*integerint64image_id*stringlayer_count?|0 <= valuelayers*array<>manifest_name?string|nullname*stringstatus*stringtotal_bytes*integerint64curl -X GET 'https://example.com/manage/images/string/layers'{ "exclusive_bytes": 0, "image_id": "string", "layer_count": 0, "layers": [ { "bytes": 0, "diff_id": "string", "erofs_path": "string", "exclusive": true, "position": 0, "shared_with": 0 } ], "manifest_name": "string", "name": "string", "status": "string", "total_bytes": 0}Backfill missing manifest-layer index rows on this cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The work is cell-local because manifests are read through this cell's own runners.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
limit?integerint64Backfill progress summary
application/json- response
considered*integer0 <= valuefailed*integer0 <= valueindexed*integer0 <= valuelayers_written*integer0 <= valuemore*booleancurl -X POST 'https://example.com/manage/layers/backfill'{ "considered": 0, "failed": 0, "indexed": 0, "layers_written": 0, "more": true}List every artifact on this cell that still references one diff-id. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The answer is cell-local because layer reachability is determined from this cell's manifest index and live VM rows.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
diff_id*stringlayer diff-id, with or without the sha256: prefix
Layer dependents on this cell
application/json- response
bytes*integerint64dependent_count*integer0 <= valuediff_id*stringfunction_versions*array<>images*array<>manifest_count*integer0 <= valuemanifests*array<string>reclaimable*booleansnapshots*array<>vms*array<>curl -X GET 'https://example.com/manage/layers/string/dependents'{ "bytes": 0, "dependent_count": 0, "diff_id": "string", "function_versions": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "manifest_name": "string" } ], "images": [ { "id": "string", "name": "string", "status": "string" } ], "manifest_count": 0, "manifests": [ "string" ], "reclaimable": true, "snapshots": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "manifest_name": "string", "name": "string", "status": "string" } ], "vms": [ { "id": "string", "manifest_name": "string", "status": "string" } ]}List the imported Macro regions (one per workload cell). This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The Macro catalog is served by whichever deployment mounts the management plane from the replicated topology metadata: Home in a fused deployment, Central in a split deployment; a workload cell answers 501 MANAGEMENT_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Macro-region catalog
application/json- response
[index: integer]?A cached macro-region row (PLAN-REGION-HIERARCHY.md): the public selector for exactly ONE workload cell, sitting between a Geo group and the Edge regions that cell serves.
cell_id is the deployment's stable cell identity — the key the request
router's directory is indexed by — not a URL and not the serving process's
deployment role. Both it and id are immutable: re-pointing either would
move future placement to a different database.
curl -X GET 'https://example.com/manage/macro-regions'[ { "cell_id": "string", "eligible_local_region_count": 0, "global_region_id": "string", "id": "string", "name": "string", "selectable": true }]Rename one Macro region or move it under a different Geo region. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Macro regions are imported from deployment inventory, so only the display name and Geo parent are editable here; the Macro id and its bound cell remain immutable.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringMacro-region id
application/json- body
A Macro region's editable topology: its display name and its Geo parent
(PLAN-REGION-HIERARCHY.md). id and cell_id are deployment-owned and
immutable, so they are absent here by design.
At least one field must be present — an empty body is a no-op an operator would read as a successful edit.
Both fields are Option<Option<_>> so ABSENT and EXPLICIT NULL stay
distinguishable. Neither column is nullable: macro_regions.name and
macro_regions.global_region_id are NOT NULL, and a Macro with no Geo
parent would strand every one of its Edge regions. A plain Option
collapsed {"name": null, "global_region_id": "eu"} into "name omitted" and
silently applied half the request, which reads to the caller as a rejected
field that was actually accepted-and-ignored.
global_region_id?|New Geo parent id. Omit to keep the current value. An explicit null
is rejected so the API can name the bad field instead of silently
treating it as absent.
name?|New Macro display name. Omit to keep the current value. An explicit
null is rejected so the API can name the bad field instead of silently
treating it as absent.
Macro region updated
application/json- response
A cached macro-region row (PLAN-REGION-HIERARCHY.md): the public selector for exactly ONE workload cell, sitting between a Geo group and the Edge regions that cell serves.
cell_id is the deployment's stable cell identity — the key the request
router's directory is indexed by — not a URL and not the serving process's
deployment role. Both it and id are immutable: re-pointing either would
move future placement to a different database.
cell_id*stringeligible_local_region_count?|Edge regions beneath this Macro that a broad selector may place in:
active, routable and opted in — fleet discovery eligibility, not
scoped to what the answering process serves (issue #1867). None means
this process cannot count them — a central deployment owns the topology
but no local rows, so reporting 0 would claim every cell is empty.
Computed from the local rows loaded in the same snapshot, never selected
— which is why the DTO is separate from MacroRegionRow.
0 <= valueglobal_region_id*stringThe Geo group this Macro hangs off. Groups are arbitrary/abstract; names
such as US or EU do not impose a geographic constraint. Never earth:
that ID names the Global root. The field retains its stored name.
id*stringname*stringselectable?booleanWhether this API cell serves an eligible member of this Macro —
the same local execution fact as [GlobalRegionInfo::selectable],
and deliberately distinct from the inventory count above (issue #1867).
Filled per read rather than cached with the row: it depends on this process's own served set, which is not a property of the catalog.
curl -X PATCH 'https://example.com/manage/macro-regions/string' \ -H 'Content-Type: application/json' \ -d '{}'{ "cell_id": "string", "eligible_local_region_count": 0, "global_region_id": "string", "id": "string", "name": "string", "selectable": true}List the indexed layer stack for one manifest name on this cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The answer is cell-local because manifest indexing happens against this cell's storage.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
name*stringmanifest name
Manifest layer stack
application/json- response
layer_count*integer0 <= valuelayers*array<>manifest_name*stringtotal_bytes*integerint64curl -X GET 'https://example.com/manage/manifests/string/layers'{ "layer_count": 0, "layers": [ { "bytes": 0, "diff_id": "string", "erofs_path": "string", "exclusive": true, "position": 0, "shared_with": 0 } ], "manifest_name": "string", "total_bytes": 0}List this cell's platform images: operator-published Linux images every organization and project can create sandboxes from, with the cell's platform default per class. Requires the platform-operator credential: an OIDC JWT for a configured platform admin, or the internal token. Served on home and workload cells, each answering for its own images; a central deployment answers 501 WORKLOAD_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Platform images and the cell's defaults
application/json- response
GET /manage/platform-images body.
default*The cell's platform default per class: the image's img_… id, or null.
images*array<>curl -X GET 'https://example.com/manage/platform-images'{ "default": { "linux": "string" }, "images": [ { "available_in": [ "string" ], "class": "string", "created_at": "2019-08-24T14:15:22Z", "default": true, "deprecated": true, "description": "string", "error": "string", "id": "string", "name": "string", "ref": "string", "region": "string", "status": "string" } ]}Publish a platform image on this cell: import a public registry ref, pinned by digest, under a name every project can create sandboxes from. A project's own image of the same name takes precedence for that project. Idempotent per name and ref: publishing an existing name with the same ref answers 200 and enqueues nothing, unless its import failed, which retries it. Platform images are immutable; a new ref needs a new name. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
application/json- body
POST /manage/platform-images body.
description?|At most 256 characters.
name*stringImage name tenants create from. A label ([A-Za-z0-9._-], no
reserved prefix) that does not start with img_.
ref*stringRegistry ref pinned by digest: [host[:port]/]path[:tag]@sha256:<64 hex>.
Public registries only.
The name already exists with this ref; nothing enqueued, and the existing row (its deprecation and description included) is returned unchanged — use PATCH to change it
application/json- response
{image} — the platform image after a write.
image*One operator-published platform image, as /manage/platform-images
returns it.
curl -X POST 'https://example.com/manage/platform-images' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "ref": "string"}'{ "image": { "available_in": [ "string" ], "class": "string", "created_at": "2019-08-24T14:15:22Z", "default": true, "deprecated": true, "description": "string", "error": "string", "id": "string", "name": "string", "ref": "string", "region": "string", "status": "string" }}Clear the cell's platform default image for a class (idempotent). A POST /sandboxes without image then answers 400 DEFAULT_IMAGE_NOT_CONFIGURED. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
class?stringThe class whose default to clear. Only linux; absent means linux.
No default is set for the class
curl -X DELETE 'https://example.com/manage/platform-images/default'Set the cell's platform default image for a class: the image a POST /sandboxes without image boots. Only linux. The image must be a ready, non-deprecated Linux platform image. Takes effect on the next create. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
application/json- body
PUT /manage/platform-images/default body.
class*stringThe sandbox class the default serves. Only linux.
image*stringThe platform image's name or img_… id.
The new default
application/json- response
PUT /manage/platform-images/default response.
class*stringimage*One operator-published platform image, as /manage/platform-images
returns it.
curl -X PUT 'https://example.com/manage/platform-images/default' \ -H 'Content-Type: application/json' \ -d '{ "class": "string", "image": "string"}'{ "class": "string", "image": { "available_in": [ "string" ], "class": "string", "created_at": "2019-08-24T14:15:22Z", "default": true, "deprecated": true, "description": "string", "error": "string", "id": "string", "name": "string", "ref": "string", "region": "string", "status": "string" }}Deprecate or restore a platform image, or change its description. A deprecated image takes no new creates by name and is not listed to tenants; sandboxes that already use it keep booting, and its img_… id still resolves. The current default cannot be deprecated. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringPlatform image id (img_…)
application/json- body
PATCH /manage/platform-images/{id} body. Absent fields are unchanged.
deprecated?|true hides the image from new creates by name and from tenant
listings; false restores it. The current default cannot be
deprecated.
description?|The new description (at most 256 characters); null clears it.
The updated platform image
application/json- response
{image} — the platform image after a write.
image*One operator-published platform image, as /manage/platform-images
returns it.
curl -X PATCH 'https://example.com/manage/platform-images/string' \ -H 'Content-Type: application/json' \ -d '{}'{ "image": { "available_in": [ "string" ], "class": "string", "created_at": "2019-08-24T14:15:22Z", "default": true, "deprecated": true, "description": "string", "error": "string", "id": "string", "name": "string", "ref": "string", "region": "string", "status": "string" }}Delete a platform image. Refused while any sandbox references it or while it is the platform default; deprecate it first to stop new creates. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringPlatform image id (img_…)
Platform image deleted
curl -X DELETE 'https://example.com/manage/platform-images/string'List the concrete region catalog visible on this cell for operator routing. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Workload and home cells serve the concrete regions they mount. A standalone central deployment does not author a concrete-region catalog: it keeps this GET only as the cell router's authenticated discovery oracle, returning the empty response the router replaces with its own directory.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Region catalog for operator discovery
application/json- response
[index: integer]?A cached region row. id is the slug (also the Daytona target and the
runner's region identifier).
curl -X GET 'https://example.com/manage/regions'[ { "api_base_url": "string", "auto_placement_enabled": true, "gpu_runners_allow_linux": true, "id": "string", "is_default": true, "macro_region_id": "string", "name": "string", "preview_domain": "string", "status": "string", "toolbox_proxy_url": "string" }]List the global registry credentials: credentials an operator stored for image pulls by every organization, each scoped to a registry host and a repository prefix. Passwords are never returned. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token. Served on home and workload cells (each reads its own rows, where its pulls resolve); a central deployment answers 501 WORKLOAD_PLANE_ELSEWHERE.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Global registry credential metadata (never passwords)
application/json- response
GET /manage/registries/global body.
registries*array<>curl -X GET 'https://example.com/manage/registries/global'{ "registries": [ { "created_at": "2019-08-24T14:15:22Z", "description": "string", "host": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "import_only": true, "kind": "string", "repository_prefix": "string", "updated_at": "2019-08-24T14:15:22Z", "username": "string" } ]}Create or replace the global registry credential for a registry host and repository prefix. Every organization's pulls of an image under that prefix authenticate with it; an empty prefix covers every repository on the host. A prefixed credential takes precedence over a project's own credential for the host; a host-wide one does not. With import_only: true the credential serves only pulls of images the platform imported from Daytona v1 (the archived-sandbox import), never an organization's own pull of the same image ref — set it for a v1 registry, which holds every organization's backups. import_only absent keeps the stored value on a replace (false on a create). The password is write-only; an empty password keeps the stored one when the kind and username are unchanged. For kind: ecr with a new secret, the keys must belong to the AWS account in the host. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
application/json- body
PUT /manage/registries/global body: create or replace the credential
for (host, repository_prefix). The password is write-only.
description?string|nullhost*stringRegistry host (host[:port], no scheme/path).
import_only?booleanImport-only (v1 migration): use the credential only for pulls of
images the platform imported from Daytona v1 (archived-sandbox
imports), never for an organization's own pull of the same ref. Set
it for a Daytona v1 registry, which holds every organization's
backups. Absent on a create = false; absent on a replace KEEPS the
stored value, so a client that predates the field (a script, a stale
superadmin bundle) can never silently turn an import-only row into an
ordinary global credential every organization pulls with.
kind?stringAuth kind: one of basic, ghcr, gcr, ecr.
"basic"password?stringPassword, token, service-account JSON or AWS secret access key (max 64 KiB). Write-only. Empty keeps the stored password, allowed only when the row exists and its kind and username are unchanged.
repository_prefix?stringRepository prefix (/-separated lowercase segments); empty or absent
covers every repository on the host.
username*stringCredential replaced
application/json- response
One global credential's metadata. Never the password.
created_at*stringdate-timedescription?string|nullhost*stringNormalized registry host (Docker Hub aliases collapse to
index.docker.io).
id*stringuuidimport_only*booleanImport-only (v1 migration): the credential serves only pulls of images the platform imported from Daytona v1, never a tenant's own pull of the same ref.
kind*stringAuth kind: basic, ghcr, gcr or ecr.
repository_prefix*stringRepository prefix the credential is scoped to; empty covers every repository on the host.
updated_at*stringdate-timeusername*stringcurl -X PUT 'https://example.com/manage/registries/global' \ -H 'Content-Type: application/json' \ -d '{ "host": "string", "username": "string"}'{ "created_at": "2019-08-24T14:15:22Z", "description": "string", "host": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "import_only": true, "kind": "string", "repository_prefix": "string", "updated_at": "2019-08-24T14:15:22Z", "username": "string"}Delete a global registry credential (idempotent). New pulls stop using it; images already cached with it stay bootable for existing sandboxes. Requires the platform-operator credential (an OIDC JWT for a configured platform admin, or the internal token).
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringGlobal registry credential id
uuidCredential removed (or none existed)
curl -X DELETE 'https://example.com/manage/registries/global/497f6eca-6276-4993-bfeb-53cbbbba6f08'List the runner fleet visible to the current cell. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Runner liveness and capacity are cell-local, so callers must query the cell whose fleet they want to inspect; a standalone central deployment has no fleet and answers 501 workload_plane_elsewhere with the workload API URL to use instead.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
Runner fleet for this cell
application/json- response
runners*array<>curl -X GET 'https://example.com/manage/runners'{ "runners": [ { "admin_state": "string", "build_sha": "string", "build_time": "2019-08-24T14:15:22Z", "capacity_stale": true, "cpu_arch": "string", "cpu_serves": [ "string" ], "cpu_type": "string", "disk_class": "string", "disk_serves": [ "string" ], "id": "string", "last_seen_at": "2019-08-24T14:15:22Z", "network_class": "string", "network_serves": [ "string" ], "not_consuming": true, "orphans": 0, "public_ip": "string", "region": "string", "runner_proxy_ip": "string", "runner_proxy_port": 0, "sandbox_network_mode": "string", "sandboxes": 0, "self_cordoned": true, "status": "string", "usage": {}, "usage_source": "string", "version": "string" } ]}Get one runner and every sandbox currently recorded on it. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. Runner state is cell-local, so the request must go to the cell that owns the runner.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
Runner detail for this cell
application/json- response
admin_state*stringbuild_sha?|Full 40-hex commit the runner was built from (unknown unstamped). Null
until the runner reports it.
build_time?|When the runner was built. Null until reported, or when the reported
value is not RFC 3339 (an unstamped build reports unknown).
date-timecpu_arch*stringcpu_serves?array<string>Registry slugs the runner serves as tier fallback, as reported on its
last register/heartbeat (PLAN-CPU-CATALOG-FROM-RUNNERS.md). Empty on a
flag-off or old runner. The API always emits it; it is not required in
the schema so generated clients decode a pre-upgrade cell's response,
where the key is absent, as unset (None/undefined) rather than
failing.
cpu_type?string|nulldisk_class?string|nulldisk_serves*array<string>id*stringlast_seen_at*stringdate-timenetwork_class?string|nullnetwork_serves*array<string>not_consuming*booleanpublic_ip?string|nullrunner_proxy_ip?string|nullrunner_proxy_port?|int32sandbox_count*integer0 <= valuesandbox_network_mode?stringsandboxes*array<>self_cordoned*booleanstatus*stringusage*Runner-reported capacity/usage document. The runner owns this JSON shape.
usage_source*stringversion?|Platform version the runner binary was stamped with (PLAN-BUILD-IDENTITY.md
D9; 0.0.0-dev on an unstamped build). Null until the runner reports it.
curl -X GET 'https://example.com/manage/runners/string'{ "admin_state": "string", "build_sha": "string", "build_time": "2019-08-24T14:15:22Z", "cpu_arch": "string", "cpu_serves": [ "string" ], "cpu_type": "string", "disk_class": "string", "disk_serves": [ "string" ], "id": "string", "last_seen_at": "2019-08-24T14:15:22Z", "network_class": "string", "network_serves": [ "string" ], "not_consuming": true, "public_ip": "string", "runner_proxy_ip": "string", "runner_proxy_port": 0, "sandbox_count": 0, "sandbox_network_mode": "string", "sandboxes": [ { "cpu": 0, "created_at": "2019-08-24T14:15:22Z", "ephemeral": true, "forked": true, "id": "string", "image": null, "image_ref": "string", "mem_max_mib": 0, "mem_mib": 0, "name": "string", "persistent": true, "scratch_max_mib": 0, "scratch_mib": 0, "snapshot": null, "spot": true, "status": "string", "usage": null, "vcpus": 0, "vcpus_max": 0, "vm_ip": "string", "volumes": [ { "mount_path": "string", "subpath": "string", "volume_id": "f17547b0-76cd-4153-92b9-a7d38dac0aba" } ] } ], "self_cordoned": true, "status": "string", "usage": {}, "usage_source": "string", "version": "string"}Cordon a runner so it stops accepting new work. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The change applies only on the runner's own cell, where its heartbeats and NATS control channel live.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
Runner cordoned
application/json- response
admin_state*stringid*stringrunner_reached*booleancurl -X POST 'https://example.com/manage/runners/string/cordon'{ "admin_state": "string", "id": "string", "runner_reached": true}List one runner's NATS credentials (live and revoked; never the token or its hash). Requires an operator's own login: the internal token is refused on this route.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
The runner's credentials
application/json- response
GET …/nats-credentials body: the runner's credentials, live and revoked.
credentials*array<>curl -X GET 'https://example.com/manage/runners/string/nats-credentials'{ "credentials": [ { "created_at": "2019-08-24T14:15:22Z", "expires_at": "2019-08-24T14:15:22Z", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "last_used_at": "2019-08-24T14:15:22Z", "name": "string", "revoked_at": "2019-08-24T14:15:22Z", "runner_id": "string" } ]}Mint a NATS credential for one runner (PLAN-NATS-CLIENT-IDENTITY.md D4/D14/D15). The token is returned once and only its hash is stored; the runner presents it to the api's auth callout and receives a user JWT scoped to its own subjects. Requires an operator's own login (OIDC JWT of a configured platform admin): the internal token is refused on this route, automation mints with rlp-api nats-runner-credential mint. An empty body means the configured default lifetime; expires_at and no_expiry are mutually exclusive, and an unknown field is a 400.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
Optional mint options; an empty body is accepted
application/json- body
deny_unknown_fields: a mistyped option (expire_at, expires) must
fail loudly instead of minting a credential without the bound the
operator asked for.
expires_at?|Absolute expiry; must be in the future. Absent/null is the
configured default lifetime (30 days unless the operator changed it),
not "never".
date-timename?|Operator-facing label for the credential (free text).
no_expiry?booleanExplicitly unbounded. expires_at: null (or absent) is NOT "never":
it is the configured default lifetime.
Credential minted; token is shown only in this response
application/json- response
A freshly minted credential. The token appears here and nowhere else —
including Debug, which redacts it (a formatted mint result in a log or
a panic message must not be a reusable credential).
created_at*stringdate-timeexpires_at?|null for an explicitly unbounded credential (no_expiry).
date-timeid*stringuuidrunner_id*stringtoken*stringThe credential itself (rlpr_…), shown ONCE: only its hash is stored.
curl -X POST 'https://example.com/manage/runners/string/nats-credentials' \ -H 'Content-Type: application/json' \ -d '{}'{ "created_at": "2019-08-24T14:15:22Z", "expires_at": "2019-08-24T14:15:22Z", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "runner_id": "string", "token": "string"}Revoke EVERY live NATS credential of a runner — the decommission step. 200 with the count, also when it is zero. Requires an operator's own login: the internal token is refused on this route.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
Live credentials revoked (count may be zero)
application/json- response
DELETE …/nats-credentials body: how many live credentials were revoked
(zero is still a 200 — the end state holds either way).
ok*booleanrevoked*integer0 <= valuerunner_id*stringcurl -X DELETE 'https://example.com/manage/runners/string/nats-credentials'{ "ok": true, "revoked": 0, "runner_id": "string"}Revoke one NATS credential of a runner. A connection authenticated with it is cut the next time the callout or the bus re-evaluates it. Requires an operator's own login: the internal token is refused on this route.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
cred_id*stringcredential id
uuidCredential revoked
application/json- response
DELETE …/nats-credentials/{cred_id} body.
id*stringuuidok*booleanrevoked*booleancurl -X DELETE 'https://example.com/manage/runners/string/nats-credentials/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "ok": true, "revoked": true}Return a runner to the active scheduling state. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The change applies only on the runner's own cell, where its heartbeats and NATS control channel live.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
Runner uncordoned
application/json- response
admin_state*stringid*stringrunner_reached*booleancurl -X POST 'https://example.com/manage/runners/string/uncordon'{ "admin_state": "string", "id": "string", "runner_reached": true}Per-runner billed usage over time (hourly or daily), proxied verbatim from rlp-billing's ClickHouse export of delivered billing events. This route requires the platform-operator credential: either an OIDC JWT for a configured platform admin or the internal token; organization roles and org API keys are not accepted. The runner must exist on the addressed cell.
operatorAuthorizationBearer <token>Platform-operator credential for /manage/*: on the home/central cell this can be either an OIDC JWT of a configured platform admin or the shared internal token; workload cells admit the shared internal token only. This is distinct from organization roles, project API keys, and org API keys.
id*stringrunner id
from?stringRFC3339 window start. Default: to − 7 days. An unparseable value
takes the default, as on the sandbox usage routes.
to?stringRFC3339 window end, exclusive. Default: now. Unparseable => default.
resolution?string"h" (hourly, default) or "d" (daily). Anything else is a 400.
"h""d"Usage series as served by rlp-billing (passthrough body)
application/json- response
curl -X GET 'https://example.com/manage/runners/string/usage'{}