NovaFabric REST API Reference

Status: works today (v0.98.0). Generated from the live nova serve FastAPI route table (src/novafabric/serve/app.py).

The nova serve dashboard server exposes 207 REST endpoints. All require a valid auth token except the unauthenticated probes GET /api/health, GET /livez, and GET /readyz. The multi-tenant nova server API is specified separately in api/openapi.yaml.

Generated by design/scripts/gen_api_reference.py — re-run it after route changes rather than editing endpoints by hand.

TV-5 3D topology routes (experimental). When the server is started with nova serve --tv5, an additional router is mounted at /api/tv5/ (src/novafabric/serve/topology/router_tv5.py): GET /api/tv5/live (Arrow delta stream), GET /api/tv5/windows, GET /api/tv5/snapshot/{window_id}, and a WS /api/tv5/ws websocket. These are conditional and eval-gated, so they are not in the generated table above. Since v0.97.0 they are authenticated — the HTTP routes are token-gated like every other /api/* route, and the WebSocket enforces the localhost Host guard (close code 4403) and the token (close code 4401) before accepting the connection — on the WebSocket the token must arrive as a ?token= query parameter, since browsers cannot set headers on a WS connect. Previously this router was mounted with no auth at all; a custom TV-5 client that connected without a token must now supply one.

Health & meta (9)

Method Path Summary
GET / serve no dashboard
GET /api/adapters List registered Nova framework adapters with availability flags.
GET /api/docs swagger ui html
GET /api/doctor Run diagnostic checks on the NovaFabric installation (nova doctor).
GET /api/health health
GET /api/openapi.json openapi
GET /api/stats Aggregate counts for the HomeTab.
POST /api/validate-spec Validate an asset YAML spec without registering — mirrors nova validate <spec>.
GET /docs/oauth2-redirect swagger ui redirect

Runs & capsules (33)

Method Path Summary
POST /api/capsule-migrate Migrate a v0.1.x capsule directory to v1.0.0 format (ADR-0034 §6).
POST /api/otlp/v1/traces Ingest OTLP OTel GenAI spans into a run capsule (NF-034, experimental).
GET /api/runs list runs
GET /api/runs/cost-summary Return per-run token and cost totals from ClickHouse.
GET /api/runs/search Cursor-based run listing. True keyset paging: the cursor seeks the index directly — O(page), no cursor-to-offset conversion (ADR-0199 B2).
GET /api/runs/stream Server-Sent Events stream of new run summaries.
GET /api/runs/suggest-register Return asset registration suggestions derived from recent capsules.
DELETE /api/runs/{run_id} Delete a capsule directory, subject to legal holds and retention policy.
GET /api/runs/{run_id} get run
GET /api/runs/{run_id}/children Return parent capsule metadata + list of child capsule summaries.
GET /api/runs/{run_id}/diagnose Attribute a failed run to its most likely responsible step.
GET /api/runs/{run_id}/energy Energy-Anchored Action Receipts + conservation for a run (ADR-0093).
POST /api/runs/{run_id}/export-system-card Generate and SEAL an auto-generated system/audit card.
GET /api/runs/{run_id}/file/{filepath:path} get run file
GET /api/runs/{run_id}/forensics-timeline Reconstruct a deterministic forensics timeline from a run's sealed capsule (ADR-0155 D1; see note below).
GET /api/runs/{run_id}/ledger Adversary-anchored ledger verification status (ADR-0094).
POST /api/runs/{run_id}/redact redact endpoint
GET /api/runs/{run_id}/redaction-proof get redaction proof endpoint
GET /api/runs/{run_id}/redaction-xray Field-protection overlay for one capsule (ADR-0174).
POST /api/runs/{run_id}/replay/dry-run dry run replay endpoint
POST /api/runs/{run_id}/replay/exact exact replay endpoint
POST /api/runs/{run_id}/replay/forensic forensic replay endpoint
POST /api/runs/{run_id}/replay/semantic semantic replay endpoint
GET /api/runs/{run_id}/run-lineage List spool lineage edges for a distributed run — nova run lineage.
GET /api/runs/{run_id}/safety-case Compile an evidence-grounded safety case for a run (ADR-0095).
GET /api/runs/{run_id}/scan-secrets Report secret/PII findings from the redaction log — nova scan-secrets.
POST /api/runs/{run_id}/scores Append one externally-computed score to the run's scores.jsonl.
GET /api/runs/{run_id}/tool-permission-events Return ToolPermissionEvent records for a capsule.
GET /api/runs/{run_id}/tree Show the parent/child capsule tree — nova run show --with-children.
GET /api/runs/{run_id}/trust-radar Trust guarantees for one capsule (ADR-0173).
POST /api/runs/{run_id}/validate Validate a capsule's schema and required files.
POST /api/runs/{run_id}/validate-distributed Validate a distributed parent capsule + its workers (nova run validate-distributed).
POST /api/runs/{run_id}/verify Verify DSSE signature + RFC 3161 timestamp + Merkle log inclusion (nova verify).

Content search on GET /api/runs/search — scope parameter (experimental, ADR-0204)

GET /api/runs/search accepts an additive scope=meta|content|all query parameter (default meta):

If the host SQLite lacks FTS5, content scopes return a 501 error envelope ({"error": {"code": "fts5_unavailable", …}}); scope=meta is unaffected. Postgres (nova server) parity is planned — no target version.

GET /api/runs/{run_id}/forensics-timeline (ADR-0155 D1)

Reconstructs a deterministic forensics timeline from a run's own sealed capsule via the pure forensics/timeline.py::merge_timeline core — the same merge nova forensics timeline uses. Honest scope: it only reconstructs what the capsule already carries (run start/finish, model-call and tool-call events with a usable timestamp); a documented follow-on "incident → session → lineage collector" does not exist yet, so lineage coverage is always reported as a gap, never fabricated. Each source is capped (MAX_EVENTS_PER_SOURCE); anything beyond the cap is a gap, not a silent drop.

Assets & registry (19)

Method Path Summary
GET /api/assets list assets endpoint
POST /api/assets register asset endpoint
POST /api/assets/register-from-yaml Register an asset from a YAML spec string (used by suggest-register panel).
GET /api/assets/{asset_id} Asset detail with its recent eval history (bounded: eval_limit default 50, max 500; adds eval_results_total/eval_results_truncated).
GET /api/assets/{asset_id}/approvals Return approval records for an asset (by UUID).
POST /api/assets/{asset_id}/approve approve asset endpoint
POST /api/assets/{asset_id}/eval Eval by UUID — resolves name+version from the registry then delegates.
GET /api/assets/{asset_id}/eval-history eval history endpoint
POST /api/assets/{asset_id}/promote Promote by UUID — resolves name+version from the registry then delegates.
GET /api/assets/{name}/diff asset spec diff endpoint
POST /api/assets/{name}/rollback rollback asset endpoint
DELETE /api/assets/{name}/{version} Hard-delete an asset from the registry (nova unregister).
GET /api/assets/{name}/{version} get asset endpoint
POST /api/assets/{name}/{version}/eval eval asset endpoint
POST /api/assets/{name}/{version}/promote promote asset endpoint
GET /api/diff diff runs
POST /api/eval/compare Compare two EvalResult JSON objects for regression — mirrors nova eval compare.
POST /api/eval/run Run a standard eval suite against a capsule — nova eval run.
GET /api/eval/suites List registered eval suite adapters — nova eval list.

Lineage (8)

Method Path Summary
GET /api/lineage/blast-radius/{ref:path} lineage blast radius
GET /api/lineage/edges Return lineage edges (newest-first). Powers the dashboard's full-DAG view. Keyset cursor/next_cursor over (created_at, edge_id), plus true total and truncated (ADR-0199 B2).
POST /api/lineage/export-prov Export W3C PROV-JSON lineage document for a capsule.
POST /api/lineage/import Import capsule lineage events into the store — mirrors nova lineage import.
GET /api/lineage/provenance/{ref:path} lineage provenance
GET /api/lineage/replay-chain/{run_id} lineage replay chain
GET /api/lineage/time-travel/{ref:path} lineage time travel
GET /api/lineage/{run_id}/emit-openlineage Return OpenLineage events for a capsule as JSON (nova lineage emit-openlineage).

Evidence & audit (8)

Method Path Summary
GET /api/audit list audit
GET /api/evidence list evidence endpoint
GET /api/evidence/completeness/{run_id} Compute the completeness assertion for a capsule.
GET /api/evidence/{bundle_id} get evidence detail endpoint
GET /api/evidence/{bundle_id}/download download evidence endpoint
POST /api/evidence/{bundle_id}/verify Verify the cryptographic integrity of an evidence bundle.
POST /api/evidence/{run_id} export evidence endpoint
POST /api/evidence/{run_id}/bind Build criterion-evidence bindings for a capsule against a profile.

Compliance & governance (27)

Method Path Summary
POST /api/aibom/generate Generate CycloneDX AI-BOM(s) for one or all capsules — nova aibom generate.
GET /api/aibom/status Show CRA SBOM compliance status — nova aibom status.
GET /api/compliance/annex-iv Build and return an EU AI Act Annex IV document as JSON-LD.
POST /api/compliance/audit/bundle Export a compliance evidence bundle as base64-encoded ZIP (nova audit bundle).
GET /api/compliance/audit/coverage Per-control coverage analysis for the local capsule store (nova audit coverage).
GET /api/compliance/audit/map List evidence checkers for a compliance profile.
POST /api/compliance/audit/report Run compliance audit against a capsule and return a coverage report.
POST /api/compliance/audit/verify Validate the structure of an audit report JSON-LD (nova audit verify).
POST /api/compliance/erasure/request Experimental — works today (ADR-0210). Execute a GDPR Art.17 erasure request through the real DEK crypto-shred machinery (DEKStore.erase_subject, same code path as nova pii erase). Safe-mutations gated: body must carry confirmed: true (400 otherwise, nothing mutated). Persists the request PENDING in $NOVAFABRIC_HOME/erasure.db, executes synchronously, returns the terminal state (COMPLETED/DEFERRED/FAILED) with a receipt + receipt_sha256. NOVA_CAP003_ENABLED=false → 409.
GET /api/compliance/erasure/status Experimental — works today (ADR-0210). List persisted GDPR erasure requests from erasure.db, newest first (?subject_id= exact filter, ?limit=, default 200). Rows are hash-only at top level (subject_sha256); receipts appear verbatim. Empty queue returns requests: [] honestly.
POST /api/compliance/euaiact/export Export EU AI Act Art.12 structured log records (ADR-0076).
GET /api/compliance/euaiact/status Return EU AI Act Art.12 compliance configuration (ADR-0076).
POST /api/compliance/examiner/{format} Export a capsule in examiner format (bagit / pccp / iso42001).
POST /api/compliance/export/aibom Export CycloneDX 1.7 AI-SBOM (ML-BOM) — nova export-aibom.
POST /api/compliance/export/c2pa Export C2PA v2.3 manifest for a capsule (ADR-0074 / EU AI Act Art.50).
POST /api/compliance/export/hipaa-proof Export HIPAA Safe Harbor de-identification proof — nova export-hipaa-proof.
GET /api/compliance/export/kinds The registry catalog the dynamic panel renders (ADR-0200 §2).
POST /api/compliance/export/nist-rmf Export NIST AI RMF 1.0 quantitative risk report — nova export-nist-rmf.
POST /api/compliance/export/rocrate Export a capsule as W3C RO-Crate v1.1 ZIP (base64-encoded).
POST /api/compliance/export/ropa Export GDPR Art.30 Records of Processing Activities (RoPA) — nova export-ropa.
POST /api/compliance/export/{kind} Run one registry exporter — the same builder its CLI command calls.
GET /api/compliance/nis2 Build and return a NIS2 incident report as JSON.
POST /api/compliance/pii/erase Destroy a data subject's DEK (GDPR Art.17 crypto-shredding) — nova pii erase.
GET /api/compliance/subject-proof Return GDPR Art. 17 redaction proof for a data subject.
GET /api/governance/classify Classify an AI system risk tier inferred from a Run Capsule.
POST /api/governance/classify-manual Classify a manually described AI system — nova classify run.
GET /api/governance/vocabularies List vocabulary versions — nova classify list-vocabularies.

Generic compliance-export registry (works today, ADR-0200 §2)

GET /api/compliance/export/kinds returns the export-kind catalog (id, label, required/optional fields) that the dashboard's dynamic export panel renders; POST /api/compliance/export/{kind} runs the matching CLI-only exporter's own builder function given a JSON body instead of CLI flags, and every call is audit-logged with its cli_equivalent. This complements — and does not replace — the bespoke literal routes above (/api/compliance/export/aibom, c2pa, hipaa-proof, nist-rmf, rocrate, ropa), which stay in place; the generic {kind} route is registered last so it never shadows them (Starlette matches in registration order).

Policy & approval (8)

Method Path Summary
GET /api/policy/capture-level Return current capture level + tier descriptions (DB-CAP-1, cap-004).
POST /api/policy/capture-level Validate a capture-level value and return restart instructions (DB-CAP-1).
POST /api/policy/check Evaluate a policy check interactively.
GET /api/policy/explain Look up a past policy decision from the audit log (nova policy explain). Bounded O(page) tail read, newest-first; limit (default 100, max 1000) + byte-offset cursor; adds next_cursor/truncated (ADR-0199 B2).
GET /api/policy/list List Rego bundle files and signed promotion policies — nova policy list.
GET /api/policy/recent-decisions Return recent decision IDs from the audit log for autocomplete. Bounded O(page) tail read; byte-offset cursor; adds next_cursor/truncated (ADR-0199 B2).
POST /api/policy/sign Sign and store a new promotion policy — nova policy sign.
POST /api/policy/test Run the Rego test suite for the policy bundle (nova policy test).

Sealing & trust (10)

Method Path Summary
GET /api/seal/log/verify Verify internal consistency of the local Merkle log (ADR-0041).
GET /api/seal/policy Return the latest promotion policy predicate.
POST /api/seal/ratchet/init Provision epoch-0 ratchet state for a node.
POST /api/seal/ratchet/rotate Advance to the next signing epoch; erase the previous chain key.
GET /api/seal/ratchet/status Show a node's current signing epoch and registry history.
POST /api/seal/sigstore/sign Sign a capsule artifact using Sigstore keyless signing (ADR-0071).
POST /api/seal/sigstore/verify Verify a stored Sigstore bundle for a capsule (ADR-0071).
POST /api/seal/{capsule_id}/bypass Create a time-limited SoD bypass, DSSE-signed and permanently logged (ADR-0059).
GET /api/seal/{capsule_id}/proposals List all proposals for a capsule with their approval status.
POST /api/seal/{capsule_id}/verify Run the five-check SoD verifier for a capsule's promote bundles.

Knowledge graph (18)

Method Path Summary
GET /api/kg/agents/{agent_id}/edges Return models, tools, and MCP servers called by an agent (DB-KG-1).
GET /api/kg/aliases List all alias-table entries, optionally filtered by canonical entity id.
POST /api/kg/aliases Register (upsert) an alias into the Tier-2 alias table.
POST /api/kg/attack-path Shortest attack path between two entities — mirrors nova kg attack-path (UC2).
POST /api/kg/blast-radius Impact/blast-radius of an entity — mirrors nova kg blast-radius (UC3).
POST /api/kg/detect Unsupervised SPKG anomaly scan of a capsule — mirrors nova kg detect (ADR-0111).
GET /api/kg/entity-queue Return pending ReviewItems from the Tier-3 human review queue (bounded: limit default 200, max 1000; adds true total + truncated).
GET /api/kg/entity-queue/stats Return pending/approved/rejected counts for the entity review queue.
POST /api/kg/entity-queue/{item_id}/approve Approve a review item. Body: {canonical: str, resolved_by: str}.
POST /api/kg/entity-queue/{item_id}/reject Reject a review item. Body: {resolved_by: str}.
POST /api/kg/ingest Ingest a capsule directory into the KG — mirrors nova kg ingest.
POST /api/kg/ingest-all Bulk-ingest all capsule directories into the KG.
POST /api/kg/init Initialise the KG schema (idempotent) — mirrors nova kg init.
GET /api/kg/status Return Capsule KG store health + entity counts (DB-KG-1, ADR-0067).
GET /api/kg/topology Return all KG nodes and edges for multi-layer topology visualization.
GET /v1/kg/audit KG health audit: node/edge counts, zero-call-count edges.
GET /v1/kg/query Query models and tools for an agent. Mirrors nova kg query.
GET /v1/kg/status KG store health check (Tier 2+ aware). Alias of /api/kg/status.

Assurance & MCP (3)

Method Path Summary
GET /api/assure/{run_id} Run OWASP Top 10 for LLM evidence checks against a capsule.
POST /api/mcp/risk-report Generate a structured OWASP LLM risk report for an MCP manifest.
POST /api/mcp/scan Scan an MCP server manifest for OWASP LLM supply-chain risks.

Storage & infrastructure (7)

Method Path Summary
POST /api/db/upgrade Run alembic upgrade to the specified revision (default: head).
GET /api/infra/backups List backup archives in NOVA_BACKUP_DIR (manifest-claimed, not hash-verified — that's nova backup verify); {detected: false} when unconfigured (ADR-0201 P7).
GET /api/infra/collector Return collector health. Returns {detected: false} if not running.
GET /api/storage/inspect/{run_id} Show dual-object split for a run (DB-STG-1, cap-003).
GET /api/storage/manifest-chain Return the last N entries in the manifest chain.
GET /api/storage/stats Return object capsule store statistics.
GET /api/storage/validate Validate S3 backend supports Object Lock COMPLIANCE (DB-STG-1, cap-009).

Cost & metrics (7)

Method Path Summary
POST /api/cost/attribute Compute productive-vs-wasted spend attribution over a request document — same core as nova cost attribute (ADR-0146 D3).
POST /api/cost/fairness Compute per-agent spend share + Gini fairness report — same core as nova cost fairness (ADR-0146 D5).
GET /api/cost/pricing Return the per-1k-token price table from CostInterceptor (DB-COST-1).
GET /api/cost/report Return aggregated LLM cost (DB-COST-1 / cap-002).
POST /api/cost/usage-breakdown Compute token usage-type composition — same core as nova cost usage-breakdown (ADR-0132).
GET /metrics metrics endpoint
GET /metrics/stream SSE metrics stream (FR-21: Last-Event-ID reconnect support).

The three /api/cost/* POST routes above are pure, deterministic, read-only wraps of the same cost cores their nova cost CLI counterparts call (no capsule I/O, no writes, not audit-logged — computing a bounded aggregate over caller-supplied numbers isn't a mutating or boundary-crossing action).

Reports (17)

Method Path Summary
GET /api/report Generate an asset inventory report — mirrors nova report.
GET /api/reports/alert-digest Registry-driven data route (R4) — {columns, rows, count} JSON or CSV.
GET /api/reports/api-key-inventory Registry-driven data route (R4) — {columns, rows, count} JSON or CSV.
GET /api/reports/capsule-compare report capsule compare
GET /api/reports/catalog Return the report registry (identity, filters, chart specs) — the single source of truth the dashboard ReportsTab reads for preview charts (ADR-0200/0201).
GET /api/reports/compliance-posture Registry-driven data route (R4) — {columns, rows, count} JSON or CSV.
GET /api/reports/cost-burn report cost burn
GET /api/reports/dashboard-audit Registry-driven data route (R4) — {columns, rows, count} JSON or CSV.
GET /api/reports/eval-regression report eval regression
GET /api/reports/evidence-inventory report evidence inventory
GET /api/reports/executive-summary report executive summary
GET /api/reports/policy-audit report policy audit
GET /api/reports/release-comparison report release comparison
GET /api/reports/run-history report run history
GET /api/reports/seal-verification report seal verification
GET /api/reports/throughput report throughput
GET /api/reports/{report_id}/export?format=html|pdf Export a self-contained report artifact with an inline-SVG chart where the registry declares one (ADR-0201: server-side chart rendering). HTML needs nothing; PDF lazily imports the optional WeasyPrint extra and degrades to 501 + install hint when absent (pip install 'novafabric[compliance]').
Method Path Summary
GET /api/holds list holds
POST /api/holds create hold
POST /api/holds/{hold_id}/release release hold

Schema (1)

Method Path Summary
GET /api/schema/list List the CapsuleEventType values + meta (DB-SCH-1, cap-001 / ADR-0066;

Topology (live) (5)

Method Path Summary
POST /api/topology/seed Seed the live topology store from capsules already on disk.
GET /api/topology/snapshot Return current topology counts for the SPA status bar.
GET /topology/cluster-edges Return inter-cluster edge aggregates for drawing edges between super-nodes.
GET /topology/cluster-list Return clusters as plain JSON rows (largest first) for the Table/Treemap views.
GET /topology/clusters Return Arrow IPC cluster layer (ADS v1 cluster_layer schema).

Admin (11)

Method Path Summary
GET /api/admin/api-keys Read-only, secret-free API-key projection (ADR-0193). Bounded: limit (default 500, max 2000) pushed into SQL; total is a true COUNT(*); adds truncated (ADR-0199 B2).
POST /api/admin/flush-jwks-cache Flush the JWKS cache, forcing a re-fetch from the OIDC provider.
GET /api/admin/new-run-id Generate a fresh ULID for use as NOVAFABRIC_GLOBAL_RUN_ID (cap-007 FR-27).
POST /api/admin/rebuild-metadata-db Disaster-recovery rebuild of the metadata DB from the chain log.
POST /api/admin/reindex-runs Confirm-gated ({"confirmed": true}, else 400), idempotent INSERT-OR-REPLACE rebuild of the runs_cache index from the capsule filesystem — never deletes a capsule or a row with a still-existing capsule (ADR-0201 P8). Optional {"prune": true} (default false) also drops rows whose capsule directory is gone; response gains pruned.
GET /api/admin/roles List role assignments (local mode).
POST /api/admin/roles Assign a role to a subject (idempotent). Local-mode admin shortcut.
DELETE /api/admin/roles/{subject}/{role} Revoke a role from a subject. 404 if not found, 409 if lockout would occur.
GET /api/admin/tokens List issued local tokens (stored in ~/.novafabric/tokens.jsonl), newest-first. Bounded: limit (default 200, max 2000) + byte-offset cursor; adds next_cursor/truncated (ADR-0199 B2).
POST /api/admin/tokens Issue a new local session token. The token is returned once and stored only as a sha256: digest (0600); it cannot be recovered from the file. It authenticates by Authorization: Bearer or ?token=, and carries the same full access as the dashboard token — nova serve authenticates, it does not authorize (ADR-0252).
DELETE /api/admin/tokens/{fingerprint} Revoke a token by fingerprint. Revocation takes effect immediately: the next request with that token gets 401.

alerts (1)

Method Path Summary
GET /api/alerts/recent recent alerts

analytics (1)

Method Path Summary
GET /api/analytics/summary analytics summary

incidents (5)

Method Path Summary
GET /api/incidents List the newest incidents with their nearest Art. 73 deadline.
POST /api/incidents Open a new incident (forward-only lifecycle; never deleted).
GET /api/incidents/{incident_id} Get one incident with computed Art. 73 deadlines.
GET /api/incidents/{incident_id}/export Export an incident as an OECD-AIM or NIS2 structured report.
POST /api/incidents/{incident_id}/transition Advance an incident's lifecycle (open → reported → closed).

ingest-capsule (1)

Method Path Summary
POST /api/ingest-capsule Index capsule(s) into the runs metadata store — nova ingest-capsule.

lineage-store (1)

Method Path Summary
GET /api/lineage-store/profile Generate a lineage-store deployment profile — nova lineage-store profile.

livez (1)

Method Path Summary
GET /livez livez

ops (1)

Method Path Summary
GET /api/ops/daemon-status Report whether the warm capture daemon socket is alive (read-only).

query (1)

Method Path Summary
POST /api/query Execute a Capsule Query DSL document ({q, engine?}) — the same JSON/YAML query object nova query --query-file accepts, not a free-text/SQL string (ADR-0129, no new grammar). Read-only, capped at 5000 rows regardless of the plan's own limit; a 422 on any parse/allow-list failure, a 500 only on a malformed on-disk capsule index.

readyz (1)

Method Path Summary
GET /readyz readyz

Deprecation register (ADR-0188)

Maturity: mechanism works today (experimental); the register is empty and the CI drift gate is future design. Policy and machinery: ADR-0188.

Scope. The lifecycle policy applies to the multi-user nova server API only (api/openapi.yaml, /v0 and later). The nova serve dashboard API documented in the tables above remains experimental/unversioned — no lifecycle promises — until the planned ADR-0183 consolidation.

Breaking-change definition (normative). Breaking: removing or renaming a path, query parameter, or response field; narrowing a type or enum; tightening auth or required scopes on an existing endpoint; changing error-envelope semantics (codes, envelope shape). Non-breaking: adding optional fields, endpoints, enum values documented as open, or response headers. If it is not on the breaking list, it may ship in any release; if it is, the lifecycle below is mandatory.

Lifecycle. A deprecation is announced in CHANGELOG.md, the release notes, and this register, all at once. From the deprecating release onward the endpoint emits three headers on every response (implemented in src/novafabric/server/deprecation.py):

Header Format Meaning
Deprecation: @<unix-timestamp> or true (RFC 9745) The endpoint is deprecated (and since when, if known).
Sunset: HTTP-date (RFC 8594) Earliest date the endpoint may be removed.
Link: <url>; rel="deprecation" Points at this register's entry for the endpoint.

Minimum window. A deprecated endpoint stays working for at least two minor releases. Removal lands only in a minor version bump pre-1.0 and only in a major bump post-1.0. No silent removals, ever. Every register row names the deprecating release, an earliest-removal release at least two minors later, and a replacement (or an explicit "none"); each row must match a deprecated: true operation in api/openapi.yaml (drift gate: future CI).

Register

No endpoints are currently deprecated.

Endpoint Deprecated in Earliest removal Sunset date Replacement
— — — — —

Interactive API docs

When the server is running, the same route table is browsable interactively:

Summary & next steps

Where to go next: