Synced from Hive. This page is pulled from hivecommons/hive@v5 during the docs build. Edit the canonical source in the Hive repository.
Dashboard REST API reference — Health, status, events
Contributor pool counters
GET /api/status includes contributorPool.abandoned, the sum of persisted
abandoned-PR counters across all registered profiles, and
contributorPool.abandoned_by_login, an object keyed by lowercase GitHub login.
Offline and revoked contributors remain included; zero-count logins are present.
An empty registry returns abandoned: 0 and abandoned_by_login: {}. These are
historical adoption counts, not failed tasks or disconnected task runs.
GET /api/contributors provides each profile’s abandoned and abandoned_prs
records (repo, pr, adopted_into_pr, reason, at). The Contributors tile
shows a nonzero count with the five most recent records in its tooltip.
See Abandoned contributor PRs
for counting semantics.
Endpoints
Part of the Dashboard REST API reference; see that page for how auth levels and pkg/<file>:<line> source citations are read and checked. Edit this file for routes in this area and run src/scripts/check-api-reference-citations.sh --fix to resync citations.
| 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). Also startedAt (RFC3339 process start — changes on every pod roll even when the build does not, so the dashboard can say “Restarted” vs “Upgraded”) and, until the first status is published, startupPhase/startupPhaseLabel (the boot phase a fresh pod is in) (#15788) | pkg/dashboard/api.go:45 |
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:46 |
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:70 |
GET | /api/health | Public | Basic health probe | pkg/dashboard/server.go:1745 |
GET | /api/health/deep | Public | Deep health probe | pkg/dashboard/server.go:1746 |
GET | /api/livez | Public | Kubernetes liveness probe | pkg/dashboard/server.go:1747 |
GET | /metrics | Registered only when HIVE_METRICS_ENABLED; requires `Authorization: ****** (403 if the token is unset) | Prometheus metrics | pkg/dashboard/server.go:1753 |
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, the hold labels, stage/071-needs-author and the reporter-trust awaiting label (#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; a working agent also carries agents[].run — the live per-run line (#14576): \{since, elapsedS, costUSD, tokens, priced, tests, filesChanged\}, the estimated spend/tokens since the kick was delivered (lastKickAt, falling back to busySince) (delta of the token collector’s per-agent cumulative figure; priced:false when the agent has none yet), the last visible test-runner result (pass/fail/empty) and the last N files changed git summary (-1 when none) parsed from the captured pane; top-level fleetRun \{running, hourUSD, hourPriced, dayUSD, weekUSD, monthUSD, windowsPriced\} is the governor strip’s rotating running N · $X this hour / today / this week / this month figure (#15614) — the hour is the rise since the top of the clock hour, the wider windows are the daily cost ledger summed from 00:00 UTC today, Monday 00:00 UTC (ISO week) and the 1st 00:00 UTC plus the rise since the ledger’s last snapshot, windowsPriced:false when there is no ledger yet; 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); staleSince and repos[].countsStale / countsStaleSince mark totals served from last-good figures — the previous enumeration (#13382) or the ForgeState cache’s last-good counts (#13376); ci_failure_signals \{count, last, kicks, unmatched\} is the webhook CI-failure signal store — distinct red (repo, head, check) signals retained, the most recent one \{repo, number, head_sha, check, conclusion, details_url, agent, at\}, webhook-triggered kicks/nudges since boot, and failure deliveries whose head matched no open PR; workflow_approvals \{approved, denied, permission_errors, last\} counts the hive’s approvals of GitHub-gated workflow runs since boot (#16603) — runs approved, runs refused by the trust policy (once per head), 403/404 refusals for want of actions: write, and the most recent decision \{repo, number, head, run_id, outcome, at\}; hotspots \{count, actionable, filed\} is the merge-hotspot advisor’s one-line summary (files at/above the thresholds, those with a split recommendation, those with a modularize issue filed), absent when the advisor is not wired — details on GET /api/hotspots; writeback.dedupe \{enabled, dedupe_same_item, dedupe_burst, rate_capped, hourly_cap, burst_items, burst_window_s, same_item_ttl_s\} is the write-back gate’s content layer — the effective writeback.dedupe.* settings and the last-hour counts of writes held as duplicate, burst and rate-capped (each also listed under GET /api/writeback/suppressed); referenceRepos[] \{full, tier, reference_tier\} lists project.reference_repos apart from repos[] — reference_tier is read-only, issues, prs or issues+prs (tier is the same value, kept for older clients) and an entry carries no ACMM, work-item or pause fields, since a reference repo is studied, not worked (#18021); config.gate_regressions[] \{gate, previous, effective, source\} is the boot-time safety-gate regression list (#16438) — gates a previous runtime overlay on the PVC carried that the running config lacks or loosens (review.require_labels, project.issue_filter.require_labels, project.paused_repos[<repo>], writeback.per_repo[<repo>].mode), empty on a healthy boot | pkg/dashboard/server.go:1758 |
GET | /api/status/summary | Dashboard auth/session | Compact agent/governor/budget status summary for pollers; honors Accept-Encoding: gzip | pkg/dashboard/server.go:1759 |
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:1760 |
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:1761 |
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:1762 |
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:1763 |
GET | /api/events | Dashboard auth/session | Server-sent event stream | pkg/dashboard/server.go:1764 |
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:91 |
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:92 |
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:93 |
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:95 |
POST | /api/runs/\{key\}/checkpoint | Owner only | Resolve a compact checkpoint decision. Body `{“action”:“approve” | “reject”,“gen”:<lease generation>}`; 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:97 |
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:98 |
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, superseded_by when a newer Revise revision exists, and recheck status (enabled, interval, last_at, next_at, in_flight, last_delta_count, external_count, sources_failed). | pkg/dashboard/api.go:99 |
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:100 |
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:102 |
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:103 |
DELETE | /api/campaigns/\{id\} | Owner only | Delete a campaign record: removes the archived Inception state and wiki snapshot for the stable campaign id and audit-logs campaign_delete. Knowledge-base facts, Jam threads, scaffolded repo files and other revisions in the same chain are kept; deleting the live L1 session clears it. Run-backed Spektacular campaigns return 409 Conflict; unknown ids 404. | pkg/dashboard/api.go:104 |
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:105 |
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:106 |
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:107 |
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:108 |
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:109 |
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:110 |
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:111 |
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:112 |
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:113 |
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:114 |
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:115 |
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:116 |
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:117 |
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:94 |