Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Control-plane HTTP API

The control-plane API is the transport the CLI speaks to a server. Most operators never call it directly — the boatramp subcommands wrap it — but it is a stable, documented surface for building your own tooling. This page lists the endpoints; the CLI reference maps each command onto them.

Conventions

  • Base path. Every control-plane endpoint is under /api. Public serving (host-routed content, /_sites/*, /healthz) is a separate, unauthenticated surface.
  • Authentication. A bearer token in Authorization: Bearer <token>. Every /api/* request is authenticated and authorized, except the handful gated by their own single-use credential (bootstrap, join, OIDC exchange). The exact right each endpoint requires is in the request-to-right mapping.
  • Bodies. Requests and responses are JSON, except blob upload (raw bytes) and /api/metrics (Prometheus text).
  • Errors. A non-2xx status carries a JSON { "error": "..." }. 401 is a missing or invalid token; 403 is a valid token without the required right.

Projects

A project owns sites, functions, and compute, and is the tenant boundary. Since 0.2.0 every site/function/compute/workflow endpoint has a project-scoped counterpart under /api/projects/:project/…; the legacy top-level paths (/api/sites/…, /api/functions/…, /api/compute/…, /api/workflows/…) target the reserved default project and stay byte-identical to pre-0.2.0.

MethodPathPurpose
GET/api/projectsList projects.
POST/api/projectsCreate a project.
GET/api/projects/:projectGet one project’s record.
DELETE/api/projects/:projectDelete an empty project (refused while it owns resources or is default).
any/api/projects/:project/sites/…Per-project site endpoints — the same shapes as Sites & deployments, scoped to the project.
any/api/projects/:project/{functions,compute,workflows,graphql}/…Per-project function / compute / workflow / GraphQL-admin endpoints, scoped to the project.

Sites & deployments

The paths below target the default project; the /api/projects/:project/sites/… counterparts are identical but scoped to :project.

MethodPathPurpose
GET/api/sitesList sites.
POST/api/sites/:site/deploymentsCreate a deployment from a manifest.
GET/api/sites/:site/deploymentsList a site’s deployments.
GET/api/sites/:site/deployments/:idGet one deployment.
POST/api/sites/:site/deployments/:id/activateMake a deployment the live one.
GET/api/sites/:site/currentThe currently active deployment.
GET/PUT/api/sites/:site/configRead / replace the site config.
GET/PUT/DELETE/api/sites/:site/aliases/:nameManage named aliases.
GET/api/sites/:site/aliasesList aliases.

Blobs

MethodPathPurpose
PUT/api/blobs/:hashUpload a content-addressed blob (raw body; the server verifies the hash).

Domains

MethodPathPurpose
GET/POST/DELETE/api/sites/:site/domains/:host/verificationManage a domain-ownership challenge.
POST/api/sites/:site/domains/:host/verification/checkCheck the challenge.
GET/api/sites/:site/domain-verificationsList pending verifications.

Tokens

MethodPathPurpose
POST/GET/api/tokensMint / list tokens.
DELETE/api/tokens/:idRevoke a token by its id.
POST/api/tokens/bootstrapMint the first admin token with the single-use bootstrap secret.
GET/api/auth/whoamiThe presented token’s own roles.
POST/api/auth/exchangeExchange an OIDC JWT for a short-TTL token (oidc feature).

Cluster

MethodPathPurpose
POST/api/cluster/join-tokenMint a single-use bearer mesh join token (admin).
POST/api/cluster/joinAdmit a joining node (gated by the join token in the body + a possession proof, not admin RBAC).
GET/api/cluster/membersList the Raft membership (node, voter, caught-up, leader, address).
POST/api/cluster/promotePromote a caught-up learner to a voter (leader-only).
POST/api/cluster/rotate-keyRotate this node’s mesh key (make-before-break).
POST/api/cluster/revokeRevoke a node from the mesh (durable tombstone + drop from quorum).

See Deploy a self-hosted cluster and Run on Kubernetes.

Root anchors

Make-before-break root-key rotation (auth rotate-root). Admin-scoped.

MethodPathPurpose
GET/api/auth/rootList the extra trusted root anchors.
PUT/api/auth/rootTrust a new root anchor ({ "pubkey": "alg:hex" }).
DELETE/api/auth/root/:pubkeyRetire a root anchor.

See Migrate the root key.

Certificates & cache

MethodPathPurpose
GET/api/certsTLS certificate status.
POST/api/cache/invalidateInvalidate cached responses.

Operations

MethodPathPurpose
GET/POST/api/pruneReport / delete unreferenced deployments.
POST/api/scrubDelete unreferenced blobs.
GET/api/metricsPrometheus exposition (always available).
GET/PUT/api/authz/policyRead / replace the RBAC policy.

Functions & workflows

Top-level (default-project) function and workflow endpoints; the /api/projects/:project/… counterparts scope to another project.

MethodPathPurpose
GET/api/functionsList functions.
GET/PUT/DELETE/api/functions/:nameManage one function (its current version).
POST/api/functions/:name/versionsDeploy a new function version.
POST/api/functions/:name/rollbackRoll back to a prior version.
PUT/DELETE/api/functions/:name/aliases/:labelManage a version alias.
POST/api/functions/:name/invokeInvoke synchronously / async / scheduled.
GET/api/functions/:name/invocations/:idGet an async invocation record.
GET/POST/DELETE/api/functions/:name/triggers[/:id]Manage event triggers (webhook/queue/cron/blob).
GET/api/functions/:name/usageMetering / quota counters.
GET/PUT/DELETE/api/workflows/:nameManage a declarative workflow.
GET/api/workflows/:name/runs[/:id]List / get workflow runs.

Compute

Top-level paths target the default project; /api/projects/:project/compute/… scopes to another project.

MethodPathPurpose
GET/api/computeList compute workloads.
GET/PUT/DELETE/api/compute/:nameManage one workload.

Requires KVM on the serving host; the control-plane surface is uniform whether or not execution is available. See Run compute workloads.

GraphQL

The subgraph registry, the operation safelist, and the composed supergraph — a project-owned surface. Top-level paths target the default project; /api/projects/:project/graphql/… scopes to another project. See Serve a GraphQL API.

MethodPathPurpose
PUT/DELETE/api/graphql/subgraphs/:nameRegister (SDL body) / unregister a subgraph; a publish recomposes and is rejected if it doesn’t compose.
PUT/api/graphql/subgraphs/:name/sqlRegister a SQL-backed subgraph by introspecting a site’s managed database.
PUT/api/graphql/subgraphs/:name/functionRegister a function-backed subgraph by introspecting its _service { sdl }.
GET/api/graphql/supergraphThe composed supergraph (subgraphs, @key entities, root fields).
POST/GET/api/graphql/safelistRegister a trusted operation (returns its hash) / list the safelist.
DELETE/api/graphql/safelist/:hashRemove an operation from the safelist.

A function that self-declares a subgraph auto-registers on deploy; pass ?register_subgraph=false to PUT /api/functions/:name to opt a deploy out. See Federation.

Per-site observability

Present with the handlers feature.

MethodPathPurpose
GET/api/sites/:site/_boatramp/handlersPer-handler operator stats.
GET/api/sites/:site/_boatramp/logsCaptured guest logs.
GET/api/sites/:site/_boatramp/logs/streamStream logs (SSE).
POST/api/sites/:site/_boatramp/dlqDead-letter-queue operations.

See Observe a running server.

Agent (MCP)

MethodPathPurpose
POST/GET/DELETE/mcpModel Context Protocol endpoint (streamable-http), for driving this node from an AI agent.

Unlike /api/*, /mcp is gated only by a valid plain bearer (not a specific right): each MCP tool call is separately re-authorized in-process against the forwarded token’s scope. On by default; toggle with mcp.enabled (daemon config). cnf/DPoP tokens are rejected — use a plain bearer or the stdio transport.

Public (unauthenticated) endpoints

Never token-authenticated. Visitor access control (basic auth / IP rules / rate limit) is applied per-site inside the serving handlers.

MethodPathPurpose
GET/healthzLiveness.
GET/readyzReadiness.
any/ (host-routed)Serve site content, selected by Host — see How a request reaches your site.
any/_sites/<name>/*Serve a site by name (admin/testing).
GET/_deploy/*Serve a deployment by id (an unguessable content-hash capability).