Catalog
AuthorizationBearer <token>Project API key (dtn_…) as a Bearer token. Mint via the management API (POST /projects/:id/api-keys) or this deployment's key-mint CLI. Every key carries an explicit set of verb:resource project permissions chosen at mint time (PLAN-API-KEY-PERMISSIONS.md); each operation lists the project permission it requires in its security requirement, and a key lacking it is answered 403 missing required project permission: <project-permission>. Some operations require an additional permission depending on the request body, stated in the operation's description. Holding a mutating verb (write:/delete:/invoke:) implies the resource's read: permission. Operations whose api_key project-permission list is empty need no specific project permission — any live project key works (the global catalogs and the artifact-cache read).
region?stringComma-separated region slugs this cell hosts runners for
(?region=a,b; tokens are trimmed, case-folded, and deduplicated).
The answer covers exactly the named regions. Absent, or present with
no non-blank token (?region=, ?region=%20,,%20): every region this
cell hosts. A slug not in the catalog (or disabled) is a 400, as are
more than 64 distinct slugs; a catalog region another cell hosts is a
409 carrying that cell's api_base_url.
Registry slugs and architectures with their per-region availability; an empty fleet is a 200 with every available false
application/json- response
GET /cpu-catalog body.
arches*array<>Always exactly two entries, amd64 then arm64.
cpu_types*array<>One entry per registry row, in GET /cpu-types order
(cpu_arch, tier, id).
regions*array<>Every region the answer covers, in catalog order.
curl -X GET 'https://example.com/cpu-catalog'{ "arches": [ { "available": true, "id": "string", "regions": [ "string" ] } ], "cpu_types": [ { "available": true, "cpu_arch": "string", "exact_regions": [ "string" ], "fallback_regions": [ "string" ], "id": "string", "name": "string", "tier": 0 } ], "regions": [ { "default_arch": "string", "default_type": "string", "id": "string" } ]}AuthorizationBearer <token>Project API key (dtn_…) as a Bearer token. Mint via the management API (POST /projects/:id/api-keys) or this deployment's key-mint CLI. Every key carries an explicit set of verb:resource project permissions chosen at mint time (PLAN-API-KEY-PERMISSIONS.md); each operation lists the project permission it requires in its security requirement, and a key lacking it is answered 403 missing required project permission: <project-permission>. Some operations require an additional permission depending on the request body, stated in the operation's description. Holding a mutating verb (write:/delete:/invoke:) implies the resource's read: permission. Operations whose api_key project-permission list is empty need no specific project permission — any live project key works (the global catalogs and the artifact-cache read).
The CPU type registry
application/json- response
[index: integer]?A cpu_types registry row, as served by GET /cpu-types.
tier (migration 0056, PLAN-HOST-CLASS-TIERS.md) is a per-arch rank
(1 = lowest). It is exposed for discovery + e2e assertions; the placement
mechanic itself lives on the runner (lazy-poll shared-durable fallback), so
no client consumes tier yet.
curl -X GET 'https://example.com/cpu-types'[ { "cpu_arch": "string", "id": "string", "name": "string", "tier": 0 }]AuthorizationBearer <token>Project API key (dtn_…) as a Bearer token. Mint via the management API (POST /projects/:id/api-keys) or this deployment's key-mint CLI. Every key carries an explicit set of verb:resource project permissions chosen at mint time (PLAN-API-KEY-PERMISSIONS.md); each operation lists the project permission it requires in its security requirement, and a key lacking it is answered 403 missing required project permission: <project-permission>. Some operations require an additional permission depending on the request body, stated in the operation's description. Holding a mutating verb (write:/delete:/invoke:) implies the resource's read: permission. Operations whose api_key project-permission list is empty need no specific project permission — any live project key works (the global catalogs and the artifact-cache read).
The disk class registry
application/json- response
[index: integer]?A class-registry row, as served by GET /network-classes and /disk-classes.
tier (migration 0056, PLAN-HOST-CLASS-TIERS.md) is a single global rank
per dimension (1 = lowest). Exposed for discovery + e2e assertions; the
placement mechanic lives on the runner, so no client consumes it yet.
curl -X GET 'https://example.com/disk-classes'[ { "id": "string", "name": "string", "tier": 0 }]AuthorizationBearer <token>Project API key (dtn_…) as a Bearer token. Mint via the management API (POST /projects/:id/api-keys) or this deployment's key-mint CLI. Every key carries an explicit set of verb:resource project permissions chosen at mint time (PLAN-API-KEY-PERMISSIONS.md); each operation lists the project permission it requires in its security requirement, and a key lacking it is answered 403 missing required project permission: <project-permission>. Some operations require an additional permission depending on the request body, stated in the operation's description. Holding a mutating verb (write:/delete:/invoke:) implies the resource's read: permission. Operations whose api_key project-permission list is empty need no specific project permission — any live project key works (the global catalogs and the artifact-cache read).
The network class registry
application/json- response
[index: integer]?A class-registry row, as served by GET /network-classes and /disk-classes.
tier (migration 0056, PLAN-HOST-CLASS-TIERS.md) is a single global rank
per dimension (1 = lowest). Exposed for discovery + e2e assertions; the
placement mechanic lives on the runner, so no client consumes it yet.
curl -X GET 'https://example.com/network-classes'[ { "id": "string", "name": "string", "tier": 0 }]