Every page has a JSON twin
The API behind the console, and the one rule it follows.
Every read in this console has a JSON endpoint behind it, under /api. They exist so the
console is not the only way to ask, and because a page whose data you cannot fetch is a
page you cannot check.
GET/api/projectsrun it →
Every project the platform knows about.
GET/api/deploymentsrun it →
The delivery index: what is deployed, where, at which commit.
GET/api/environmentsrun it →
The environment axis — each environment and what runs in it.
GET/api/buildsrun it →
Every build the platform remembers, newest first.
GET/api/platformrun it →
The construct catalogue: resource types, component types, traits, workflows.
GET/api/upgradesrun it →
What is behind, what is held on purpose and why.
A summary endpoint returns a summary. /api/builds/<run>/tests deliberately omits every
captured output line — it is the cheap answer to "did the tests pass", and it once
returned ten complete case objects because slowest was passed through whole.
The full generated reference lives at /api-docs, which is where FastAPI's Swagger UI
was moved to when /docs became the documentation section.