Skip to content

Latest commit

 

History

History
740 lines (684 loc) · 104 KB

api-reference.md

File metadata and controls

740 lines (684 loc) · 104 KB

Dashboard REST API reference

Pragmatic v1 endpoint index compiled by hand from route registrations in src/pkg/dashboard/*.go and src/pkg/hub/*.go (tests excluded). There is no generator; update this page in the same change that adds or renames a route. It lists method, path, coarse auth level, and one-line purpose. Request/response schemas are intentionally not hand-written here; see the handler source for exact payloads and validation.

Auth levels are derived from dashboard middleware (isPublicPath, dashboard token/session auth, and the /api/v1 GitHub-token wrapper) or from hub route wrappers such as requireAuth (rows marked Hub auth) and requireAdmin (rows marked Hub admin). Hub rows marked handler-specific have no dashboard middleware; check the named handler for bearer secrets, admin checks, or public behavior.

Health, status, events

Method Path Auth Purpose Source
GET /api/version Dashboard auth/session Build/version metadata; includes upgradeMarker (target, current, attempts, maxAttempts, failed, requestedAt, lastError) while a self-upgrade is in flight or has failed (#6765), the hub-delivered upgradePolicy (hub_managed, spoke_managed, schedule, schedule_hour, schedule_timezone, schedule_weekday, paused, branch, channel, target_sha, target_resolved, armed_target, and next_update_at — the hub's RFC3339 ETA for the next promotion into the stable channel, omitted when unknown (#10256)) when available, and an autoUpdate object (enabled, state — one of disabled/up_to_date/behind/retrying/failed/unknown — healthy, period, targetBranch, targetCommit, currentCommit, commitsBehind, lastAttemptAt, lastError, detail, and nextUpdateAt — the hub's RFC3339 ETA for the next update, omitted when unknown, disabled or paused (#10257)) that never reports a failed or unknown update as healthy (#6962, #6963) pkg/dashboard/api.go:37
GET /api/version/release-notes Dashboard auth/session Changelog gap between two revisions: ?from=<sha>&to=<channel-branch-tag-or-sha> returns {from:{sha,version?}, to:{sha,ref,version?}, sections:[{version,date,categories:{added,changed,fixed,security,deprecated}}], unreleased?, truncated, source, error?} — the CHANGELOG.md release sections present at to and absent at from, newest first, plus (when to is not a release tag) the changelog.d/ fragments new at to under an Unreleased (in this build) section. Fetch failures return source: "unavailable" with error rather than an error status; results are cached per (from, to) for an hour (#11065) pkg/dashboard/api.go:38
POST /api/release-channel Owner only Hosted spoke self-service release-channel selector; relays stable/candidate/edge to the hub's existing switch-branch endpoint with the spoke dashboard-token proof, and reports the requested channel as pending until the Deployment image lands pkg/dashboard/api.go:59
GET /api/health Public Basic health probe pkg/dashboard/server.go:1334
GET /api/health/deep Public Deep health probe pkg/dashboard/server.go:1335
GET /api/livez Public Kubernetes liveness probe pkg/dashboard/server.go:1336
GET /metrics Registered only when HIVE_METRICS_ENABLED; requires `Authorization: ****** (403 if the token is unset) Prometheus metrics pkg/dashboard/server.go:1342
GET /api/status Dashboard auth/session Dashboard aggregate status; labelPresets[] ({key,label,description,labels[],states[]}) lists the built-in label-filter presets for the Projects cards, led by needs-human whose labels[] are the effective hard-suppress labels plus needs-signal and the hold labels (#12172); accepts ?fields=a,b for top-level selection and ?omit=repos to drop heavy sections, and honors Accept-Encoding: gzip; agents[] includes busy-pane visibility fields (kicksUndeliverable, busySince, lastTranscriptActivity, condition, conditionMessage) when a Working pane cannot accept kicks; sla (fleet) and repos[].sla (per repo) carry the Delivery SLA block derived from the lifecycle timeline with no extra GitHub calls: windows.{7d,30d}.{open_to_triage,triage_to_start,start_to_pr,pr_to_merge,open_to_merge} as {p50_h,p95_h,n} (hours, nearest-rank), history[] of up to 30 daily buckets {day,start_to_pr_p50,pr_to_merge_p50,open_to_merge_p50,n_started,n_pr,n_merged} persisted under /data/sla-history.json, stale_in_progress[] ({number,repo,started_at,age_h,agent} — issues carrying hive/in-progress longer than the agent claim TTL with no linked PR), stale_count, merged_7d, claim_ttl_s and, on the fleet block, the effective targets (start_to_pr_h, pr_to_merge_h, open_to_merge_h) pkg/dashboard/server.go:1347
GET /api/status/summary Dashboard auth/session Compact agent/governor/budget status summary for pollers; honors Accept-Encoding: gzip pkg/dashboard/server.go:1348
GET /api/overview/issues.csv Dashboard auth/session Cached Overview issue-band export as browser-compatible CSV; filters band, repo/repos, stale, and held are ANDed. pkg/dashboard/server.go:1349
GET /api/overview/issues.json Dashboard auth/session Cached Overview issue-band export as typed JSON with bands[] metadata and row fields matching the CSV columns. pkg/dashboard/server.go:1350
GET /api/overview/prs.csv Dashboard auth/session Cached Overview PR-band export as browser-compatible CSV; filters band, repo/repos, stale, and held are ANDed. pkg/dashboard/server.go:1351
GET /api/overview/prs.json Dashboard auth/session Cached Overview PR-band export as typed JSON with bands[] metadata and row fields matching the CSV columns. pkg/dashboard/server.go:1352
GET /api/events Dashboard auth/session Server-sent event stream pkg/dashboard/server.go:1353
GET /api/swarm Dashboard auth/session Current swarm status: display name, duration, active repo, expiry, persisted prep metrics when available, and idle-unlock fields. pkg/dashboard/swarm.go:310
POST /api/swarm Owner only Start a 24h repo swarm for a configured repo, returning 409 when another swarm is active and 423 when a previous swarm keeps the next swarm locked until enough agents are idle unless body {"repo":"owner/name","force":true} is used; saves the active record before repo prep, persists prep metrics, and announces the start to Discord when configured. pkg/dashboard/swarm.go:311
DELETE /api/swarm Owner only End the active swarm, score issues closed and PRs merged in the window, append it to history, and announce the result to Discord when configured. pkg/dashboard/swarm.go:312
GET /api/swarm/history Dashboard auth/session Completed swarm history, aggregate repo leaderboard, and top player records. pkg/dashboard/swarm.go:313
GET /api/swarm/players Dashboard auth/session Per-player swarm records and earned achievement catalog. pkg/dashboard/swarm.go:314
GET /api/swarm/themes Dashboard auth/session Default and per-repo swarm theme configuration. pkg/dashboard/swarm.go:315
PUT /api/swarm/themes Owner only Set a per-repo swarm theme (event_name, call_to_arms, leaderboard_title). pkg/dashboard/swarm.go:316
PATCH /api/swarm/objectives Owner only Update the active swarm SDLC objective checklist completion state. pkg/dashboard/swarm.go:317
GET /api/leaderboard/swarm Public Stable public JSON record of swarm history, leaderboard, top players, and achievements. pkg/dashboard/swarm.go:318
GET /api/runs Dashboard auth/session Active staged runs projected from task leases, plans, and lifecycle timeline. Returns an array of Run objects: canonical key (owner/repo#number), current-stage lease_key, title, repo (owner/repo), stage, gen, stage_started_at, waiting_on (agent, remote, human, ci, none), waiting_since, assignee, last_receipt, plan_epic_id, and stages[] (name, status, gen, receipt). pkg/dashboard/api.go:80
GET /api/runs/audit Owner only Read-only cross-repo audit query over existing retained artifacts. Query repo, canonical run (owner/repo#number), RFC3339 since/until, kind, limit (default 100, max 500), and page_token. Returns {items,next_page_token,retention}; each item has source (audit_log, timeline, lease_receipt, plan_epic), kind, run, repo, at, actor, artifact_id, attrs, or an explicit kind=expired,status=expired,state=Unknown marker when requested history may have aged out. pkg/dashboard/api.go:81
POST /api/runs/audit Owner only Activate the convergence audit campaign over a scope directory. Body {"campaign_key":"audit-campaign","scope_dir":"/data/convergence/audit/scope","store":"audit","generation":1,"run_key":"","run_url":""}; scope_dir defaults to /data/convergence/audit/scope, store defaults to audit, auditor, scanner, supervisor, then the first configured bead store. Runs inspection even when publication.enabled is false, but then skips the publisher and returns publication_skipped:true with reason publication.disabled. pkg/dashboard/api.go:82
GET /api/runs/{key}/checkpoint Dashboard auth/session Compact mobile/chat checkpoint review payload for a held run. Returns run_key, stage, lease gen, repo, title, capped plain-text summary, approve/reject decisions, dashboard deep link, lease_gen staleness fence, and verified-owner approver rule. pkg/dashboard/api.go:84
POST /api/runs/{key}/checkpoint Owner only Resolve a compact checkpoint decision. Body `{"action":"approve" "reject","gen":}`; refuses stale generations with 409 and non-owner callers with 403 before mutating the plan.
GET /api/runs/{key} Dashboard auth/session One run by URL-escaped canonical run key (owner/repo%23number); early lease-shaped keys (repo!run-key:stage) and queued Wavefront run-stage keys (owner/repo!graph:node) are also accepted. Includes timeline-derived stage history in the same Run shape as /api/runs when a lease/timeline exists. History entries that came from an owner reset carry the owner's reason. When the key belongs to a wired convergence campaign, the detail response also includes an optional burndown block with source, satisfied, remaining, unknown, and scope; the list endpoint omits this block. pkg/dashboard/api.go:86
POST /api/runs/{key}/reset Owner only Move a run's lease back to an earlier stage (for example implement to plan after a rejected plan). Body {"to": "<stage>", "reason": "<why>"}, both required. Mints a new generation so the relay holding the old one can no longer resume, persists before answering, and records the reason on the agent audit sink, the lifecycle timeline, and the stage_completed hook payload (attrs.reset = "true"). Returns {ok, key, stage_from, stage, gen, reason}. 400 for the same or a later stage or a missing reason, 404 when no live staged lease holds the key, 409 when the lease expired, 500 when the registry could not be written. pkg/dashboard/api.go:87
GET /api/campaigns Dashboard auth/session List resumable campaigns from archived Inception sessions and retained Spektacular (Spek) runs. Query search/q, repo, stage, status, and owner; each campaign is keyed by stable spec/session id and includes title, source, repos, current stage/step, artifact links, linked issues/PRs, contributors, last activity, status, engine, type, run link when applicable, and recheck status (enabled, interval, last_at, next_at, in_flight, last_delta_count, external_count, sources_failed). pkg/dashboard/api.go:88
GET /api/campaigns/{id} Dashboard auth/session Return one campaign by URL-escaped stable campaign id or run key, using the same campaign shape as /api/campaigns; recheck revisions may include a drift block with codebase_changed, prior_revision, delta_count, recheck_reason, external[] (source, kind, title, url, published_at, summary), external_count, and sources_failed. pkg/dashboard/api.go:89
POST /api/campaigns/{id}/resume Owner only Resume or pick up a campaign. Archived Inception campaigns take a durable campaign lease, restore their saved state and wiki working files; Spek campaigns return the retained run detail plus a CLI status command that reloads state from Spek artifacts. Body may include `{ "surface": "chat" "contributor"
POST /api/campaigns/{id}/release Owner only Release the caller's Inception campaign lease and write a campaign_release audit entry so another user can continue it. Run-backed Spektacular campaigns return 409 Conflict; this endpoint never revokes their run-lifecycle stage leases. pkg/dashboard/api.go:91
POST /api/campaigns/{id}/revise Owner only Create a linked revision campaign (revision_of, revision) for revisiting shipped or parked Inception/Spek work without overwriting the previous campaign. The new revision is leased to the caller and audit-logged as campaign_revise. pkg/dashboard/api.go:92
POST /api/campaigns/{id}/recheck Owner only Create an immediate linked Spek recheck revision using the cadence path. Returns 409 Conflict when a recheck revision is already in flight, 404 Not Found when recheck is disabled unless ?force=true is supplied, and records campaign_recheck. pkg/dashboard/api.go:93
GET /api/campaigns/{id}/jam Dashboard auth/session Return the per-campaign Jam workspace: section-anchored threads, comments, suggestions, polls, poll decisions, current spec revision and attributed revision history. pkg/dashboard/api.go:94
POST /api/campaigns/{id}/jam Read-write role Record an attributed spec revision for a campaign. Body includes spec_content, optional reason, and optional agent/model attribution fields. pkg/dashboard/api.go:95
GET /api/campaigns/{id}/jam/threads Dashboard auth/session List async Jam threads anchored to spec sections, including comments and author attribution. pkg/dashboard/api.go:96
POST /api/campaigns/{id}/jam/threads Read-write role Create a section-anchored Jam thread or add a comment to an existing thread. Body includes section and body, or thread_id and body. pkg/dashboard/api.go:97
POST /api/campaigns/{id}/jam/agents Maintainer only Invite Spektacular or a configured hive agent into a Jam thread. The agent reply is posted as an attributed thread comment and an open suggestion for human accept/reject; no spec revision is auto-applied. pkg/dashboard/api.go:98
GET /api/campaigns/{id}/jam/suggestions Dashboard auth/session List Jam suggestions with open/accepted/rejected status, proposed text, attribution and applied revision id when accepted. pkg/dashboard/api.go:99
POST /api/campaigns/{id}/jam/suggestions Read-write role; maintainer for accept Create a suggestion (section, proposed_text) or resolve it with action: "accept"/"reject" and suggestion_id. Accepting records a new attributed spec revision. pkg/dashboard/api.go:100
GET /api/campaigns/{id}/jam/polls Dashboard auth/session List Jam polls, advisory vote tallies and maintainer decisions stored against spec revisions. pkg/dashboard/api.go:101
POST /api/campaigns/{id}/jam/polls Read-write role; maintainer for decide Create polls (section, question, options), cast/update advisory votes (action: "vote"), or record a maintainer decision with rationale (action: "decide"). pkg/dashboard/api.go:102
GET /api/campaigns/{id}/jam/project-sync Dashboard auth/session Return the campaign's GitHub Projects sync configuration, last published items, last status, and retry guidance for failures. pkg/dashboard/api.go:103
POST /api/campaigns/{id}/jam/project-sync Maintainer only Enable/disable opt-in GitHub Projects sync, publish campaign specs/decisions/derived issues to the linked project, or record inbound project status updates without losing local Jam decisions. pkg/dashboard/api.go:104
GET /api/campaigns/{id}/jam/ws Dashboard auth/session Upgrade to a Jam WebSocket for live participant presence, section focus, and conflict-aware spec co-edit messages. Live edits require read-write role and stale base_revision_id values are rejected with a conflict message. pkg/dashboard/api.go:105
GET /api/runs/{key}/trace Dashboard auth/session Resolve Hive-Run, Hive-Plan, and Hive-Spec commit trailers for ?sha=..., returning the linked plan section, spek clause, approval audit record, rationale audit entries, and typed no-linkage results when trailers are missing. pkg/dashboard/api.go:83

Snapshots and style

Method Path Auth Purpose Source
GET /api/style Public Sanitized custom dashboard CSS pkg/dashboard/api.go:39
GET /branding/custom.css Dashboard auth/session Operator branding stylesheet override, read per request (see branding) pkg/dashboard/server.go:1414
GET /api/snapshot/frame-ancestors Public Snapshot framing allowlist pkg/dashboard/api.go:72
GET /api/snapshot Public Snapshot data pkg/dashboard/api.go:73
GET /snapshot Public Public read-only snapshot page pkg/dashboard/api.go:74

Auth and external accounts

Method Path Auth Purpose Source
GET /api/gh-auth Dashboard auth/session GitHub Auth pkg/dashboard/api.go:167
GET /api/gh-rate-limits Dashboard auth/session GitHub Rate Limits pkg/dashboard/api.go:168
GET /api/gh-user-auth/status Public GitHub User Auth Status pkg/dashboard/api.go:169
POST /api/gh-user-auth/start Public GitHub User Auth Start pkg/dashboard/api.go:170
POST /api/gh-user-auth/poll Public GitHub User Auth Poll pkg/dashboard/api.go:171
POST /api/gh-user-auth/logout Public GitHub User Auth Logout pkg/dashboard/api.go:172
GET /api/gh-user-auth/session Public GitHub User Auth Session pkg/dashboard/api.go:173
GET /api/claude-auth/status Dashboard auth/session Claude Auth Status pkg/dashboard/claude_auth.go:54
POST /api/claude-auth/start Dashboard auth/session Claude Auth Start pkg/dashboard/claude_auth.go:55
POST /api/claude-auth/exchange Dashboard auth/session Claude Auth Exchange pkg/dashboard/claude_auth.go:56
POST /api/claude-auth/logout Dashboard auth/session Claude Auth Logout pkg/dashboard/claude_auth.go:57
GET /api/copilot-auth/status Dashboard auth/session Copilot Auth Status pkg/dashboard/copilot_auth.go:84
POST /api/copilot-auth/start Owner only Copilot Auth Start pkg/dashboard/copilot_auth.go:85
POST /api/copilot-auth/logout Owner only Copilot Auth Logout pkg/dashboard/copilot_auth.go:87
GET /api/openrouter/connect/start Dashboard auth/session Open Router Start pkg/dashboard/openrouter.go:45
GET /api/openrouter/qr Dashboard auth/session Open Router QR pkg/dashboard/openrouter.go:46
GET /api/openrouter/models Dashboard auth/session Open Router Models pkg/dashboard/openrouter.go:47
GET /api/openrouter/credit Dashboard auth/session Open Router Credit pkg/dashboard/openrouter.go:48
GET /openrouter/callback Public Open Router Callback pkg/dashboard/openrouter.go:49
POST /api/github-app/recheck Dashboard auth/session GitHub App Recheck pkg/dashboard/server.go:1354
POST /api/github-app/install-clicked Dashboard auth/session GitHub App Install Clicked pkg/dashboard/server.go:1355
GET /gh-setup Public GitHub App Setup Callback pkg/dashboard/server.go:1356

Configuration

Method Path Auth Purpose Source
GET /api/themes Dashboard auth/session Embedded dashboard/contributor theme catalog with swatches for Settings → Appearance; ?scope=contributor filters profile themes pkg/dashboard/api.go:40
GET /api/theme.css Dashboard auth/session Effective dashboard theme stylesheet with strong ETag / 304 support; ?theme=<id> previews an embedded preset; ?scope=contributor emits contributor token aliases and layers hive custom CSS pkg/dashboard/api.go:41
GET /api/config Dashboard auth/session Config pkg/dashboard/api.go:42
GET /api/config/dashboard/theme Owner only Dashboard theme selection, overrides, effective theme, and built-in catalog pkg/dashboard/api.go:49
PUT /api/config/dashboard/theme Owner only Persist dashboard.theme and dashboard.theme_overrides with validation, CSS/background guardrails, and audit logging pkg/dashboard/api.go:50
GET /api/config/download Owner only Config Download pkg/dashboard/api.go:43
GET /api/config/sla Owner only Delivery SLA targets: {targets:{start_to_pr_h,pr_to_merge_h,open_to_merge_h}, effective_targets:{...}, defaults:{...}}, hours, from sla.targets in hive.yaml with defaults 4/24/72 pkg/dashboard/api.go:243
PUT /api/config/sla Owner only Replace sla.targets ({targets:{start_to_pr_h,pr_to_merge_h,open_to_merge_h}}; each 0 (default) to 8760, validated before anything is persisted); the Throughput Delivery SLA panel recolours on the next status poll pkg/dashboard/api.go:244
GET /api/config/export Owner only Redacted JSON export of the effective config, layer files, side files, and provenance pkg/dashboard/api_config_export.go
GET /api/config/provenance Owner only Config Provenance pkg/dashboard/api.go:46
GET /api/config/variables Dashboard auth/session Variables List pkg/dashboard/api.go:47
GET /api/config/authorized-users Dashboard auth/session Authorized Users List pkg/dashboard/api.go:48
PUT /api/config/variables/{name} Owner only Variable Upsert pkg/dashboard/api.go:51
DELETE /api/config/variables/{name} Owner only Variable Delete pkg/dashboard/api.go:52

| GET | /api/config/agent/{name} | Dashboard auth/session | Agent Config Get | pkg/dashboard/api.go:180 | | PUT | /api/config/agent/{name}/general | Owner only | Agent Config General | pkg/dashboard/api.go:181 | | PUT | /api/config/agent/{name}/cadences | Owner only | Agent Config Cadences | pkg/dashboard/api.go:182 | | PUT | /api/config/agent/{name}/models | Owner only | Agent Config Models | pkg/dashboard/api.go:183 | | PUT | /api/config/agent/{name}/pipeline | Owner only | Agent Config Pipeline | pkg/dashboard/api.go:184 | | PUT | /api/config/agent/{name}/hooks | Owner only | Agent Config Hooks | pkg/dashboard/api.go:185 | | PUT | /api/config/agent/{name}/restrictions | Owner only | Agent Config Restrictions | pkg/dashboard/api.go:186 | | PUT | /api/config/agent/{name}/stats | Owner only | Agent Config Stats | pkg/dashboard/api.go:187 | | GET | /api/config/agent/{name}/prompt | Dashboard auth/session | Agent Prompt | pkg/dashboard/api.go:188 | | PUT | /api/config/agent/{name}/prompt | Owner only | Agent Prompt Save | pkg/dashboard/api.go:189 | | GET | /api/config/agent/{name}/export | Dashboard auth/session | Agent Export | pkg/dashboard/api.go:190 | | PUT | /api/config/agent/{name}/channels | Owner only | Agent Config Channels | pkg/dashboard/api.go:191 | | PUT | /api/config/agent/{name}/tools | Owner only | Agent Config Tools | pkg/dashboard/api.go:192 | | PUT | /api/config/agent/{name}/connections | Owner only | Agent Config Connections | pkg/dashboard/api.go:193 | | GET | /api/config/agent/{name}/variables | Dashboard auth/session | Per-agent Variables tab: the agent's own ${VAR} definitions plus the hive-level ones it inherits (each flagged overridden when the agent redefines it) and the seed-only exec/http gate flags. Never returns values — only name, type, scope and a non-secret source hint | pkg/dashboard/api_variables.go:298 | | PUT | /api/config/agent/{name}/variables/{var} | Owner only | Create or update one per-agent variable (static/env only; script/http are 403 and seed-only; scope template or both; secret-looking static values rejected). Persisted on the agent entry; overrides a same-named hive-level variable in this agent's kick prompt | pkg/dashboard/api_variables.go:299 | | DELETE | /api/config/agent/{name}/variables/{var} | Owner only | Delete one per-agent variable (404 for inherited hive-level variables — delete those via /api/config/variables/{name}) | pkg/dashboard/api_variables.go:300 | | GET | /api/config/stat-sources | Dashboard auth/session | Stat Sources | pkg/dashboard/api.go:194 | | GET | /api/config/governor | Dashboard auth/session | Governor Config Get | pkg/dashboard/api.go:196 | | PUT | /api/config/governor/sensing | Owner only | Governor Sensing | pkg/dashboard/api.go:199 | | PUT | /api/config/governor/thresholds | Owner only | Governor Thresholds | pkg/dashboard/api.go:200 | | PUT | /api/config/governor/labels | Owner only | Governor Labels | pkg/dashboard/api.go:206 | | PUT | /api/config/governor/budget | Owner only | Governor Budget | pkg/dashboard/api.go:207 | | PUT | /api/config/governor/notifications | Owner only | Governor Notifications | pkg/dashboard/api.go:211 | | PUT | /api/config/governor/health | Owner only | Governor Health | pkg/dashboard/api.go:212 | | PUT | /api/config/governor/logging | Owner only | Governor Logging | pkg/dashboard/api.go:224 | | PUT | /api/config/governor/attribution | Owner only | Governor Attribution | pkg/dashboard/api.go:225 | | PUT | /api/config/governor/hub | Owner only | Governor Hub | pkg/dashboard/api.go:226 | | PUT | /api/config/governor/litellm | Owner only | Governor Lite LLM | pkg/dashboard/api.go:227 | | PUT | /api/config/governor/trajectory | Owner only | Governor Trajectory | pkg/dashboard/api.go:228 | | GET | /api/config/governor/backup | Owner only | Backup Key Status (presence + safe source label; never the key value) | pkg/dashboard/backup_key.go | | PUT | /api/config/governor/backup | Owner only | Backup Key Set (64-hex AES-256 key; stored 0600, path-only in hive.yaml) | pkg/dashboard/backup_key.go | | DELETE | /api/config/governor/backup | Owner only | Backup Key Clear (backups are refused again) | pkg/dashboard/backup_key.go | | GET | /api/config/governor/bob | Dashboard auth/session | Governor Bob Status | pkg/dashboard/api.go:272 | | PUT | /api/config/governor/bob | Owner only | Governor Bob Key | pkg/dashboard/api.go:273 | | DELETE | /api/config/governor/bob | Owner only | Governor Bob Key Clear | pkg/dashboard/api.go:274 |

| GET | /api/config/governor/cadence-scope | Owner only | Governor Cadence Scope Get (aggregate or per_repo) | pkg/dashboard/api.go:201 | | PUT | /api/config/governor/cadence-scope | Owner only | Governor Cadence Scope Set (cadenceScope/cadence_scope: aggregate, per_repo, or empty for default) | pkg/dashboard/api.go:202 | | POST | /api/config/governor/bob/test | Dashboard auth/session | Governor Bob Key Test | pkg/dashboard/api.go:276 | | POST | /api/config/governor/litellm/test | Dashboard auth/session | Governor Lite LLMTest | pkg/dashboard/api.go:277 | | GET | /api/config/governor/gateways | Dashboard auth/session | Governor Gateways List | pkg/dashboard/api.go:280 | | PUT | /api/config/governor/gateways | Owner only | Governor Gateways Upsert | pkg/dashboard/api.go:281 | | DELETE | /api/config/governor/gateways/{name} | Owner only | Governor Gateways Delete | pkg/dashboard/api.go:282 | | POST | /api/config/governor/gateways/{name}/test | Dashboard auth/session | Governor Gateways Test | pkg/dashboard/api.go:283 | | POST | /api/config/governor/gateways/discover | Owner only | Governor Gateways Discover | pkg/dashboard/api.go:284 | | POST | /api/config/governor/agents | Owner only | Governor Add Agent | pkg/dashboard/api.go:289 | | DELETE | /api/config/governor/agents/{name} | Owner only | Governor Remove Agent | pkg/dashboard/api.go:290 | | PUT | /api/config/governor/repos | Owner only | Governor Repos | pkg/dashboard/api.go:291 | | POST | /api/config/governor/repos/check-access | Dashboard auth/session | Governor Repo Check Access | pkg/dashboard/api.go:295 | | PUT | /api/config/github | Owner only | Config GitHub | pkg/dashboard/api.go:296 | | GET | /api/config/github/forge-apps | Dashboard auth/session | Config GitHub Forge Apps | pkg/dashboard/api.go:299 | | GET | /api/config/sidebar | Dashboard auth/session | Sidebar Get | pkg/dashboard/api.go:339 | | PUT | /api/config/sidebar | Dashboard auth/session | Sidebar Set | pkg/dashboard/api.go:340 | | GET | /api/config/backends | Dashboard auth/session | Backends | pkg/dashboard/api.go:341 | | GET | /api/compliance/status | Merger or owner | Evaluated compliance controls for the frameworks in compliance.frameworks (compliance.Report, JSON): per control meets/deviates/off/not_covered with current vs recommended value per mapped setting, a summary, and the non-certification disclaimer — see Compliance (#11078) | pkg/dashboard/api.go:331 | | GET | /api/compliance/posture | Merger or owner | Posture-check catalogue, effective interval / window / history retention, and the latest run (compliance.PostureRun: per check pass/fail/skip/error, detail, control ids, evidence refs); ?since= (RFC 3339, YYYY-MM-DD or a look-back such as 168h) adds every run since then, oldest first, capped at 1000 — see Compliance (#11079) | pkg/dashboard/api.go:332 | | POST | /api/compliance/posture/run | Merger or owner | Run the posture checks now and record the pass in the history; audited as compliance_posture_run; 409 when no framework is selected or a pass is already running (#11079) | pkg/dashboard/api.go:333 | | GET | /api/compliance/posture/history | Owner only | Posture history for ?since=/?until= (default the last 30 days) as one series per check: points (at, status), status counts, last_fail_at and the latest result with detail and evidence refs; at most the 1000 most recent runs — see Compliance (#11081) | pkg/dashboard/api.go:334 | | GET | /api/compliance/export | Owner only | Evidence download for ?since=/?until=: kind=controls (json/md), posture (json/csv), audit (json), config (redacted effective config + sha256, json), attestations (json/csv) or bundle (json); audited as compliance_export (#11081) | pkg/dashboard/api.go:335 | | GET | /api/compliance/attestations | Owner only | Owner attestations, newest first (?framework= filters) (#11081) | pkg/dashboard/api.go:336 | | POST | /api/compliance/attestations | Owner only | Record {"framework", "reviewed_on", "note"} for the signed-in owner; audited as compliance_attestation; 201 with the attestation, 400 for an unknown framework, a bad or future date, or a note over 2000 characters (#11081) | pkg/dashboard/api.go:337 | | PUT | /api/config/governor/compliance | Owner only | Settings → Compliance framework picker: {"frameworks": [...]} sets compliance.frameworks (empty list deselects all, absent key leaves it unchanged; unknown/duplicate ids are a 400 before any change); audited as config_compliance; returns the re-evaluated compliance.Report (#11080) | pkg/dashboard/api.go:501 |

| GET | /api/config/governor/threshold-scaling | Owner only | Governor Threshold Scaling Get | pkg/dashboard/api.go:203 | | PUT | /api/config/governor/threshold-scaling | Owner only | Governor Threshold Scaling Set | pkg/dashboard/api.go:204 | | PUT | /api/config/governor/coverage-target | Owner only | Governor Coverage Target | pkg/dashboard/api.go:205 | | POST | /api/config/governor/budget/reset | Owner only | Governor Budget Reset | pkg/dashboard/api.go:208 | | PUT | /api/config/governor/watchdog | Owner only | Governor Watchdog | pkg/dashboard/api.go:213 | | GET | /api/config/escalation | Owner only | Escalation Config Get | pkg/dashboard/api.go:216 | | PUT | /api/config/escalation | Owner only | Escalation Config Set | pkg/dashboard/api.go:217 | | GET | /api/config/write-surface | Owner only | Lane write allowlist (write_surface.allowlist, #9587): allowlist, ops, warnings | pkg/dashboard/api.go:497 | | PUT | /api/config/write-surface | Owner only | Replace the lane write allowlist; {"allowlist": {}} clears it; unknown operation or bad lane name is a 400 with nothing changed | pkg/dashboard/api.go:498 | | GET | /api/config/review | Dashboard auth/session | Review Config Get | pkg/dashboard/api.go:220 | | PUT | /api/config/review | Owner only | Review Config Set | pkg/dashboard/api.go:223 | | PUT | /api/config/governor/features | Owner only | Governor Features | pkg/dashboard/api.go:229 | | GET | /api/config/governor/general-advanced | Owner only | Governor General Advanced Get | pkg/dashboard/api.go:230 | | PUT | /api/config/governor/general-advanced | Owner only | Governor General Advanced Set | pkg/dashboard/api.go:231 | | GET | /api/config/auto-merge | Owner only | Auto-Merge Config Get | pkg/dashboard/api.go:235 | | PUT | /api/config/auto-merge | Owner only | Auto-Merge Config Set | pkg/dashboard/api.go:236 | | GET | /api/config/convergence | Owner only | Convergence Config Get | pkg/dashboard/api.go:241 | | PUT | /api/config/convergence | Owner only | Convergence Config Set | pkg/dashboard/api.go:242 | | GET | /api/config/governor/advisory | Owner only | Governor Advisory Get | pkg/dashboard/api.go:246 | | PUT | /api/config/governor/advisory | Owner only | Governor Advisory Set | pkg/dashboard/api.go:247 | | GET | /api/config/governor/replan | Owner only | Governor Replan Get | pkg/dashboard/api.go:248 | | PUT | /api/config/governor/replan | Owner only | Governor Replan Set | pkg/dashboard/api.go:249 | | GET | /api/config/governor/work-source | Owner only | Governor Work Source Get (Jira secrets/TLS fields reported as set/unset only) | pkg/dashboard/api.go:259 | | PUT | /api/config/governor/work-source | Owner only | Governor Work Source Set (including Jira Data Center TLS settings) | pkg/dashboard/api.go:260 | | PUT | /api/config/governor/security | Owner only | Governor Security | pkg/dashboard/api.go:261 | | GET | /api/config/governor/project-observability | Owner only | Governor Project Observability Get | pkg/dashboard/api.go:262 | | PUT | /api/config/governor/project-observability | Owner only | Governor Project Observability Set | pkg/dashboard/api.go:263 | | GET | /api/config/governor/inference-auth | Owner only | Governor Inference Auth Get | pkg/dashboard/api.go:278 | | PUT | /api/config/governor/inference-auth | Owner only | Governor Inference Auth Set | pkg/dashboard/api.go:279 |

Agents and controls

Method Path Auth Purpose Source

| POST | /api/kick/{agent} | Owner only | Kick — asynchronous; answers 202 once queued (see below) | pkg/dashboard/api.go:127 | | GET | /api/kick/{agent}/status | Dashboard auth/session | Outcome of the most recent kick | pkg/dashboard/api.go:131 | | POST | /api/switch/{agent}/{backend} | Owner only | Switch | pkg/dashboard/api.go:132 | | POST | /api/model/{agent}/{model} | Owner only | Model Set | pkg/dashboard/api.go:133 | | POST | /api/effort/{agent}/{effort} | Owner only | Set launch-only reasoning effort after validating against the agent's live backend (including runtime override); persists config/agent overlay, restarts the session, and default clears the stored effort | pkg/dashboard/api.go:134 | | POST | /api/pause/{agent} | Owner only | Pause | pkg/dashboard/api.go:135 | | POST | /api/resume/{agent} | Owner only | Resume | pkg/dashboard/api.go:136 | | GET | /api/agent-state/{agent} | Dashboard auth/session | Agent State | pkg/dashboard/api.go:137 | | GET | /api/breaker | Dashboard auth/session | Breaker State | pkg/dashboard/api.go:138 | | POST | /api/breaker/engage | Owner only | Breaker Engage | pkg/dashboard/api.go:139 | | POST | /api/breaker/release | Owner only | Breaker Release | pkg/dashboard/api.go:140 | | POST | /api/pin/{agent}/{dimension} | Owner only | Pin | pkg/dashboard/api.go:141 | | POST | /api/unpin/{agent}/{dimension} | Owner only | Unpin | pkg/dashboard/api.go:142 | | POST | /api/restart/{agent} | Owner only | Restart | pkg/dashboard/api.go:146 | | GET | /api/model-advisor | Dashboard auth/session | Model Advisor | pkg/dashboard/api.go:162 | | GET | /api/governor/pr-models | Dashboard auth/session | Agent-authored PR distribution by normalized attribution model/backend for window=7d, 30d, or all, including per-model rework stats and the top 10 most-reworked PRs | pkg/dashboard/api.go:163 | | GET | /api/reviewer/accuracy | Dashboard auth/session | Reviewer verdict calibration for the configured window: false-approve/false-block rates and confidence buckets per perspective and reviewer model | pkg/dashboard/api.go:222 | | GET | /api/review/queue | Dashboard auth/session | PR review queue: every open PR (agent and contributor, actionable and held) ranked by triage class, confidence band, CI state and age, with per-PR reasons; unreviewed items carry pending_since and redispatch_count from the review dispatch state; paged with limit (1-200, default 50) and offset | pkg/dashboard/api.go:476 | | POST | /api/review/queue/{owner}/{repo}/{number}/superseded/close | Owner only | Close a PR in the supersession grace window now: posts the close comment, adds hive/superseded, closes it | pkg/dashboard/api.go:479 | | POST | /api/review/queue/{owner}/{repo}/{number}/superseded/keep-open | Owner only | Keep a superseded PR open: adds hive/keep-open, which the supersession sweep never auto-closes | pkg/dashboard/api.go:480 | | GET | /api/review/pipeline | Dashboard auth/session | Review pipeline: one card per review-queue PR placed in its stage (unreviewed, reviewing, changes_requested, fixing, human_hold, approved, merged, abandoned) with since, reviewers, P0–P3 severity counts, loop_count/loop_cap, next_action and reasons; filtered by repo and stage, paged with limit (1-200, default 50) and offset | pkg/dashboard/api.go:484 | | GET | /api/review/dispatch/events | Dashboard auth/session | Webhook review dispatch queue: enabled, webhooks_configured, debounce_s, pending (soonest first) and recent (newest first) dispatches with repo, number, head SHA, action, timestamps and coalesced count, plus stats counters; in memory, never calls GitHub | pkg/dashboard/api_review_event_dispatch.go:16 | | GET | /api/review/evidence | Merger or owner | Review evidence bundle for one PR head. Query repo (owner/name), number, optional head (full SHA or unique prefix of at least 7 characters; 409 when ambiguous; default is the newest head), format=json\|zip (default json) and download=1 for an attachment. json returns the bundle bytes exactly as sealed (verdicts, posted reviews, policy, CI check runs, sentinel findings, human actions, merge event, hash, optional signature); zip adds verdicts.json, review-links.json and a manifest.json of SHA-256s plus the signing public key when readable. 400 for a bad repo/number; 404 with status: "expired"/expired: true when retention removed a bundle Hive can prove existed, otherwise status: "not_found" | pkg/dashboard/api.go:488 | | GET | /api/review/evidence/list | Merger or owner | Every retained evidence bundle id and head for one PR (repo, number), oldest first, with the newest marked latest; 400 for a bad repo/number | pkg/dashboard/api.go:489 | | GET | /api/evidence/write-counters | Merger or owner | Durable attempted vs blocked agent GitHub write counters (#12069): totals by intent tier (ACMM mode) with blocked_by_reason, and weeks keyed by the UTC Monday of each ISO week with per-tier and per-reason counts. Persisted across restarts; observation only, never gates a write or merge. Empty totals/weeks before anything is recorded | pkg/dashboard/api.go:491 | | GET | /api/evidence/summary | Dashboard auth/session | Read-only aggregate over /data/evidence bundles (schema v1) plus reviewer accuracy. Query hours (default 24, capped like /api/pr-throughput; 0 = all time), repo (owner/name) and author_kind=human\|agent\|bot; 400 for a bad value. Returns outcomes_by_author_kind (merged/open; closed is 0 and reverted_14d null until bundles record them), reviewer_calibration buckets per perspective, reviewer_accuracy_by_model split by author kind, sentinel_hits_per_week, shadow_gate (n, would_have_held, would_have_blocked, and per gate review_gate / intent the evaluated n with held / passed outcomes {n, merged, closed, open, reverted}), write_counters (per intent tier {attempted, blocked} from the proxy write counter file; omitted when absent or unreadable), claim_vs_verdict (per ISO week of agent-authored PRs: n, claimed, ci_captured, ci_not_green, verdict_not_approve, both; records with empty CI are excluded from the CI column and disclosed under missing.records_empty_ci), the /api/reviewer/accuracy summary, and n plus missing counts (unknown-model verdicts, empty CI, unreadable records). Never consulted by merge decisions. | pkg/dashboard/api.go:494 | | GET | /api/agents | Dashboard auth/session | Agents List | pkg/dashboard/api.go:301 | | POST | /api/agents | Owner only | Agent Create | pkg/dashboard/api.go:302 | | POST | /api/agents/import | Owner only | Agent Import | pkg/dashboard/api.go:303 | | DELETE | /api/agents/{name} | Owner only | Agent Delete | pkg/dashboard/api.go:304 |

| GET | /api/agents/{name}/log | Dashboard auth/session | Agent Full Log | pkg/dashboard/api.go:114 | | GET | /api/agents/{name}/terminal-urls | Dashboard auth/session | Agent Terminal URLs | pkg/dashboard/api.go:118 | | GET | /api/agents/{name}/kicks | Dashboard auth/session | Agent Kick Log List | pkg/dashboard/api.go:121 | | GET | /api/agents/{name}/kicks/{id} | Dashboard auth/session | Agent Kick Log Get | pkg/dashboard/api.go:122 | | GET | /agents/{name}/kicks | Dashboard auth/session | Agent Kick History Page (HTML) | pkg/dashboard/api.go:123 | | POST | /api/agents/{name}/login-code | Owner only | Agent Login Code | pkg/dashboard/api.go:145 |

Kick is asynchronous

POST /api/kick/{agent} queues the message and returns immediately with 202; it is not a delivery confirmation.

Delivery has to wait for the agent's CLI to present its input prompt, which is bounded by inputPromptTimeout (120s). Doing that wait on the request path made the handler outlive a typical 60s ingress idle timeout, so a proxy answered 504 for kicks that had in fact succeeded — the prompt was typed, the agent ran the session, and the operator was told it failed (hivecommons#5325). Retrying a false failure delivered the prompt twice.

The contract is now:

  • 400 — a genuine, deterministic precondition failure evaluated inline: unknown agent, paused, stopped, no tmux session, sandbox kick rejected, prompt over 10000 chars.
  • 202 with status: "deferred" — an auto-generated manual kick was requested before the first governor scan populated the actionable-work snapshot. The kick is deduplicated per agent and delivered after that scan finishes.
  • 202 with status: "queued" — accepted; a background delivery started.
  • 202 with status: "in-flight" — a delivery for this agent was already running, so this call was deduplicated. Delivery is exactly-once per agent, which is what makes an operator's retry harmless.

Read the result from GET /api/kick/{agent}/status, which returns status of unknown, in-flight, delivered, or failed, plus a pending boolean. While pending is true the outcome is indeterminate — the prompt may still be delivered — and clients must not render it as a failure. A CLI that never reaches its input prompt within inputPromptTimeout settles as failed with a reason.

Packs and ACMM

Method Path Auth Purpose Source
GET /api/packs Dashboard auth/session Packs List pkg/dashboard/api.go:306
POST /api/packs/{level}/apply Owner only Pack Apply pkg/dashboard/api.go:307
PUT /api/packs/level Owner only Set the ACMM level. Body {"level": N} persists and applies the pack; optional {"release_level_holds": true} performs a deliberate one-off release of Hive App level-applied hold labels for the transition. Level holds are otherwise never auto-released. When the change makes the L6 self-authored merge sweep eligible, the success body adds self_merge_sweep_active, level_changed_at, level_holds_pending: [{repo, number, title, url, agent}], and repos: [{repo, auto_merge}] so the dashboard can show the owner an informational notice and repo toggles. pkg/dashboard/api.go:308
POST /api/repos/rescan Dashboard auth/session Re-enumerate watched repositories' open issues/PRs for the dashboard Projects cards. The scan is read-only with respect to agents/governor actions, collapses concurrent requests, and debounces repeated presses for 30 seconds (repoRescanDebounce) so the button cannot hammer GitHub pkg/dashboard/api.go, pkg/dashboard/api_repos_rescan.go
POST /api/repos/pause Owner Quiet ONE repository without stopping the hive: agents stop writing to it and stop being handed work on it, while it keeps its dashboard card and ACMM eval. Body {"repo": "...", "reason": "..."} — the repo travels in the body because a project.repos entry may be an explicit cross-org owner/name. Records who/when/why; changed: false marks a no-op re-pause and leaves the original provenance intact; persisted: false means the pause is in force but could not be written to config. Rejects a repo outside project.repos. See per-repo agent pause pkg/dashboard/api_repo_pause.go
POST /api/repos/resume Owner Lift a repository's pause. Unlike pause, does not require the repo to be in project.repos, so a pause left behind by a removed repo can still be cleared pkg/dashboard/api_repo_pause.go
GET /api/repos/pauses Dashboard auth/session Every repo pause with its provenance. Read-only — the same state is already on the repository cards pkg/dashboard/api_repo_pause.go

| GET | /api/repos/{owner}/{repo}/hold-permission | Dashboard auth/session | Reports whether the signed-in user can toggle hold chips for a repository card. Owners are allowed; otherwise the server checks GitHub repos/{owner}/{repo}/collaborators/{user}/permission and briefly caches the effective permission | pkg/dashboard/api.go:323, pkg/dashboard/api_repo_hold.go | | POST | /api/repos/{owner}/{repo}/items/{number}/hold | Owner or repo write/maintain/admin | Add or remove a dashboard hold chip for an issue or PR. Body {"held": true} adds the hive's exact-match canonical hive-pause/<hive-id> label; {"held": false} removes exactly the labels causing the hold (hive-pause/<hive-id> and/or generic hold labels) and never removes hive/<hive-id> provenance. Every toggle writes an audit-log entry; the #8851 upgrade migration writes /data/hive-hold-migration-<hive-id>.json with audit-backed, provenance-only, and ambiguous legacy hive/<hive-id> classifications. | pkg/dashboard/api.go:324, pkg/dashboard/api_repo_hold.go | | GET | /api/acmm/evaluation | Dashboard auth/session | ACMMEvaluation — combined codebase + operational result, cached server-side for 1 hour (acmmEvalTTL). ?refresh=1 (the dashboard's "🔄 Re-evaluate" button, #5877) bypasses the hourly TTL but is debounced server-side: requests within 1 minute of the last evaluation (acmmRefreshDebounce) still serve the cache, since a full refresh costs up to ~29 GitHub GetContents calls per repo. The response's last_evaluated_at timestamp reports when the cached evaluation was computed | pkg/dashboard/api.go:326, pkg/dashboard/api_acmm_eval.go | | POST | /api/acmm/issue | Owner only | ACMMCreate Issue — files on GitHub or, with governor.acmm.issue_tracker: work_source / body tracker: "work_source" on a Linear-sourced hive, on Linear; response tracker says which. See ACMM policy matrix | pkg/dashboard/api.go:327 | | GET | /api/acmm-recommendation | Dashboard auth/session | Advisory level-up recommendation (acmmadvisor.Recommendation, JSON): never changes the applied level — see ACMM advisor | pkg/dashboard/api.go:328 | | GET | /api/hive-advice | Dashboard auth/session | Weekly owner advice (hiveadvisor.Result, JSON) shared with the advisory digest: recommendations with items, links (Overview export paths) and bands; bands[] rule text; counts naming the governor actionable queue vs. the Overview total. Which recommendations show is frozen for 7 days; their numbers refresh every call — see Owner advice | pkg/dashboard/api.go:330, pkg/dashboard/api_hive_advice.go |

Cost, tokens, telemetry

Method Path Auth Purpose Source
GET /api/trends Dashboard auth/session Trends pkg/dashboard/api.go:76
GET /api/token-access Dashboard auth/session Token Access pkg/dashboard/api.go:149
GET /api/tokens Dashboard auth/session Tokens pkg/dashboard/api.go:150
GET /api/cost Dashboard auth/session Cost pkg/dashboard/api.go:151
GET /api/repo-activity Dashboard auth/session Per-repo audited activity pkg/dashboard/api.go
GET /api/repo-cost Dashboard auth/session Per-repo estimated token cost (interval join, cached) pkg/dashboard/api.go
GET /api/launch-cost Dashboard auth/session Per-issue / PR / head-SHA estimated token cost from kick launch attribution (cached; ?ref=owner/repo#N narrows) pkg/dashboard/api.go
GET /api/cost/history Dashboard auth/session Cost History pkg/dashboard/api.go:156
GET /api/trend/history Dashboard auth/session Trend History pkg/dashboard/api.go:159
GET /api/timeseries Dashboard auth/session Time Series pkg/dashboard/api.go:161
GET /api/providers/headroom Dashboard auth/session Providers Headroom pkg/dashboard/api.go:54
GET /api/budget/history Dashboard auth/session Budget History pkg/dashboard/api.go:158

Knowledge

Method Path Auth Purpose Source
GET /api/knowledge Dashboard auth/session Knowledge List pkg/dashboard/api.go:346
GET /api/knowledge/export Dashboard auth/session Knowledge Export pkg/dashboard/api.go:347
POST /mcp/knowledge Public (read-only) when the dashboard setting or HIVE_PUBLIC_KNOWLEDGE is on; 404 otherwise Public Knowledge MCP endpoint — initialize, tools/list, tools/call for knowledge_search/knowledge_toc/knowledge_get/knowledge_export (docs) pkg/dashboard/api.go:355
GET /api/knowledge/search Dashboard auth/session Knowledge Search pkg/dashboard/api.go:348
GET /api/knowledge/toc Dashboard auth/session Scoped knowledge table of contents: capped, body-free entries (id, title, type, layer, repo, tags, status, confidence, updated, size_bytes, source) plus total/returned/truncated. Query: layers, repos, types, tags (comma-separated), limit (default 50, max 200), include_states (operator opt-in for draft/deprecated/superseded/all), format=prompt with max_chars for a bounded markdown rendering, agent to apply that agent's knowledge.agent_scopes entry (the other parameters can only narrow it). Approved knowledge only by default (docs) pkg/dashboard/api.go:349
GET /api/knowledge/effective Dashboard auth/session Effective knowledge for one agent (agent required): the agent's knowledge.agent_scopes entry (unrestricted when it has none) intersected with the request scope (approved only unless include_states is set). Returns scope (resolved scope applied, with configured), included TOC entries, excluded entries each with a reason (lifecycle, layer, repo, type or tag — first failing check, in that order), included_total/excluded_total/included_returned/excluded_returned and truncated; limit caps each list (default 50, max 200) (docs) pkg/dashboard/api.go:350
GET /api/knowledge/entry/{id} Dashboard auth/session Full read of one knowledge entry: markdown (front-matter plus body) and the fact. Takes the same scope, include_states and agent query as the table of contents and returns 404 for an entry outside it (docs) pkg/dashboard/api.go:351
GET /api/knowledge/public Dashboard auth/session Public Knowledge MCP sharing status (enabled, tags, source, endpoint URL) pkg/dashboard/api.go:356
PUT /api/knowledge/public Owner only Persist public Knowledge MCP sharing setting; overrides env vars until changed pkg/dashboard/api.go:357
GET /api/knowledge/health Dashboard auth/session Knowledge Health pkg/dashboard/api.go:358
GET /api/knowledge/stats Dashboard auth/session Knowledge Stats pkg/dashboard/api.go:359
GET /api/knowledge/graph Dashboard auth/session Knowledge Graph pkg/dashboard/api.go:360
GET /api/knowledge/fact-history Dashboard auth/session Fact History pkg/dashboard/api.go:361
POST /api/knowledge/create Dashboard auth/session Knowledge Create pkg/dashboard/api.go:362
POST /api/knowledge/import Dashboard auth/session Knowledge Import pkg/dashboard/api.go:363
POST /api/knowledge/promote Dashboard auth/session Knowledge Promote pkg/dashboard/api.go:369
GET /api/knowledge/subscriptions Dashboard auth/session Knowledge Subs List pkg/dashboard/api.go:370
POST /api/knowledge/subscriptions Dashboard auth/session Knowledge Subs Add pkg/dashboard/api.go:371
DELETE /api/knowledge/subscriptions Dashboard auth/session Knowledge Subs Remove pkg/dashboard/api.go:372
PUT /api/knowledge/{layer}/{slug} Dashboard auth/session Knowledge Update pkg/dashboard/api.go:373
DELETE /api/knowledge/{layer}/{slug} Dashboard auth/session Knowledge Delete pkg/dashboard/api.go:374
GET /api/knowledge/{layer} Dashboard auth/session Knowledge Layer pkg/dashboard/api.go:375
GET /api/knowledge/{layer}/{slug} Dashboard auth/session Knowledge Fact pkg/dashboard/api.go:376
PUT /api/knowledge/enabled Owner only Knowledge Toggle pkg/dashboard/api.go:377
GET /api/knowledge/bead-synthesizer Dashboard auth/session Bead Synth Status pkg/dashboard/api.go:378
PUT /api/knowledge/bead-synthesizer/enabled Owner only Bead Synth Toggle pkg/dashboard/api.go:379
GET /api/knowledge/vaults Dashboard auth/session Vaults List pkg/dashboard/api.go:380
POST /api/knowledge/vaults Owner only Vaults Connect pkg/dashboard/api.go:381
DELETE /api/knowledge/vaults Dashboard auth/session Vaults Disconnect pkg/dashboard/api.go:382
POST /api/knowledge/vaults/reindex Dashboard auth/session Vaults Reindex pkg/dashboard/api.go:383
GET /api/knowledge/vaults/{name}/facts Dashboard auth/session Vault Facts pkg/dashboard/api.go:384
GET /api/config/knowledge/connectors Dashboard auth/session Knowledge connectors config (name, type, layer, scope, env/file auth reference) and registered types pkg/dashboard/api.go
PUT /api/config/knowledge/connectors Owner only Replace knowledge.connectors after validation; inline secrets rejected pkg/dashboard/api.go
GET /api/config/knowledge/connectors/status Dashboard auth/session Per-connector status pill, last sync, pages/facts, last error, plus the publish mirror status pkg/dashboard/api.go
POST /api/config/knowledge/connectors/validate Owner only Dry-run validate one connector entry (no network) pkg/dashboard/api.go
POST /api/config/knowledge/connectors/{name}/sync Owner only Start an immediate background sync of one connector pkg/dashboard/api.go
GET /api/config/knowledge/agent-scopes Dashboard auth/session Per-agent knowledge scopes (knowledge.agent_scopes: layers, repos, types, tags, include_states) (docs) pkg/dashboard/api.go
PUT /api/config/knowledge/agent-scopes Owner only Replace knowledge.agent_scopes after validating layer and state names; persisted and audited as config_knowledge_agent_scopes pkg/dashboard/api.go
GET /api/config/knowledge/pipeline Owner only Scalar bead synthesizer, curator, code map and primer settings, plus the read-only engine, vault paths and primer merge strategy (docs) pkg/dashboard/api.go
PUT /api/config/knowledge/pipeline Owner only Update those settings after config.ValidateKnowledgePipeline; 0 or empty restores the default; the bead synthesizer switch applies at once, the rest after a restart; audited as config_knowledge_pipeline pkg/dashboard/api.go
GET /api/knowledge/git-sources Dashboard auth/session Git Sources List pkg/dashboard/api.go:394
POST /api/knowledge/git-sources Owner only Git Sources Connect pkg/dashboard/api.go:395
DELETE /api/knowledge/git-sources Owner only Git Sources Disconnect pkg/dashboard/api.go:396
POST /api/knowledge/obsidian/sync Dashboard auth/session Obsidian Sync pkg/dashboard/api.go:397
GET /api/knowledge/documents Dashboard auth/session Documents List pkg/dashboard/api.go:398
POST /api/knowledge/documents Dashboard auth/session Documents Import pkg/dashboard/api.go:399
GET /api/knowledge/documents/{slug} Dashboard auth/session Document Get pkg/dashboard/api.go:400
DELETE /api/knowledge/documents/{slug} Dashboard auth/session Document Delete pkg/dashboard/api.go:401
POST /api/knowledge/documents/{slug}/reimport Dashboard auth/session Document Reimport pkg/dashboard/api.go:402
GET /api/knowledge/context7/search Dashboard auth/session Context7 Search pkg/dashboard/api.go:403
POST /api/knowledge/cleanup-orphans Dashboard auth/session Cleanup Orphans pkg/dashboard/api.go:404
GET /api/knowledge/channels Dashboard auth/session Knowledge Channels List pkg/dashboard/api.go:367
POST /api/knowledge/channels Dashboard auth/session Knowledge Channel Create pkg/dashboard/api.go:368
GET /api/knowledge/connectors Dashboard auth/session Knowledge connector statuses and publish mirror status ({"connectors": [...], "publish": {...}|null}, see knowledge-connectors.md) pkg/dashboard/api_knowledge_connectors.go:23
POST /api/knowledge/connectors/{name}/sync Owner only Start one connector sync now (202; 404 unknown, 409 running) pkg/dashboard/api_knowledge_connectors.go:24
POST /api/knowledge/publish/sync Owner only Run a publish mirror batch now (202 with publish status; 503 mirror not running, 409 batch in progress) pkg/dashboard/api_knowledge_connectors.go:25

Contribute

Method Path Auth Purpose Source
GET /contribute Public Contribute Landing pkg/dashboard/api_contribute.go:119
GET /contribute/{tab} Public Contribute Landing pkg/dashboard/api_contribute.go:125
GET /api/contribute/ws Public s.contribute Hub.Handle WS pkg/dashboard/api_contribute.go:133
POST /api/contribute/register Public Contribute Register pkg/dashboard/api_contribute.go:134
POST /api/contribute/invite Public Contribute Invite pkg/dashboard/api_contribute.go:140
POST /api/contribute/reissue-token Public Contribute Reissue Token pkg/dashboard/api_contribute.go:141
GET /api/contribute/status Public Contribute Status pkg/dashboard/api_contribute.go:142
GET /api/contribute/activity Public Contribute Activity pkg/dashboard/api_contribute.go:146
GET /api/contribute/fleet Public Contribute Fleet pkg/dashboard/api_contribute.go:147
GET /api/contribute/events Public Contribute Events (SSE). Every frame carries a monotonic seq; a connection whose channel filled gets a gap frame naming how many events it missed, so a long-lived client can tell "nothing happened" from "I missed events" (#6218) pkg/dashboard/api_contribute.go:151
GET /api/contribute/queue Public Contribute Queue pkg/dashboard/api_contribute.go:154
GET /api/contribute/opportunistic Public Contribute Opportunistic pkg/dashboard/api_contribute.go:158
GET /api/contribute/limits Public Contribute Limits pkg/dashboard/api_contribute.go:163
GET /api/contribute/metrics Public Contribute Metrics pkg/dashboard/api_contribute.go:169
GET /api/contribute/me Public path; caller identity resolved server-side (401 anonymous; a signed-in caller with no profile on this hive gets 200 with has_profile:false and no counters, #12111) The caller's OWN contribution stats — issues worked (24h and all-time), completions that produced a verified PR (24h and all-time, #7894), and failures. No username parameter, so it only ever answers for its caller (#6543) pkg/dashboard/api_contribute.go:179
GET /api/contribute/run-stats/models Public Per-model run evidence for the contributor wall: runs, verified-PR share, and failure rate over the selected window. pkg/dashboard/api_contribute.go
GET /api/contribute/wall Public Contributor wall posts when the hive-wide wall switch is enabled; anonymous readers see visible posts, authors can still see their own hidden posts. pkg/dashboard/api_contribute.go
POST /api/contribute/wall Signed-in contributor Create a 500-character plain-text wall post or one-level reply, with optional model, backend, and repo tags. Returns 401 anonymous, 403 when disabled/revoked/muted, and 429 when rate-limited. pkg/dashboard/api_contribute.go
DELETE /api/contribute/wall/{id} Post author Author deletes their own wall post; action is audit logged. pkg/dashboard/api_contribute.go
POST /api/contribute/wall/{id}/hide Owner/read-write Hide a wall post from public readers while leaving it visible to the author; action is audit logged and pushed over /api/contribute/events. pkg/dashboard/api_contribute.go
POST /api/contribute/wall/{id}/flag Signed-in contributor Flag a wall post for Management review; action is audit logged. pkg/dashboard/api_contribute.go
GET /api/contribute/triage Public Contribute Triage pkg/dashboard/api_contribute.go:200
PUT /api/contribute/queue/order Public Contribute Queue Order pkg/dashboard/api_contribute.go:204
POST /api/contribute/queue/hold Public Contribute Queue Hold pkg/dashboard/api_contribute.go:209
POST /api/contribute/queue/hold/clear Public Contribute Queue Hold Clear pkg/dashboard/api_contribute.go:213
GET /api/contribute/interests Public Contribute Interests pkg/dashboard/api_contribute.go:219
PUT /api/contribute/interests Public Contribute Interests pkg/dashboard/api_contribute.go:220
GET /api/contributors Dashboard auth/session Contributors List pkg/dashboard/api_contribute.go:226
GET /api/contributors/{id} Dashboard auth/session Contributor Get pkg/dashboard/api_contribute.go:227
POST /api/contributors/{id}/wall-mute Owner only Mute or unmute a contributor from posting to the contributor wall; action is audit logged. pkg/dashboard/api_contribute.go
PUT /api/contributors/{id}/trust Owner only Contributor Trust pkg/dashboard/api_contribute.go:229
PUT /api/contributors/{id}/agent-role Owner only Contributor Agent Role pkg/dashboard/api_contribute.go:230
PUT /api/contributors/{id}/agent-role-grants Owner only Contributor Agent Role Grants pkg/dashboard/api_contribute.go:231
POST /api/contributors/{id}/revoke Owner only Contributor Revoke pkg/dashboard/api_contribute.go:232
POST /api/contributors/{id}/requeue Dashboard auth/session Contributor Requeue pkg/dashboard/api_contribute.go:233
DELETE /api/contributors/{id} Owner only Contributor Delete pkg/dashboard/api_contribute.go:234
GET /contribute/dossier/{username} Public Contributor Dossier Page (HTML) pkg/dashboard/api_contribute.go:132
GET /api/contribute/run-stats Public Contribute Run Stats pkg/dashboard/api_contribute.go:187
GET /api/contribute/runs Public Contribute Per-Run History pkg/dashboard/api_contribute.go:275
GET /api/contribute/decisions Owner/read-write Contribute Hub Decisions pkg/dashboard/api_contribute.go:285
GET /api/contribute/dossier Public Contribute Dossier Get pkg/dashboard/api_contribute.go:224
POST /api/contribute/dossier Public Contribute Dossier Update pkg/dashboard/api_contribute.go:225
GET /api/leaderboard/contributor/{username}/heraldry Public Contributor Heraldry pkg/dashboard/api_contribute.go:255
GET /api/cards/player/{asset} Public OpenAPI alias for a cacheable contributor social-card SVG (asset is <github-login>.svg). pkg/dashboard/social_cards.go:112
GET /api/cards/achievement/{login}/{asset} Public OpenAPI alias for a cacheable attained-achievement SVG (asset is <achievement-id>.svg). pkg/dashboard/social_cards.go:113
GET /api/cards/leaderboard/{asset} Public OpenAPI alias for a cacheable leaderboard-summary SVG (contributors.svg, teams.svg, or swarm.svg). pkg/dashboard/social_cards.go:114
GET /cards/player/{asset} Public Cacheable 1200×630 SVG social card for one public contributor profile. pkg/dashboard/social_cards.go:109
GET /cards/achievement/{login}/{asset} Public Cacheable SVG achievement-unlocked card for an attained Achievement System 2.0 badge. pkg/dashboard/social_cards.go:110
GET /cards/leaderboard/{asset} Public Cacheable SVG summary card for contributors, teams, or swarm. pkg/dashboard/social_cards.go:111
GET /share/player/{login} Public Share landing page with Open Graph/Twitter metadata for a contributor card and link to the public dossier. pkg/dashboard/social_cards.go:115
GET /share/achievement/{login}/{achievementID} Public Share landing page with metadata for an unlocked achievement card and link to the public dossier. pkg/dashboard/social_cards.go:116
GET /share/leaderboard/{board} Public Share landing page with metadata for a public leaderboard card and link to live standings. pkg/dashboard/social_cards.go:117
PUT /api/contribute/help-links Owner/read-write Contribute Help Links pkg/dashboard/api_contribute.go:145
GET /api/contribute/operators/message Public path; caller identity resolved server-side (401 anonymous, 403 without a profile) Returns only the signed-in contributor's unacknowledged operator messages; no username/body field can select another recipient (#8461). pkg/dashboard/api_contribute.go:180
POST /api/contribute/operators/message Owner/read-write Sends a sanitized, length-capped one-to-one operator note to a contributor profile, persists it until acknowledgement, and pushes it to matching live relay sockets only (#8461). pkg/dashboard/api_contribute.go:181
POST /api/contribute/operators/message/ack Public path; caller identity resolved server-side Acknowledges the signed-in contributor's own message, optionally recording a short sanitized reply for operators. pkg/dashboard/api_contribute.go:182

Issue claims (hivecommons#8380)

Method Path Auth Purpose Source
GET /api/claims Dashboard auth Every live worker claim ({enabled, claims:[…]}); enabled:false when claims.enabled: false pkg/dashboard/claims_api.go:53
GET /api/claims/{owner}/{repo}/{number} Dashboard auth {held, claim} for one issue pkg/dashboard/claims_api.go:54
POST /api/claims/{owner}/{repo}/{number} Signed-in / hub-proxied / GitHub-token caller claims as a human under their login; a verified owner token claims as the owner Body {force, ttl_s, session}. 200 with outcome claimed/renewed/taken_over; 409 with outcome held (same rank, retry with force) or refused (higher rank holds it) and a hint pkg/dashboard/claims_api.go:55
DELETE /api/claims/{owner}/{repo}/{number} Same identity rules Body {force, reason}. Releases your claim or a lower-ranked holder's; force with a verified owner role releases regardless of holder pkg/dashboard/claims_api.go:56

/api/v1 contributor subpaths

handleAPIv1 dispatches authenticated contributor API calls below /api/v1. Every request must carry a GitHub personal access token in the Authorization header, using either the Bearer <token> scheme (hosted clients) or the legacy token <token> scheme (what gh auth token and older hive CLIs send). Both are accepted; the legacy scheme is retained for backward compatibility. Credentials in the query string (?token=) are NOT supported and are rejected, because query strings land in ingress and access logs. The same rule applies to the shared dashboard owner token: send it in the Authorization header, not in URLs. Dashboard terminal links use /api/terminal/handoff to mint a ≤60-second single-use code for the browser navigation instead of putting the owner token in the terminal URL.

Authorization: every /api/v1 path except /api/v1/me additionally requires the caller to be in the hive's authorized-users allowlist (any role), and returns 403 otherwise — contributor, activity and knowledge data are hive-private, not world-readable. /api/v1/me is exempt because it only returns the caller's own profile. Client-supplied X-Hive-User, X-Hive-Role and owner-verified headers are stripped at the top of the handler; identity is always resolved server-side from the validated token.

Method Path Auth Purpose Source
GET/POST /api/v1/status GitHub token + allowlist Contributor status summary pkg/dashboard/api_contribute.go:1528
GET/POST /api/v1/queue GitHub token + allowlist Paginated ready-work listing (?limit=<int>&offset=<int>) over the actionable/offerable backlog pkg/dashboard/api_contribute.go:1524
GET/POST /api/v1/activity GitHub token + allowlist Contributor activity feed pkg/dashboard/api_contribute.go:1530
GET/POST /api/v1/contributors GitHub token + allowlist Contributor list pkg/dashboard/api_contribute.go:1532
GET/POST /api/v1/knowledge GitHub token + allowlist Knowledge export pkg/dashboard/api_contribute.go:1534
GET/POST /api/v1/me GitHub token (self-scoped, no allowlist) Current contributor profile pkg/dashboard/api_contribute.go:1536
POST /api/v1/prs/{owner}/{repo}/{number}/queue-automerge GitHub token + merger/owner role (POST only; GET returns 405) Queue PR auto-merge using the validated actor and current PR head pkg/dashboard/api_contribute.go

Nous / strategy lab

Method Path Auth Purpose Source
GET /api/nous/status Dashboard auth/session Nous Status pkg/dashboard/api.go:438
GET /api/nous/ledger Dashboard auth/session Nous Ledger pkg/dashboard/api.go:439
GET /api/nous/principles Dashboard auth/session Nous Principles pkg/dashboard/api.go:440
POST /api/nous/approve Owner only Nous Approve pkg/dashboard/api.go:441
POST /api/nous/abort Owner only Nous Abort pkg/dashboard/api.go:442
PUT /api/nous/mode Owner only Nous Mode pkg/dashboard/api.go:443
PUT /api/nous/scope Owner only Nous Scope pkg/dashboard/api.go:444
GET /api/nous/phase Dashboard auth/session Nous Phase pkg/dashboard/api.go:445
PUT /api/nous/gate-decision Owner only Nous Gate Decision pkg/dashboard/api.go:446
GET /api/nous/gate-pending Dashboard auth/session Nous Gate Pending pkg/dashboard/api.go:447
POST /api/nous/gate-respond Owner only Nous Gate Respond pkg/dashboard/api.go:448
GET /api/nous/gate-response Dashboard auth/session Nous Gate Response pkg/dashboard/api.go:449
GET /api/nous/config Dashboard auth/session Nous Config Get pkg/dashboard/api.go:450
PUT /api/nous/config/goals Owner only Nous Config Goals pkg/dashboard/api.go:451
PUT /api/nous/config/repos Owner only Nous Config Repos pkg/dashboard/api.go:452
PUT /api/nous/config/output Owner only Nous Config Output pkg/dashboard/api.go:453
PUT /api/nous/config/fast-fail Owner only Nous Config Fast Fail pkg/dashboard/api.go:454
PUT /api/nous/config/schedule Owner only Nous Config Schedule pkg/dashboard/api.go:455
PUT /api/nous/config/controllables Owner only Nous Config Controllables pkg/dashboard/api.go:456
PUT /api/nous/config/principles Owner only Nous Config Principles pkg/dashboard/api.go:457
DELETE /api/nous/principles/{id} Owner only Nous Delete Principle pkg/dashboard/api.go:458

Inception

Method Path Auth Purpose Source
POST /api/inception/start Owner only Inception Start pkg/dashboard/api.go:409
POST /api/inception/scan Owner only Inception Scan pkg/dashboard/api.go:410
GET /api/inception/state Dashboard auth/session Inception State pkg/dashboard/api.go:411
POST /api/inception/questions Owner only Inception Set Questions pkg/dashboard/api.go:412
POST /api/inception/answer Owner only Inception Answer pkg/dashboard/api.go:413
POST /api/inception/facts Owner only Inception Record Facts pkg/dashboard/api.go:414
GET /api/inception/scaffold Dashboard auth/session Inception Scaffold pkg/dashboard/api.go:415
POST /api/inception/approve Owner only Inception Approve pkg/dashboard/api.go:416
POST /api/inception/reset Owner only Inception Reset pkg/dashboard/api.go:417
GET /api/inception/ideation-facts Dashboard auth/session Inception Ideation Facts pkg/dashboard/api.go:418
GET /api/inception/download Dashboard auth/session Inception Download pkg/dashboard/api.go:419
GET /api/inception/has-files Dashboard auth/session Inception Has Files pkg/dashboard/api.go:420
PUT /api/inception/wiki-name Owner only Inception Rename Wiki pkg/dashboard/api.go:421
POST /api/inception/import Owner only Inception Import pkg/dashboard/api.go:422

Beads

Method Path Auth Purpose Source
GET /api/beads Dashboard auth/session Beads List pkg/dashboard/api.go:460
GET /api/beads/{agent} Dashboard auth/session Beads List pkg/dashboard/api.go:461
POST /api/beads/{agent} Owner only Beads Create pkg/dashboard/api.go:462
POST /api/beads/reset Owner only Beads Reset pkg/dashboard/api.go:463
POST /api/beads/reset/{agent} Owner only Beads Reset Agent pkg/dashboard/api.go:464

Dashboard miscellaneous

Method Path Auth Purpose Source
GET /api/audit Read-write role Audit Log — {"entries": [...]} envelope, newest first, capped at 200; response shape and the serve-time user_name field in audit-log.md pkg/dashboard/api.go:53
GET /api/watchdog/activity Read-write role Watchdog activity readout for the Health tab (#7254): watchdog-* audit actions over ?days= (default 30, clamped to 90) — total / taken / observed / byAction, a zero-filled per-day daily histogram, per-agent agents liveness, and the Observe → Heal promotion hint; see agent-watchdog.md pkg/dashboard/api.go:471
POST /api/presence Dashboard auth/session Presence pkg/dashboard/api.go:56
GET /api/prompt-history Dashboard auth/session Prompt History pkg/dashboard/api.go:57
POST /api/self-upgrade Owner only Self Upgrade pkg/dashboard/api.go:58
GET /api/backup/status Owner only Backup Status — available:false with a reason when no encryption key is configured pkg/dashboard/api.go:62
POST /api/backup Owner only Backup Download — 412 when no encryption key is configured (never an unencrypted archive) pkg/dashboard/api.go:63
POST /api/banner-dismissed Dashboard auth/session Banner Dismissed pkg/dashboard/api.go:64
GET /api/history Dashboard auth/session History pkg/dashboard/api.go:75
GET /api/timeline Dashboard auth/session Timeline pkg/dashboard/api.go:77
GET /api/lifecycle-timeline Dashboard auth/session Issue→PR lifecycle journeys plus derived stage timeline. Each journey keeps the dense stages map and adds a backwards-compatible details object for expandable rows: chronological stages with durations, current-stage age, agent, classification attrs, issue/PR links, blocked reason, and kick/run identifiers when recorded. pkg/dashboard/api.go:78
GET /api/pr-throughput Dashboard auth/session Throughput: pull/merge requests and issues across tracked forges. Counts hive-created PRs/issues, hive/observed reviews, observed PR merges/closures, and issue closes over ?hours=N (default 24, capped at audit retention; hours=0 = all time from durable counters in /data/pr-throughput-counters.json) with optional exact case-insensitive ?repo=owner/name and ?role=created|reviewed|merged for the actor trend. The response keeps legacy opened/merged/closed, merged_by_path, buckets, velocity metrics, previous-window trends, top agents/repos/reasons, and recorded_since, and adds by_actor (pr/issue × created/reviewed/merged/closed × hive/human/other) plus series points (t, hive, human, other) for the selected role. pkg/dashboard/api.go:79

| GET | /api/convergence/soak | Owner only | Convergence Soak Status | pkg/dashboard/api.go:245 | | POST | /api/plan/from-issue | Dashboard auth/session | Plan From Issue | pkg/dashboard/api.go:427 | | GET | /api/plan/{epicID} | Dashboard auth/session | Plan Tree | pkg/dashboard/api.go:430 | | POST | /api/plan/{epicID}/approve | Owner only | Plan Approve | pkg/dashboard/api.go:431 | | POST | /api/plan/{epicID}/reject | Owner only | Plan Reject | pkg/dashboard/api.go:433 | | POST | /api/plan/{epicID}/child/{childID} | Owner only | Plan Child Action | pkg/dashboard/api.go:434 | | POST | /api/linear/agent/install | Owner only | Linear Agent Install (OAuth start) | pkg/dashboard/api_linear_agent.go:215 | | GET | /api/linear/agent/status | Owner only | Linear Agent Status | pkg/dashboard/api_linear_agent.go:216 | | POST | /api/linear/agent/disconnect | Owner only | Linear Agent Disconnect | pkg/dashboard/api_linear_agent.go:217 | | GET | /api/upstream-watch | Owner only | Upstream-watch divergence: per watched fork the upstream followed, the watermark and last-run time, surfaced/ported/dismissed/skipped counts, and the recent upstream refs with their upstream URL, diff URL, fork issue number and state. Read-only — it reads the config and the watch state file, never GitHub. Also carries interval, project_repos and each repo's configured entry (config) for the editor. | pkg/dashboard/api.go:287 | | PUT | /api/config/upstream-watch | Owner only | Upstream Watch Config Update: edit upstream_watch from the Features tab. Body {enabled?, interval?, repos?: {<repo>: {upstream?, sources?, pr_labels?, max_issues_per_run?, label?} \| null}} — absent keys are unchanged, null removes a repo, keys are stored as the bare repo name. Validated with the loader's rules before the config changes (400 on failure), then persisted and audited as config_upstream_watch. | pkg/dashboard/api.go:288 |

| GET | /api/widget | Dashboard auth/session | Widget | pkg/dashboard/api.go:106 | | GET | /api/pane/{agent} | Dashboard auth/session | Pane | pkg/dashboard/api.go:111 | | GET | /api/role | Dashboard auth/session | Role | pkg/dashboard/api.go:125 | | POST | /api/reset-restarts/{agent} | Owner only | Reset Restarts | pkg/dashboard/api.go:147 | | GET | /api/budget-ignore | Dashboard auth/session | Budget Ignore Get | pkg/dashboard/api.go:164 | | POST | /api/budget-ignore | Owner only | Budget Ignore Set | pkg/dashboard/api.go:165 | | GET | /api/summaries | Dashboard auth/session | Summaries | pkg/dashboard/api.go:177 | | POST | /api/prs/{owner}/{repo}/{number}/queue-automerge | Merger/owner role | Queue PRAuto Merge | pkg/dashboard/api.go:178 | | GET | /api/inference/models/{backend} | Dashboard auth/session | Inference Models | pkg/dashboard/api.go:344 | | GET | /api/hive-id | Dashboard auth/session | Hive IDGet | pkg/dashboard/api.go:406 | | PUT | /api/hive-id | Owner only | Hive IDSet | pkg/dashboard/api.go:407 | | POST | /api/chat | Dashboard auth/session | Chat | pkg/dashboard/api.go:436 | | GET | /api/auth/token | Public | Auth Token | pkg/dashboard/api.go:466 | | GET | /api/v1/ | GitHub token | Contributor v1 API dispatcher | pkg/dashboard/api_contribute.go:236 | | POST | /api/v1/ | GitHub token | Contributor v1 API dispatcher | pkg/dashboard/api_contribute.go:237 | | GET | /api/docs | Dashboard auth/session | APIDocs | pkg/dashboard/api_contribute.go:238 | | GET | /leaderboard | Public | Leaderboard Page | pkg/dashboard/api_contribute.go:240 | | GET | /api/leaderboard | Public | Leaderboard API | pkg/dashboard/api_contribute.go:241 | | GET | /api/leaderboard/teams | Public | Team Leaderboards | pkg/dashboard/api_contribute.go:242 | | GET | /api/leaderboard/style | Public | Leaderboard Style | pkg/dashboard/api_contribute.go:243 | | GET | /api/leaderboard/battle-log | Public | Scrubbed public Battle Log activity feed for leaderboard widgets. | pkg/dashboard/battle_log.go:108 | | GET | /api/leaderboard/hive-of-week | Public | Featured weekly project metadata, configured render URLs (empty when none), gource source URL, and embed snippets. | pkg/dashboard/battle_log.go:109 | | GET | /api/leaderboard/gource-log | Public | Gource custom log source for a project/week, derived from public hive event data. | pkg/dashboard/battle_log.go:110 | | POST | /api/leaderboard/hive-of-week/archive | Owner only | Archive the selected project's weekly gource source log into knowledge; stores source only, never rendered video. | pkg/dashboard/battle_log.go:111 | | GET | /api/leaderboard/contributor/{username} | Public | Contributor Profile | pkg/dashboard/api_contribute.go:250 | | GET | /api/hives | Dashboard auth/session | Hives List | pkg/dashboard/api_contribute.go:261 | | POST | /api/hives/register | Dashboard auth/session | Hives Register | pkg/dashboard/api_contribute.go:262 | | POST | /api/hives/{id}/heartbeat | Dashboard auth/session | Hives Heartbeat | pkg/dashboard/api_contribute.go:263 | | DELETE | /api/hives/{id} | Owner only | Hives Delete | pkg/dashboard/api_contribute.go:264 | | POST | /api/hives/onboard | Dashboard auth/session | Hives Onboard | pkg/dashboard/api_contribute.go:265 | | GET | /sso | Public | SSO | pkg/dashboard/server.go:1361 |

Hub SaaS

Method Path Auth Purpose Source
GET /api/saas/my-hives Hub auth My Hives pkg/hub/saas.go:371
GET /api/hub/widget Hub auth iPhone fleet widget (#12148): every hive the caller can see (hub admins: all; others: hives they own or hold a role on; pool placeholders excluded), sorted by act_issues + act_prs descending. Per hive id, project, url, online, acmm_level, issues, prs (all open, from the heartbeat; 0 from spokes that do not report them), act_issues, act_prs, agents_running, agents_total, last_heartbeat; totals (hives, online, need_you, the same counts summed) and history (fleet act_issues/act_prs per 15-minute bucket, t in Unix seconds, at most 48 points). See iOS widget pkg/hub/saas.go:372
GET /api/saas/usage Hub auth Usage pkg/hub/saas.go:381
POST /api/saas/hives Hub auth Create Hive pkg/hub/saas.go:394
GET /api/saas/hives/{id}/status Hub auth Hive Status pkg/hub/saas.go:395
POST /api/saas/hives/{id}/pin-digest Hub auth (owner) Pin Digest - hold the spoke at an immutable image digest ({"digest":"sha256:..."} or {"sha":"<short git SHA>"}, optional reason) pkg/hub/digest_pin.go
POST /api/saas/hives/{id}/unpin-digest Hub auth (owner) Unpin Digest - lift the pin and return to the tracked channel or branch tag pkg/hub/digest_pin.go
GET /api/saas/hives/{id}/digest-pin Hub auth (owner) Digest Pin - the pin with provenance and whether the spoke reports running it pkg/hub/digest_pin.go
GET /api/saas/hives/{id}/open Hub handler-specific Open Hive pkg/hub/saas.go:400
DELETE /api/saas/hives/{id} Hub auth Delete Hive pkg/hub/saas.go:401
POST /api/saas/hives/{id}/upgrade Hub auth Upgrade Hive pkg/hub/saas.go:402
POST /api/saas/hives/{id}/switch-branch Hub auth Switch Branch pkg/hub/saas.go:403
PUT /api/saas/hives/{id}/visibility Hub auth Toggle Visibility pkg/hub/saas.go:410
PUT /api/saas/hives/{id}/auto-upgrade Hub auth Toggle Auto Upgrade pkg/hub/saas.go:411
PUT /api/saas/hives/{id}/name Hub auth Rename Hive pkg/hub/saas.go:415
POST /api/saas/hives/{id}/forge Hub auth Switch Forge pkg/hub/saas.go:420
POST /api/saas/hives/{id}/reset-app Hub auth Reset App pkg/hub/saas.go:421
POST /api/saas/hives/{id}/restart-spoke Hub auth Restart Spoke pkg/hub/saas.go:426
GET /api/saas/hive-config/{hiveID} Hub auth Proxy Hive Config pkg/hub/saas.go:427
GET /api/saas/latest-sha Hub handler-specific Latest SHA pkg/hub/saas.go:428
GET /api/hub/release/stable-promotion Public Stable Promotion State pkg/hub/saas.go:430
POST /api/saas/hub/upgrade Hub handler-specific Hub Self Upgrade pkg/hub/saas.go:431
PUT /api/saas/hub/auto-upgrade Hub handler-specific Hub Auto Upgrade pkg/hub/saas.go:432
PUT /api/hub/release/stable-promotion Hub admin Stable Promotion Toggle (audit-logged) pkg/hub/saas.go:433
GET /api/saas/auth-check Hub handler-specific Saa SAuth Check pkg/hub/saas.go:438
POST /api/saas/user-token Hub auth User Token pkg/hub/saas.go:449
GET /api/saas/hives/{id}/access Hub auth Access List pkg/hub/saas.go:450
GET /api/saas/grantable-users Hub auth Grantable Users pkg/hub/saas.go:451
POST /api/saas/hives/{id}/access Hub auth Access Add pkg/hub/saas.go:452
DELETE /api/saas/hives/{id}/access/{username} Hub auth Access Remove pkg/hub/saas.go:453
POST /api/saas/hives/{id}/request-access Hub auth Request Access pkg/hub/saas.go:454
GET /api/saas/hives/{id}/requests Hub auth Get Requests pkg/hub/saas.go:455
GET /api/saas/hives/{id}/timeline Hub auth Hive Timeline pkg/hub/saas.go:456
POST /api/saas/hives/{id}/requests/{username}/approve Hub auth Approve Request pkg/hub/saas.go:458
POST /api/saas/hives/{id}/requests/{username}/deny Hub auth Deny Request pkg/hub/saas.go:459
PUT /api/saas/hives/{id}/approve-access/{username} Hub auth Approve Access pkg/hub/saas.go:460
DELETE /api/saas/hives/{id}/deny-access/{username} Hub auth Deny Access pkg/hub/saas.go:461
GET /api/saas/access-status Hub handler-specific Access Status pkg/hub/saas.go:462
POST /api/saas/request-provision Hub auth Request Provision pkg/hub/saas.go:470
PUT /api/saas/approve-provision/{username} Hub handler-specific Approve Provision pkg/hub/saas.go:471
DELETE /api/saas/deny-provision/{username} Hub handler-specific Deny Provision pkg/hub/saas.go:472
GET /api/saas/admin/available-placeholders Hub handler-specific Available Placeholders pkg/hub/saas.go:473
GET /api/saas/admin/users Hub handler-specific Admin Users pkg/hub/saas.go:476

GET /api/saas/admin/users includes cached affiliation, affiliation_source, profile_bio, profile_location, public_activity, top_repo, and top_repo_url fields for the Hub Admin — Users AFFILIATION column. The cache identifies who a signup appears affiliated with from public GitHub/GHE footprint only, ranked as profile company, contributed-to repo owner/org (excluding the personal namespace), public org membership, then top-repo owner/independent fallback; bio/location are supporting tooltip context, and public_activity buckets recent public events as quiet, active, or prolific. Provider API refreshes are asynchronous and daily, so the table never blocks on GitHub/GHE and never requires Hive activity.

| PUT | /api/saas/admin/users/{username} | Hub handler-specific | Admin Update User | pkg/hub/saas.go:499 | | DELETE | /api/saas/admin/users/{username} | Hub handler-specific | Admin Delete User | pkg/hub/saas.go:500 | | POST | /api/saas/admin/impersonate/exit | Hub handler-specific | Impersonate Exit | pkg/hub/saas.go:506 | | POST | /api/saas/admin/impersonate/{username} | Hub handler-specific | Impersonate Start | pkg/hub/saas.go:507 | | GET | /api/saas/impersonation-status | Hub auth | Impersonation Status | pkg/hub/saas.go:508 | | POST | /api/saas/hives/{id}/assign | Hub auth | Assign Hive | pkg/hub/saas.go:509 | | POST | /api/saas/hives/{id}/reset-assignment | Hub handler-specific | Reset Assignment | pkg/hub/saas.go:513 | | GET | /api/saas/cluster-health | Hub handler-specific | Cluster Health | pkg/hub/saas.go:514 | | POST | /api/saas/admin/alert-ack | Hub handler-specific | Alert Ack | pkg/hub/saas.go:527 | | GET | /api/saas/admin/cluster-app-keys | Hub handler-specific | Get Cluster App Keys | pkg/hub/saas.go:531 | | PUT | /api/saas/admin/cluster-app-keys/{clusterID} | Hub handler-specific | Put Cluster App Key | pkg/hub/saas.go:532 | | POST | /api/saas/admin/hub-banner | Hub handler-specific | Send Hub Banner | pkg/hub/saas.go:533 | | DELETE | /api/saas/admin/hub-banner | Hub handler-specific | Clear Hub Banner | pkg/hub/saas.go:534 | | GET | /api/saas/admin/hub-banner | Hub handler-specific | Get Hub Banner | pkg/hub/saas.go:535 | | POST | /api/saas/slack/user/{username} | Hub auth | Slack Message User | pkg/hub/saas.go:542 | | POST | /api/saas/hives/{id}/slack | Hub auth | Slack Message Hive Owner | pkg/hub/saas.go:543 | | POST | /api/saas/admin/slack/broadcast | Hub handler-specific | Slack Broadcast | pkg/hub/saas.go:544 | | POST | /api/saas/admin/journey-snooze | Hub handler-specific | Journey Snooze | pkg/hub/saas.go:545 | | GET | /api/saas/admin/journey-status | Hub handler-specific | Journey Status | pkg/hub/saas.go:546 | | GET | /api/saas/me/country | Hub auth | My Country Get | pkg/hub/saas.go:391 | | PUT | /api/saas/me/country | Hub auth | My Country Set (write blocked while impersonating) | pkg/hub/saas.go:392 | | POST | /api/saas/lite/enroll | Hub auth | Hive Lite Enroll | pkg/hub/saas.go:393 | | PUT | /api/saas/hives/{id}/secondary-app | Hub auth | Assign Secondary GitHub App | pkg/hub/saas.go:425 | | POST | /api/saas/hives/{id}/agents/{agent}/restarts/reset | Hub auth | Reset Agent Restart Counter | pkg/hub/saas.go:416 | | GET | /api/saas/upgrade-pause | Hub admin | Upgrade Kill-Switch State | pkg/hub/saas.go:436 | | POST | /api/saas/upgrade-pause | Hub admin | Upgrade Kill-Switch Toggle (audit-logged) | pkg/hub/saas.go:437 | | GET | /api/saas/whoami | Hub handler-specific | Session Identity (stable key + profile) | pkg/hub/saas.go:444 | | GET | /api/saas/dibs/repos | Hub handler-specific | Dibs Repo/Owner List (public, short shared cache) | pkg/hub/saas.go:448 | | GET | /api/saas/hives/{id}/access-log | Hub auth | Permission-Change Audit Log | pkg/hub/saas.go:457 | | GET | /api/saas/admin/scale-settings | Hub admin | Placeholder Pool Scale Settings Get | pkg/hub/saas.go:474 | | POST | /api/saas/admin/scale-settings | Hub admin | Placeholder Pool Scale Settings Set | pkg/hub/saas.go:475 | | GET | /api/saas/admin/user-countries | Hub admin | User Country Rollup | pkg/hub/saas.go:484 | | GET | /api/saas/admin/auth-rollout | Hub admin | Auth Rollout Readiness Summary | pkg/hub/saas.go:489 | | GET | /api/saas/admin/notifications | Hub admin | Hub Notifications Get | pkg/hub/saas.go:490 | | PUT | /api/saas/admin/notifications | Hub admin | Hub Notifications Update + hot reload | pkg/hub/saas.go:491 | | GET | /api/saas/admin/key-generations | Hub admin | Token-Crypto Key Generations | pkg/hub/saas.go:497 | | POST | /api/saas/admin/rotate-master-key | Hub admin | Rotate Token Master Key (double-call refused) | pkg/hub/saas.go:498 | | GET | /api/saas/admin/advisory-diagnostics | Hub admin | Fleet Advisory/App-State Diagnostics | pkg/hub/saas.go:524 | | POST | /api/saas/hives/bulk | Hub auth | Bulk Hive Action | pkg/hub/saas_bulk.go:89 | | GET | /api/saas/me/country | Hub auth | My Country Get | pkg/hub/saas.go:391 | | PUT | /api/saas/me/country | Hub auth | My Country Set (write blocked while impersonating) | pkg/hub/saas.go:392 | | POST | /api/saas/lite/enroll | Hub auth | Hive Lite Enroll | pkg/hub/saas.go:393 | | PUT | /api/saas/hives/{id}/secondary-app | Hub auth | Assign Secondary GitHub App | pkg/hub/saas.go:425 | | POST | /api/saas/hives/{id}/agents/{agent}/restarts/reset | Hub auth | Reset Agent Restart Counter | pkg/hub/saas.go:416 | | GET | /api/saas/upgrade-pause | Hub admin | Upgrade Kill-Switch State | pkg/hub/saas.go:436 | | POST | /api/saas/upgrade-pause | Hub admin | Upgrade Kill-Switch Toggle (audit-logged) | pkg/hub/saas.go:437 | | GET | /api/saas/whoami | Hub handler-specific | Session Identity (stable key + profile) | pkg/hub/saas.go:444 | | GET | /api/saas/dibs/repos | Hub handler-specific | Dibs Repo/Owner List (public, short shared cache) | pkg/hub/saas.go:448 | | GET | /api/saas/hives/{id}/access-log | Hub auth | Permission-Change Audit Log | pkg/hub/saas.go:457 | | GET | /api/saas/admin/scale-settings | Hub admin | Placeholder Pool Scale Settings Get | pkg/hub/saas.go:474 | | POST | /api/saas/admin/scale-settings | Hub admin | Placeholder Pool Scale Settings Set | pkg/hub/saas.go:475 | | GET | /api/saas/admin/user-countries | Hub admin | User Country Rollup | pkg/hub/saas.go:484 | | GET | /api/saas/admin/auth-rollout | Hub admin | Auth Rollout Readiness Summary | pkg/hub/saas.go:489 | | GET | /api/saas/admin/notifications | Hub admin | Hub Notifications Get | pkg/hub/saas.go:490 | | PUT | /api/saas/admin/notifications | Hub admin | Hub Notifications Update + hot reload | pkg/hub/saas.go:491 | | GET | /api/saas/admin/key-generations | Hub admin | Token-Crypto Key Generations | pkg/hub/saas.go:497 | | POST | /api/saas/admin/rotate-master-key | Hub admin | Rotate Token Master Key (double-call refused) | pkg/hub/saas.go:498 | | GET | /api/saas/admin/advisory-diagnostics | Hub admin | Fleet Advisory/App-State Diagnostics | pkg/hub/saas.go:524 |

Hub server

Method Path Auth Purpose Source
GET /login Hub handler-specific Login pkg/hub/oauth.go:69
GET /login/{provider} Hub handler-specific Per-Provider Login (github or OIDC provider) pkg/hub/oauth.go:72
GET /api/auth/callback Hub handler-specific OAuth Callback pkg/hub/oauth.go:73
GET /api/auth/user Hub handler-specific Auth User pkg/hub/oauth.go:74
POST /api/auth/logout Hub handler-specific Logout pkg/hub/oauth.go:75
GET /api/openrouter/connect/start Hub auth Hub Open Router Start pkg/hub/openrouter.go:26
GET /api/openrouter/qr Hub auth Hub Open Router QR pkg/hub/openrouter.go:27
GET /api/openrouter/models Hub auth Hub Open Router Models pkg/hub/openrouter.go:28
GET /api/openrouter/credit Hub auth Hub Open Router Credit pkg/hub/openrouter.go:29
GET /openrouter/callback Hub handler-specific Hub Open Router Callback pkg/hub/openrouter.go:30
GET /dashboard Hub handler-specific Dashboard pkg/hub/saas.go:369
GET /access-denied Hub handler-specific Access Denied pkg/hub/saas.go:370
GET /api/hub/clusters Hub auth List Clusters pkg/hub/saas.go:528
GET /api/hub/image-pulls Hub auth Per-Release Image Pull Series pkg/hub/saas.go:377
GET /api/reach Hub admin PR Reach Report (?pr=NNN or ?recent=K) pkg/hub/saas.go:519
GET /fleet Hub handler-specific My-Hives Fleet Page (static; data via /api/saas/my-hives) pkg/hub/server.go:1726
GET /my-hives Hub handler-specific 301 redirect to /fleet (query preserved) pkg/hub/server.go:1727
POST /api/heartbeat Hub handler-specific Heartbeat pkg/hub/server.go:1668
POST /api/task-status Hub handler-specific Task Status pkg/hub/server.go:1669
GET /api/registry Hub handler-specific Registry pkg/hub/server.go:1677
GET /api/hub/leaderboard Hub handler-specific Leaderboard pkg/hub/server.go:1678
GET /api/hub/stats Hub handler-specific Stats pkg/hub/server.go:1679
GET /api/fleet-stats Hub handler-specific Fleet Stats pkg/hub/server.go:1680
GET /api/hub/evidence Hub admin Read-only cross-hive evidence drill-down from each spoke's stored heartbeat evidence summary (#12116); non-admins get 403. Returns spokes, reporting, pooled calibration (bucket 0–5 → bad-outcome rate), by_acmm_level (level, hives, merged_90d, revert_rate), family_false_approve_rate (same/cross/mixed, hives classed by their reviewer vs author family sets), fleet record_coverage (merged PRs with an evidence record over prs_merged_90d), and per hive hives[] with acmm_level, prs_merged_90d, record_coverage, family_mix, false-approve / false-block / revert rates, families and a calibration series. Every rate is {n, rate, lo, hi} with a 95% Wilson interval; rate/lo/hi are null when n < 10. Hub admins open it from the Fleet quadrant card (#12117); the per-axis criteria table, median time-to-merge and author-kind revert rate are not emitted yet (#12080). Never consulted by merge decisions pkg/hub/evidence.go
GET /api/hub/version Hub handler-specific Hub Version pkg/hub/server.go:1684
DELETE /api/hub/registry/{id} Hub handler-specific Registry Delete pkg/hub/server.go:1694
POST /api/contribute/register Hub handler-specific Contribute Proxy pkg/hub/server.go:1695
GET /api/contribute/status Hub handler-specific Contribute Status pkg/hub/server.go:1696
GET /api/contribute/ws Hub handler-specific Contribute WSProxy pkg/hub/server.go:1697
POST /api/github/webhook Hub handler-specific GitHub Webhook pkg/hub/server.go:1698
GET /gh-setup Hub handler-specific GitHub App Setup Router pkg/hub/server.go:1699
GET /learn Hub handler-specific Static HTML page pkg/hub/server.go:1700
GET /get-started Hub handler-specific Static HTML page pkg/hub/server.go:1701
GET /api/docs Hub handler-specific Static HTML page pkg/hub/server.go:1704
GET /api/reading-list Hub handler-specific Reading List pkg/hub/server.go:1707
GET /reading Hub handler-specific Static HTML page pkg/hub/server.go:1708
GET /cncf-reference-architecture Hub handler-specific Static HTML page pkg/hub/server.go:1715
GET /cncf-reference-architecture/console Hub handler-specific Static HTML page pkg/hub/server.go:1716
GET /cncf-reference-architecture/bluefin Hub handler-specific Static HTML page pkg/hub/server.go:1717
GET /{$} Hub handler-specific Static HTML page pkg/hub/server.go:1734
GET /og-card.png Hub handler-specific OGCard pkg/hub/server.go:1739
GET / Public Static asset fallback (http.FileServerFS over the embedded static/ tree) for any path no other route claims pkg/hub/server.go:1741