Every route below requires authentication and workspace context. The Guide runs
in a reserved system crew (
_crewship-setup) that is hidden from the fleet and
may not own any resources it builds — see the routine and page surfaces for how
authorship is delegated to the crew a person actually created.Endpoints
Endpoint contract
Each endpoint identifies Auth, Request, Response, and Status. Requests and responses are JSON. The shared failures are401 unauthenticated,
403 unauthorized or cross-workspace, 400 invalid input, 404 missing or
invisible proposal, 409 a crew slug already in use, and 500 an unexpected
handler or database failure.
Auth: A session or CLI token plus workspace membership. Apply runs under the
calling human’s own session — that is what makes it the approval step rather
than a continuation of the agent’s turn.
Request: JSON. Agent-supplied fields are limited to names and roles;
system prompts, tool profiles, adapters and permissions are always derived
server-side and can never be set through these routes.
Response: The stored proposal, including its resolved roster, or the apply
result naming the crew that was created.
Status: 201 for create and apply, 200 for reads, 400 invalid input,
403 cross-workspace, 404 unknown proposal, 409 slug conflict.
Start the setup agent
201 Created
201 created or already present, 401 unauthenticated, 403 no
workspace membership, 500 the Guide could not be provisioned.
Create a proposal
Supply
agents, template_slug, or both. A bespoke crew with no matching
builtin is a first-class case, not a malformed request. When both are given the
named roster wins and the template supplies the remaining crew metadata.name and role are trusted from an agent-authored roster. Each agent’s
system prompt is composed by the server from those two fields; agent-authored
prompt text never reaches a container.
Response: 201 Created — the stored proposal, with status: "PENDING" and
the resolved roster under payload.agents.
201 stored, 400 missing crew_name or neither roster source,
401 unauthenticated, 403 no membership, 500 storage failure.
Get a proposal
404, not 403 — its existence is
not disclosed.
Request: no body. id is the path parameter.
Response: 200 OK — the same shape as create, with status one of
PENDING or APPLIED and applied_crew_id set once applied.
Status: 200 found, 401 unauthenticated, 404 unknown or invisible.
Apply a proposal
already_applied: true rather than creating a second crew, so a double-click
or a retried request is harmless.
Auth: Session or CLI token + membership. Runs under the caller’s identity;
the crew is owned by the human who approved it, never by the Guide.
Request body: none.
Response: 201 Created
201 applied (or already applied), 401 unauthenticated, 403
cross-workspace, 404 unknown proposal, 409 the crew slug is already taken,
500 the crew could not be created.
CLI
Every route here has a CLI counterpart — seecrewship onboarding.