PLANNING to a terminal state. Beyond CRUD, the API exposes lifecycle actions — start, restart, resume, and clone — plus task management, mission checkpoints, and workspace-wide metrics.
All mission endpoints require authentication and workspace context.
Endpoints
Missions
Create, read, update, and delete missions. Write operations requireOWNER, ADMIN, or MANAGER role.
List All Missions (Workspace)
Response:
200 OK
tasks array is only included when include_tasks=true; it is omitted from the default list response.
List Crew Missions
Response:
200 OK — array of mission objects with task_stats.
Create Mission
OWNER, ADMIN, or MANAGER role
Request Body:
LEAD role.
Response: 201 Created — mission object with status PLANNING.
WebSocket events:
mission.created on crew:{crewId}, mission.updated on workspace:{workspaceId}
Get Mission
200 OK
Update Mission
OWNER, ADMIN, or MANAGER role
Request Body: All fields optional.
Status Transitions:
When status changes to
COMPLETED, FAILED, or CANCELLED, completed_at is automatically set.
Response: 200 OK — updated mission object.
Delete Mission
crewId and missionId are required path parameters; workspace_id selects the workspace. No request body.
Auth: OWNER, ADMIN, or MANAGER role
Response: 204 No Content
Lifecycle Actions
Drive a mission through execution: start a planned mission, or restart, resume, and clone existing ones. All requireOWNER, ADMIN, or MANAGER role.
Start Mission
PLANNING mission to IN_PROGRESS and starts the MissionEngine.
Validates the task dependency DAG before starting. Uses atomic compare-and-swap to prevent concurrent start races.
Auth: OWNER, ADMIN, or MANAGER role
Response: 200 OK
Restart Mission
COMPLETED, FAILED, or CANCELLED mission. Resets non-COMPLETED tasks (PENDING if dependencies allow, BLOCKED otherwise), increments their iteration, clears errors, and moves the mission back to PLANNING (call start afterwards to dispatch). (internal/api/task_state.go:14)
Request: crewId and missionId are required path parameters; workspace_id selects the workspace. No request body.
Auth: OWNER, ADMIN, or MANAGER role
Response: 200 OK
Resume Mission
FAILED mission from the point of failure. The handler atomically claims the mission into RESUMING, resets the FAILED/AWAITING_APPROVAL tasks plus their downstream dependents, validates the DAG, and re-engages the MissionEngine. COMPLETED tasks are preserved. (internal/api/task_state.go:103)
Request: crewId and missionId are required path parameters; workspace_id selects the workspace. No request body.
Auth: OWNER, ADMIN, or MANAGER role
Response: 200 OK
Clone Mission
PLANNING/PENDING (or BLOCKED if the cloned task carries dependencies).
Request: crewId and missionId are required path parameters; workspace_id selects the workspace. No request body.
Auth: OWNER, ADMIN, or MANAGER role
Response: 201 Created
GET /api/v1/crews/{crewId}/missions/{newId} for the full mission object (internal/api/task_state.go:472).
Tasks
Add and update the individual tasks that make up a mission’s work breakdown.Create Task
OWNER, ADMIN, or MANAGER role
Request Body: (internal/api/task_handler.go:42)
Tasks can only be added to missions in
PLANNING or IN_PROGRESS state. If any dependency task is not COMPLETED, the new task is created with status BLOCKED; otherwise PENDING.
Response: 201 Created
Update Task
OWNER, ADMIN, or MANAGER). Request: crewId, missionId, and taskId path parameters, optional workspace_id, and a JSON body containing any of the optional fields below. Response: the updated task object. Statuses: 200 OK; 400 for an invalid transition or body, 403 for insufficient role, 404 when the mission or task is not in the workspace, and 500 for a persistence failure.
Request Body: All fields optional. (internal/api/task_handler.go:160 — updateTaskRequest)
status and depends_on cannot be set in the same request — the handler returns 400 with “Cannot update status and depends_on in the same request” (internal/api/task_handler.go:382). task_order and approval_required are not currently mutable through this endpoint.
Task Status Transitions:
Response:
200 OK
Checkpoints
Cartographer checkpoints bookmark a mission’s journal cursor and state snapshot for the timeline UI. Cartographer checkpoints capture a mission’s journal cursor plus a state snapshot (agent-memory hashes, pending tasks, open assignments, crew container id) so the timeline UI can offer “list bookmarks” and (advisory) “restore/fork from here” affordances. The full restore/fork/get/delete surface is documented on the Checkpoints page; the two endpoints below are mission-scoped and live here for convenience. (internal/api/cartographer_handler.go)
List Mission Checkpoints
404 shape as “mission not found” so existence isn’t leaked.
Query Parameters:
Response:
200 OK
Create Mission Checkpoint
internal/api/cartographer_handler.go:91)
Request Body: (optional)
201 Created — full checkpoint object (same shape as the List array entries above). When the row was committed but the immediate re-read failed, the response degrades to { "id": "chk_..." } so the client can still navigate to it.
Metrics
Workspace-wide aggregates for dashboards.Mission Metrics
workspace_id query parameter; no body. Response: JSON aggregate metrics object. Statuses: 200 OK; 400 for missing or invalid workspace context, 401 when unauthenticated, and 500 for an aggregation failure.
Aggregated mission metrics for the workspace. total_missions and active_missions are lifetime counts; the *_24h fields cover the trailing 24 hours.
Response: 200 OK