REST endpoints
Envelope
Section titled “Envelope”Every response:
{ "success": true, "data": <T>, "error": { "code": "...", "message": "..." }, "meta": { "pagination": { "nextCursor": "..." } }}success: false always has a populated error. data is absent on
errors.
Projects
Section titled “Projects”GET /api/projects List all projects (tenant-scoped)POST /api/projects Create a projectGET /api/projects/:id Fetch onePATCH /api/projects/:id Partial updateDELETE /api/projects/:id Delete (must be empty)Meetings + transcripts
Section titled “Meetings + transcripts”POST /api/meetings Create a meeting (upload / paste)POST /api/meetings/:id/transcribe Re-run WhisperGET /api/meetings ListGET /api/meetings/:id Fetch onePOST /api/meetings/:id/transcript Replace transcript (edit)Briefs (PRDs)
Section titled “Briefs (PRDs)”GET /api/prds ListPOST /api/prds Create (manual; normally generated)POST /api/meetings/:id/generate-brief Chief-of-staff drafts from meetingGET /api/prds/:id Fetch onePOST /api/prds/:id/approve Approve → triggers plan decompositionPOST /api/prds/:id/redirect Redirect with reasonPOST /api/prds/:id/pause Pause; can resume laterPOST /api/prds/:id/regenerate New draft, same transcriptTickets + plans
Section titled “Tickets + plans”GET /api/tickets List (paginated)GET /api/tickets/:id Fetch onePOST /api/tickets/:id/claim Agent claim (agent-token auth)POST /api/tickets/:id/comment Append a commentPOST /api/tickets/:id/transition Move statusGET /api/plans/:ticketId All plans for a ticket (inc. superseded)POST /api/plans/:id/replan Manual replan with a reasonProject graph
Section titled “Project graph”POST /api/project-graph/:projectId/build Build / refreshGET /api/project-graph/:projectId SummaryGET /api/project-graph/:projectId/god-nodes?limit=N Top symbols by degreeGET /api/project-graph/:projectId/callers/:symbol Incoming callsGET /api/project-graph/:projectId/path?from=X&to=Y Shortest pathGET /api/project-graph/:projectId/community/:symbol Louvain cluster membersApprovals + activity
Section titled “Approvals + activity”GET /api/approvals List recent approvalsGET /api/audit Audit log (paginated)GET /api/activity Human-readable activity feedLibrary (skills + subagents + plans)
Section titled “Library (skills + subagents + plans)”GET /api/library/skillsGET /api/library/skills/:slugGET /api/library/subagentsGET /api/library/subagents/:slugGET /api/library/plans Recent plans with staleness flagsGET /api/library/plans/:ticketId All plans for a ticketIntegrations
Section titled “Integrations”GET /api/integrations List connectionsPOST /api/integrations/:name/connect Connect (per-integration shape)POST /api/integrations/:name/disconnectPOST /api/integrations/:name/test Run a test callAgents
Section titled “Agents”GET /api/agents List connected agentsPOST /api/agents/tokens Create an agent tokenDELETE /api/agents/tokens/:id Revoke a tokenGET /api/agents/jobs Recent agent jobsNotifications
Section titled “Notifications”GET /api/notifications Recent notificationsPOST /api/notifications/:id/ack Mark as readGET /api/notifications/subscriptionsPOST /api/notifications/subscriptionsSettings + admin
Section titled “Settings + admin”GET /api/settings Workspace settingsPATCH /api/settings Partial updateGET /api/settings/roles Role definitionsPATCH /api/settings/roles/:slug Edit role prompt / budgetGET /api/team Team membersPOST /api/team/invite Invite a userSetup wizard
Section titled “Setup wizard”GET /api/setup/status Wizard statePOST /api/setup/complete Mark wizard doneWebhooks (inbound — from external systems)
Section titled “Webhooks (inbound — from external systems)”POST /api/webhooks/slack Slack interactivity + eventsPOST /api/webhooks/twilio Voice inboundPOST /api/webhooks/github Push eventsPOST /api/webhooks/jira Issue eventsPOST /api/webhooks/google-drive Watch channel updatesPOST /api/voice/incoming Twilio voice (legacy path; same handler)All verify signatures. Never hit directly without valid payload.
Health
Section titled “Health”GET /api/health Full dep healthGET /api/health/live Process livenessGET /api/health/ready Readiness (false during migrations)GET /metrics Prometheus (gated)Pagination
Section titled “Pagination”Cursor-based. Responses include meta.pagination.nextCursor when
more results exist. Pass it as ?cursor=<value> on the next call.
Default page size: 50. Max: 200.
Filters
Section titled “Filters”List endpoints accept common filters:
?projectId=…?status=…?since=<iso>?until=<iso>?actor=<email>(audit only)
OpenAPI
Section titled “OpenAPI”A generated OpenAPI spec lives at backend/openapi.yaml. Re-generate
via npm run openapi:generate. Import into Postman / Insomnia to get
typed clients.