Skip to Content
Web ClientHTTP API

HTTP API

The server exposes auth routes under /auth/* and a JSON/SSE API under /api/*. Endpoints marked SSE stream text/event-stream frames; the rest are JSON. “Auth” is public (no login), login (any signed-in user; others get redirected or 401), or admin. Routes that operate on a specific job, session, or schedule additionally check ownership — non-owners get 404, admins bypass it. A bundled openapi.yaml (viewable at /openapi/) describes the same surface.

Auth — /auth/*

MethodPathAuthPurpose
GET/auth/googlepublicBegin Google OAuth (only when enabled).
GET/auth/google/callbackpublicOAuth callback → redirect to profile (or login on failure).
POST/auth/loginpublicLocal email/password login.
GET/auth/logoutpublicLog out, redirect to landing.
GET/auth/mepublicCurrent user profile JSON, or null.
GET/auth/google-enabledpublic{ enabled: boolean } — whether Google sign-in is configured.

Sessions — /api/session/*

MethodPathAuthPurpose
POST/api/session/createloginCreate a chat session for a preset agent (optional modelSpec, sessionName).
POST/api/session/newUserMessage/:idloginSSE — send a message and stream the agent’s reply.
GET/api/session/replay/:sessionNameloginSSE — replay a past session from its JSONL log.
GET/api/session/namesloginList the user’s saved session names.
GET/api/session/get/:idloginSession metadata (live or from a stored handle).
POST/api/session/delete/:idloginClose a live session.
DELETE/api/session/byName/:sessionNameloginDelete a saved session (history + log).

A chat turn streams chunk frames (one per agent step) followed by a terminating done frame; replay re-frames a stored log into the same user_messagechunkfinal_result shape so the browser renderer is identical for live and historical conversations.

Models — /api/models

MethodPathAuthPurpose
GET/api/modelsloginDynamic list of selectable models — curated OpenAI models (when OPENAI_API_KEY is set) plus any loaded LMStudio models, cached briefly.

Jobs — /api/jobs/*

MethodPathAuthPurpose
GET/api/jobsloginList board jobs (?status=, ?mine=); non-admins are scoped to their own.
POST/api/jobsloginInstantiate a template and commit a crew (?scheduledAt).
GET/api/jobs/:jobIdowner/adminJob detail (job, runs, events, comments, parent results).
GET/api/jobs/:jobId/streamowner/adminSSE — tail the latest run’s session log live.
GET/api/jobs/:jobId/graphowner/adminThe job’s whole crew, dependency-ordered.
GET/api/jobs/:jobId/artifactowner/adminStream the latest run’s saved file (?download=1, ?format=html).
POST/api/jobs/:jobId/commentsowner/adminAdd a comment.
POST/api/jobs/:jobId/unblockowner/adminMove a blocked job back to ready.
POST/api/jobs/:jobId/redoowner/adminRe-queue a done/blocked job with feedback.
POST/api/jobs/:jobId/archiveowner/adminSoft-delete (status → archived).
DELETE/api/jobs/:jobIdowner/adminDelete a job (not while running).
POST/api/jobs/clearadminWipe the board (or one status column).

Dispatcher — /api/dispatcher/*

MethodPathAuthPurpose
GET/api/dispatcher/statusloginRead-only dispatcher liveness from the board heartbeat.

Templates — /api/templates

MethodPathAuthPurpose
GET/api/templatesloginList discovered *.job_workflow.yaml (id, name, description, inputs).

Schedules — /api/schedules/*

MethodPathAuthPurpose
GET/api/schedulesloginList schedules (?mine=).
POST/api/schedulesloginCreate a schedule (template + inputs + rule + timezone).
GET/api/schedules/:idowner/adminOne schedule.
GET/api/schedules/:id/jobsowner/adminJobs spawned by this schedule.
PATCH/api/schedules/:idowner/adminEdit name / inputs / rule / timezone.
POST/api/schedules/:id/enableowner/adminResume; recompute next run.
POST/api/schedules/:id/disableowner/adminPause; clear next run.
POST/api/schedules/:id/run-nowowner/adminSpawn a crew immediately.
DELETE/api/schedules/:idowner/adminDelete the schedule (spawned jobs are kept).
Last updated on