GET /v2/data-manifestreturns the top-level summary across every scope.GET /v2/data-manifest/coveragereturns per-row coverage with named gaps, sorted worst-covered first.
Refresh cadence
Both endpoints are cached for 5 minutes. The actual cache age is reported on every response atmeta._agentic.freshness.age_seconds, and the next
refresh is at meta._agentic.freshness.next_update_at. The cache TTL is
honest: a non-zero age_seconds means the snapshot is older than zero seconds,
not “fresh because we said so.”
Endpoint: GET /v2/data-manifest
Open access. Returns the cross-scope inventory.
markets.unknown = 423 means 423 markets have
classification rows but the staleness probe could not assign a verdict yet.
That is the gap, not a bug, and it is the contract this endpoint exists to
expose.
Endpoint: GET /v2/data-manifest/coverage
Team plan or higher. Returns per-row coverage with completeness percentages
and gap arrays.
Query parameters
Sort order
Rows are ordered byhistory_completeness_pct ASC, then id ASC. Worst-
covered first is intentional. Customers asking “what is the gap” should not
have to scroll past the well-covered rows to find it.
Gap kinds
last_update_at contract
last_update_at reflects when the underlying data last changed (most recent
oracle price, governance event, or registry write), not when the manifest row
was computed. Manifest computation time is on meta._agentic.freshness.computed_at.
completeness_pct math
completeness_pct = rows_present / rows_expected_if_full * 100.
Per scope:
The math is documented in the handler source so it can be audited at the
grep boundary, not just here.