Every endpoint in Enoch is served by the FastAPI application running on the control VM (default portDocumentation Index
Fetch the complete documentation index at: https://solo-09d10f60.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
8787) and the worker (also port 8787). All endpoints except root GET /healthz, GET /dashboard, and GET /control/dashboard require a bearer token. The control-plane health endpoint is GET /control/health and does require authentication. The two dashboard HTML endpoints are unauthenticated for the initial page load; the dashboard itself prompts for a bearer token and stores it in localStorage for subsequent API calls. Read the Authentication section below before making your first request.
This page maps the main endpoint groups present in the local source snapshot. It is not a generated OpenAPI reference; verify request and response models against the code before building clients.
Authentication
Authentication
Authentication
Unauthenticated routes include Pass the token in every request:The dashboard also accepts the token as a
GET /healthz, GET /dashboard, and GET /favicon.ico. Dashboard data APIs and most control-plane routes require a bearer token or an explicit token bootstrap path where the dashboard code supports it.?token= URL query parameter on first load, after which it is stored in localStorage.Health & Status
Health & Status
GET /healthz
No authentication required. Returns a minimal app-level liveness check. Use authenticated GET /control/health when you need the control-plane database path and control-plane service timestamp.GET /control/health
Requires bearer authentication. Returns control-plane health and the configured SQLite database path.GET /control/api/status
Returns the full dispatch safety and queue state aggregated from the control-plane database. Add ?refresh_worker=true to trigger a fresh worker preflight before responding.| Field | Description |
|---|---|
dispatch_safe | true when no blockers exist and no critical conflicts are present |
dispatch_blockers | List of human-readable blocker strings |
flags.queue_paused | true when the queue is paused |
flags.maintenance_mode | true when maintenance mode is active |
counts | Per-status item counts plus papers and queue_total |
active_items | Queue rows currently in an active dispatch/run state |
source_freshness | Staleness of each evidence source |
warnings / conflicts | Structured findings with severity, source, and suggested actions |
GET /control/api/queue-health
Returns queue health with worker freshness details, active run detail, latest alert check results, and recent worker callbacks. Add ?refresh_worker=true to refresh the worker preflight observation first.Queue Operations
Queue Operations
GET /control/api/queues/{queue}
Returns a paginated list of queue rows filtered to one logical queue group.queue value | Description |
|---|---|
active | Items in dispatching, running, awaiting_wake, wake_received, or reconciling status |
queued | Items waiting to be dispatched |
blocked | Items in blocked, needs_review, or dispatch_error status, or any item with manual_review_required set |
paused | Items in paused status |
completed | Items in completed or canceled status |
all | All rows regardless of status |
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number (≥ 1) |
page_size | 50 | Rows per page (1–500) |
search | "" | Full-text filter across all string fields |
status | "" | Exact QueueStatus value filter |
sort | dispatch_priority | Sort column; prefix with - for descending (e.g. -updated_at) |
POST /control/dispatch-next
Selects and dispatches the next eligible candidate from the queue. Always use dry_run: true first to verify the candidate before committing a live dispatch.DispatchNextRequest):action values: "paused", "noop", "dry_run_dispatch", "live_dispatch", "dispatch_blocked".POST /control/api/preflight
Runs an explicit worker preflight check without committing a dispatch. Use this to verify worker connectivity, bearer token validity, and GPU/memory headroom before live dispatch.WorkerPreflightRequest):WorkerPreflightResponse):Project Operations
Project Operations
GET /control/api/projects/{project_id}
Returns project detail aggregating the project record, current queue item, all run records, associated papers, recent events, and cached worker observations.404 if neither a project record nor a queue item is found for {project_id}.Paper Operations
Paper Operations
GET /control/api/papers
Returns the full paper queue as a paginated list.Query parameters:| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
page_size | 50 | Rows per page (1–500) |
search | "" | Full-text filter |
status | "" | Exact paper_status filter |
sort | -updated_at | Sort column; prefix with - for descending (e.g. paper_status) |
GET /control/api/paper-reviews
Returns the publication review queue sorted by rank_score descending by default.Query parameters:| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
page_size | 50 | Rows per page (1–500) |
search | "" | Full-text filter |
review_status | "" | One of triage_ready, unreviewed, in_review, changes_requested, blocked, approved_for_finalization, finalized, rejected |
paper_status | "" | One of eligible, draft_generating, draft_review, publication_generating, publication_draft, human_review_required, archived |
include_rank_reasons | true | Include per-item rank reason arrays |
sort | -rank_score | Sort column; prefix with - for descending (e.g. rank_score) |
GET /control/api/paper-reviews/next
Returns the highest-ranked paper review detail item matching the given filters. Defaults to paper_status=publication_draft, excluding finalized and rejected items.404 if no matching item exists.POST /control/api/paper-reviews/{paper_id}/rewrite-draft
Rewrites the paper draft artifacts for the given paper using the configured AI writer (e.g. GLM-5.1 via Synthetic.new). If paper_evidence_sync_enabled is true, the control plane syncs evidence from the worker before rewriting.PaperReviewRewriteDraftRequest):POST /control/api/paper-reviews/rewrite-batch
Rewrites up to limit papers in a single synchronous batch call. The request stays open until all papers are processed; a 10-paper batch may take several minutes.PaperReviewBulkRewriteRequest):limit is capped at 200 by the model, but the dashboard uses a default of 10. Set dry_run: true to preview which papers would be selected without triggering any rewrites.POST /control/api/paper-reviews/{paper_id}/prepare-finalization-package
Assembles the finalization package for an approved paper review. Use dry_run: true to preview the package manifest without writing the package. Use only after the review checklist and approval gates have passed.POST /control/api/paper-reviews/{paper_id}/approve-finalization
Marks a paper as approved for finalization. Requires idempotency_key and requested_by.POST /control/api/paper-reviews/{paper_id}/status
Updates the review_status for a paper review item.review_status values: unreviewed, triage_ready, in_review, changes_requested, blocked, approved_for_finalization, finalized, rejected.POST /control/api/paper-reviews/{paper_id}/checklist/{item_id}
Updates the status of a single checklist item for a paper review.status values: pending, pass, fail, accepted_risk, not_applicable.Events & Audit
Events & Audit
GET /control/api/events
Returns the append-only audit event log. Supports filtering by entity_type, entity_id, event_type, and full-text search.| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
page_size | 100 | Rows per page (1–500) |
entity_type | "" | Filter by entity type (e.g. paper_review) |
entity_id | "" | Filter by entity ID |
event_type | "" | Filter by event type (e.g. paper_review.draft_rewritten) |
search | "" | Full-text filter |
GET /control/api/intake/notion
Returns the latest Notion intake sync observation, the current queued-project projection, skipped-row reason counts, and recent intake events.Wake Gate (Worker)
Wake Gate (Worker)
These endpoints are served by the worker process and are called by the agent runtime and by the control plane during live dispatch.
Receives OMX/Codex lifecycle events from the agent runtime. The wake gate uses these events to track process state and determine when a quiet window has been reached.Request body (Valid
Prepares the project workspace on the worker before dispatch. Called automatically by the control plane’s live dispatch path.
Dispatches an agent run to the worker. Called automatically by the control plane’s live dispatch path after a successful prepare.Valid
POST /omx/event
Receives OMX/Codex lifecycle events from the agent runtime. The wake gate uses these events to track process state and determine when a quiet window has been reached.OmxEvent) key fields:event values: session-start, session-idle, session-stop, session-end, ask-user-question.POST /prepare-project
Prepares the project workspace on the worker before dispatch. Called automatically by the control plane’s live dispatch path.POST /dispatch
Dispatches an agent run to the worker. Called automatically by the control plane’s live dispatch path after a successful prepare.mode values: exec, resume. Valid reasoning_effort values: low, medium, high, xhigh.Dashboard
Dashboard
GET /dashboard
Returns the browser-based Enoch Control Status Dashboard as an HTML page. No authentication is required to load the page; the dashboard prompts for a bearer token and stores it in localStorage.GET /dashboard/api
Returns the full dashboard snapshot as JSON. Used by the worker dashboard for polling.Query parameters:| Parameter | Default | Description |
|---|---|---|
limit | — | Maximum run rows to include |
event_limit | — | Maximum event rows to include |
Enoch Core
Enoch Core
Enoch Core endpoints are prefixed
Returns the current Enoch Core mode and database path.Response (Valid
Ingests a queue snapshot from any compatible source. The Response (
Returns the queue projection computed from the latest ingested snapshot.Response (
/enoch-core and all require authentication.GET /enoch-core/health
Returns the current Enoch Core mode and database path.HealthResponse):mode values: off, shadow, compare, enforce.POST /enoch-core/snapshots/n8n-queue
Ingests a queue snapshot from any compatible source. The idempotency_key is required; the same key with the same payload is accepted idempotently, but the same key with a different payload returns 409.SnapshotIngestResponse):GET /enoch-core/projections/queue
Returns the queue projection computed from the latest ingested snapshot.QueueProjection) key fields: