Point a CircleCI client at https://circleci.sandboxapis.dev — paths are /api/v2/… exactly as on circleci.com, and both spellings of a project slug work (gh/olympus-labs/<repo> and the URL-escaped gh%2Folympus-labs%2F<repo>). mcp-server-circleci takes CIRCLECI_BASE_URL; the circleci CLI takes --host; anything else takes a base URL. Auth is a Circle-Token header or a bearer token, and any value — or none — is accepted here. WHAT IS RENDERED: the CI story the universe already tells. A PIPELINE is one commit that CI ran on, its WORKFLOWS are the runs on that commit ("ci", "lint", "release") and its JOBS are their jobs — the same runs, the same shas and the same people that gh./gl./bb./dev.azure hosts serve for the identical commit, which is the point of reading it here. Also served: /me and /user/{id} over the org roster, /organization/{org-slug-or-id}, /project/{project-slug} over the canonical repositories, and the ACCOUNT CONFIGURATION around a build — contexts and their restrictions, project environment variables, pipeline definitions, triggers and the outbound webhook. WHAT IS NOT: there is no build LOG on this host, because CircleCI API v2 declares no log endpoint at all — read the same job's output on gh./gl./bb./ado. instead. The aggregate insights summaries and time-series, and the whole deploy/rollback family, answer an explicit coverage 404; a usage-export job by id answers CircleCI's own 404 with an x-sandboxapis-refusal header, because the job is created by a POST this universe refuses and no such id can exist. ONE GENERATION NOTE: schedules, test results and flaky tests, checkout keys, project settings, OIDC claims, identity groups, the OTLP exporter, the URL orb source, config policies with their decision log, and /me/collaborations all read the CI configuration canon, which ships with generation hello-15. Live rides hello-19, which inherits it, and answers them; so do the circleci-v2-g11 pin on hello-16 and the circleci-v2-g10 pin on hello-15 itself; every pin registered before that generation answers a 404 naming it, never an empty collection, and never gains it later because a pin's bytes do not move. Check https://sandboxapis.dev/providers/circleci for the row-by-row picture.
Coverage badge
Full61/61 · 100%
The share of read rows with a final answer — served and verified, a deviation, retired upstream, or a reviewed empty/refusal. Computed in the coverage manifest, copied here.
circleci.sandboxapis.devServed & verified
60 / 98%
Answering with real universe data, each response checked against CircleCI's published spec by the conformance suite on this build.
The full read API
61
Every read surface CircleCI publishes, deferred long tail included, minus the rows excluded by policy. Writes are out of scope: this universe is read-only.
Not served yet
1
Each returns an explicit, provider-shaped coverage error naming the gap — never invented data.
01 / The swap
No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.
curl "https://circleci.sandboxapis.dev/api/v2/me"Verified drop-in clients
No client library is version-pinned against CircleCI yet, so this page claims none. What is asserted is the wire: every response above is validated against CircleCI's own published spec by the conformance suite. Client pins live in coverage/client-pins.yaml and are added as each SDK joins the suite.
02 / Coverage by family
All 61 rows the coverage manifest carries for CircleCI, deferred long tail included and nothing capped. Open a family, or filter by path to find the exact endpoint your client calls.
Status — what a conformance test found
Mode — what kind of answer a row gets
A row with no mode shown has not been judged yet. Modes are the manifest's own words, from coverage/MODES.yaml; every empty and refuse carries a written reason and a review date before it counts as final.
Badge — where Full starts
REST + GraphQL + git rows that are not `excluded`. Write operations are NOT rows (DECISIONS 2026-09-01 decision 9): they are counted in meta.write_operations and never enter this ratio.
61 read surfaces in 18 families
totals over every repository's `reader.listRuns`, with duration read off each run's start and completion. THE ONE VALUE THAT IS NOT AN AGGREGATE IS CREDITS, and it is derived rather than zeroed or omitted: canon states the resource class (packages/compiler/src/files.ts writes `resource_class: medium` under a docker executor, and CircleCI's own default for a docker executor that declares none is medium too), and 10 credits/minute is CircleCI's published rate for docker/medium - so credits are whole minutes of job wall time at the vendor's list price, the same pin-scoped price-table shape renderer-anthropic and renderer-openai already use for token cost. `0` would be false and the field is required and not nullable. TRENDS ARE RELATIVE CHANGE against the same-length window immediately before, one rule for all nine floats because the document defines none; this universe's canon is exactly 90 days, so every trend on the default `last-90-days` window is 0 for want of a baseline and a caller asking for `last-7-days` gets real movement - conformance asserts both halves so the zeros read as arithmetic rather than as a stub. `all_projects` stays unfiltered when `project-names` narrows the rows
the branch of every canonical pipeline this project has, taken from the renderer's own model rather than from `reader.listBranches` - the field's description is `the VCS branch of a WORKFLOW'S TRIGGER`, so the list is the branches CircleCI has really seen build, not every branch the repository carries. Conformance asserts both: each served branch is a branch a pipeline was built on AND a branch the repository really has. `workflow-name` narrows to the branches that workflow ran on (the release workflow only ever ran on the default branch, which is what makes the filter checkable); a workflow this project does not have is an ENTITY miss and carries no coverage header
hello-15's TestCase/TestResult made this derivable and the derivation is CircleCI's own published definition, quoted: a flaky test is one that PASSED AND FAILED IN THE SAME COMMIT. The nightly is what makes it visible - this universe has main-line commits on 41 of its 90 days, so on 49 nights the schedule recompiles the sha it compiled the night before, which is the situation a flake shows up in and the reason real orgs find theirs in the nightly. Nothing is labelled flaky in canon: `flakiness` is a per-run rate the generator rolls against, and this row derives the OUTCOME from the results, exactly as the coherence suite does. `file` is null because canon states none (DECISIONS 2026-09-06 judgment 3), `source` is `junit` because canon states the report IS JUnit XML - ARTIFACT_MIME serves it as application/xml and JUNIT_BYTES_PER_CASE derives its size from the case count
one row per canonical Workflow that RAN inside the reporting window, over `reader.listRuns` and `reader.runJobs`. A workflow with no run in the window is ABSENT rather than present with zeroes: it has no metrics to report and no first build to name. `mttr` is the mean interval from a failing run's completion to the completion of the next run of the same workflow that succeeded - a failure with no later success has not recovered and is not averaged in, and `null` when none has. `duration_metrics.p95` is nearest-rank, the same definition the test-metrics row uses, so the two insights families cannot report a percentile two different ways. Credits are the docker/medium rate insights.ts documents
the workflow's runs themselves, newest first, off `reader.listRuns`. Every `id` is the renderer's own `workflowId`, so conformance follows it to `GET /workflow/{id}` and asserts the two surfaces agree about the run (invariant #5). `branch` is the branch its pipeline was built on - the same derivation `GET /pipeline` prints, never a second copy. `is_approval` is false on every run because an approval is a MANUAL HOLD this canon has no entity for, the same fact `shapeWorkflowJob` states by emitting `type: build` on every job. `start-date`/`end-date` bound the window directly and an `end-date` without a `start-date` is refused, because the document says one must accompany the other
the same metric object one level down, over the `reader.runJobs` of that workflow's runs, grouped by job NAME - which is what the operation's items are keyed on. A WORKFLOW'S CREDITS ARE ITS JOBS' CREDITS by construction and conformance asserts the two rows agree, so this host cannot serve one bill two ways. `job-name` narrows to a single row
the same aggregates for one workflow, plus the trends against the preceding window and the project's full workflow list. Conformance asserts field-by-field that this row and the `/workflows` list carry the SAME numbers for the same workflow - two surfaces over one derivation, not two derivations. `completed_runs` equals `total_runs` and that is a fact about this canon rather than a field copied from its neighbour: every canonical WorkflowRun carries a completion instant and a terminal conclusion. This operation declares no `reporting-window`, so it reports on the document's own 90-day default
the same TestResult canon, aggregated per workflow. `test_counts` uses canon's FOUR statuses rather than a JUnit summary's three - `error` (the suite fell over) and `failure` (an assertion failed) are different facts and canon takes the finer set so a renderer can collapse and never invent. `p95_duration` is nearest-rank over the case's real durations, the definition that needs no interpolation and therefore no choice; `flaky` is the same derivation the sibling row publishes, so the two surfaces cannot disagree about which tests flake
the same aggregates one level down: the project, each of its Workflows, and each (Workflow, branch) pair, over `reader.listRuns` and `reader.runJobs` with the branch taken from the renderer's own pipeline model. Conformance asserts the three levels RECONCILE - the workflow rows sum to the project's runs and so do the (workflow, branch) rows - which is what makes this a view of one fact rather than three. `all_branches` and `all_workflows` stay UNFILTERED when `branches`/`workflow-names` narrow the rows, because they are the lists the filters are chosen from. THE SLUG SITS BEHIND A LITERAL here, so the escaped-slug rewrite counts its two separators from `/api/v2/insights/pages/` rather than from `/api/v2/insights/`; counting from the shorter prefix spends one separator on the `/` after `pages` and 404s the escaped spelling, and both spellings are asserted over real HTTP
one bucket per (job name, interval) over `reader.runJobs`, the interval floored on the UTC epoch so no calendar and no timezone is involved. THE RETENTION IS THE PROVIDER'S OWN, mirrored rather than invented: the operation says hourly data is kept 48 hours and daily 90 days, so an hourly request reports the 48 hours ending at this artifact's anchor and a daily one its 90 days. `branch` defaults to the DEFAULT BRANCH because the document says it does. `name` is the JOB's name - the operation is getJobTimeseries and its summary says `all jobs within a workflow`, while the field's description is the workflow item's copied verbatim; the discrepancy is recorded in insights.ts rather than quietly resolved
CircleCI distinguishes pipeline PARAMETERS (declared in a config, which this universe indeed has none of) from pipeline VALUES, which are BUILT IN and which the operation's own description links the pipeline-values reference page for. Every value is a fact about the commit the pipeline built and the canon has carried all of them since hello-2: id, number, project git_url and type, branch, revision, first-parent base_revision, trigger source. `pipeline.git.tag` and the `pipeline.schedule.*` pair are ABSENT rather than empty, because nothing here is tagged or scheduled. So B2.1's proposed empty was a misreading rather than a hard call, and the founder's 2026-09-05 ruling lands on a row that plainly derives. The path key spells the parameter `{pipeline_id}` where the sibling config row spells it `{pipeline-id}` - CircleCI's own inconsistency, left exactly as the document writes it
hello-15's CiConfigDocument. The 2026-09-05 reason was that `building one at render time is exactly what generate INTO CANON forbids` - so the document is built in the COMPILER and `ci_config_document.source` is BYTE-IDENTICAL to the blob the file model wrote into the tree (one function produces both), which means this row and a `contents/` fetch of `.circleci/{key}.yml` on the gh host cannot disagree. `compiled` really differs from `source`: it is that source after orb expansion, produced from the same orb document. `setup-config` and `compiled-setup-config` are OMITTED and that omission agrees with an already-served row by construction - `ci_project_settings.setup_workflows` is false and `/project/{provider}/{organization}/{project}/settings` prints that same false
hello-15's PolicyDecision. The 2026-09-05 reason was that `a decision log entry records a pipeline being EVALUATED against a policy, and this universe has published no policy for anything to be evaluated against` - the canon now publishes the bundle AND logs 107 decisions against it, and A VIOLATION IS EVALUATED RATHER THAN DRAWN: the generator checks each enabled policy's rule against the config document the run was compiled from, so a reader who fetches the bundle, reads the Rego and re-evaluates it against the served config gets the served decision back. NO DECISION IS A HARD_FAIL and that is a fact rather than a gap - a hard fail blocks the pipeline and every pipeline here ran (DECISIONS 2026-09-06 judgment 6), asserted in both suites so a later wave does not read it as an oversight
founder re-ruling 2026-09-07: one decision-log entry by id. `metadata` is resolved through the run the decision was made for - build number, project id and the branch the pipeline built - and is OMITTED rather than half-filled when that run is not in this artifact's pipeline model. A decision id that names nothing answers the operation's own `decision log not found`, the sentence this row used to refuse with
founder re-ruling 2026-09-07: the bundle a decision was evaluated AGAINST, which is the policies that were ENABLED when it was made - strictly shorter than the whole bundle `.../policy-bundle` serves, because one policy is written and never enabled. Serving the two identically would make `enabled_rules` and the bundle one fact served twice, which is the thing the canon was shaped to avoid
hello-15's PolicyDecisionSettings, which carries `enabled` ALONE - one boolean, exactly what DecisionSettings declares. The 2026-09-05 reason named a second field the document does not have
hello-15's ConfigPolicy. The 2026-09-05 reason was that `Policy.content` is REGO SOURCE TEXT and `composing a policy document inside a renderer is exactly the invent-at-render-time the judging bar forbids` - so the Rego is composed in the COMPILER from the rule canon carries and the words the theme supplies, the same split the .circleci YAML lives under, and `config_policy.content_sha512` is the hash of exactly those bytes. A DISABLED POLICY IS STILL IN THE BUNDLE, which is what makes a decision's `enabled_rules` strictly shorter than this map rather than the same fact served twice
founder re-ruling 2026-09-07: one policy by the name the bundle keys it under - the reader's `configPolicyByName` accessor exists for exactly this addressing. A name that resolves to nothing answers the operation's own inline 404 example, `policy not found`, in envelope 2; the sentence moved from refusals.ts to http.ts's NOT_FOUND unchanged, so a caller sees the same words it always did
hello-15's CheckoutKey, and the public half is REAL rather than drawn: canon carries 32 PRNG bytes, the compiler encodes a genuine OpenSSH ssh-ed25519 wire blob and derives BOTH fingerprints from it, so `ssh-keygen -lf` on the served line reproduces the served fingerprint. There is no private half anywhere - a deploy key's public component is published by design and authenticates nothing on its own
the same key addressed by either fingerprint. CircleCI reaches one key through this ONE path parameter by md5 OR sha256, so the reader resolves both through a single accessor - splitting them would let the two addressings drift
one variable per environment this project really deploys to - the project-scoped half of the split CircleCI itself documents (a CONTEXT holds what several projects share; a PROJECT variable holds what is true of this project alone). THE VALUE IS MASKED BY THE OPERATION'S OWN PUBLISHED RULE, four `x` characters plus the last four characters of the value, and no secret exists anywhere in this universe to be masked: the visible tail is DERIVED from the canonical ids, the PagerDuty routing-key precedent (DECISIONS 2026-09-03). `created-at` reproduces the Clojure reader literal the document's own example shows rather than tidying it to RFC-3339 (founder ruling 2026-09-05)
the same derivation addressed by name, asserted byte-identical to the row the list prints so a client cannot see two different values for one variable (founder ruling 2026-09-05)
hello-15's CiProjectSettings. Eight of the ten are DERIVED from facts canon already carried (visibility, whether commit statuses exist, whether a push off the default branch really started a run) and two are preferences that say so rather than pretending to a derivation - inventing one for a preference is worse than admitting it is one (DECISIONS 2026-09-06 judgment 7)
one row per canonical Component this repository has really shipped: `reader.listDeployments` gives the rollouts, `reader.getCommitById` gives each one's commit, and the commit names the Component it changed - so `name` is `reader.componentSlug` of that id, the same slug renderer-github prints inside every changed file's path. `release_count` is the number of those deployments, which makes it the length of the /versions list by construction rather than by coincidence. `labels` is an honest empty (canon labels nothing here) and `org-id` and `page-size` are both declared REQUIRED, so a request without either is not one this operation accepts
the same derivation addressed by id, asserted byte-identical to the row the list prints so the two addressings of one component cannot drift. An id that names no component this org has deployed answers `404_entity_not_found`'s own description, `Entity not found.` - the document exemplifies six entity kinds and a deploy component is not one of them, so the sentence is the shared response's rather than a plausible-looking one this host would be inventing
one version per canonical Deployment of that component. `name` is the release TAG when the deployment shipped one (`reader.listReleases`; production deployments carry `ref = tag`) and the deployed commit's short sha otherwise - 16 of this universe's 19 deployments are staging rollouts whose `ref` is the default branch, and publishing `main` as a version name would give every one of them the same name. `is_live` is the newest SUCCEEDED deployment per environment, so a failed or still-queued rollout is in the list and is not live. FOUR FIELDS ARE DELIBERATELY ABSENT rather than filled: `namespace` (canon models no orchestrator) and `pipeline_id`/`workflow_id`/`job_id`/`job_number` - canon says a deployment is caused by a MERGE or a RELEASE, never by a run (generateDeployments), so naming the release-workflow run that happens to share the commit would assert a causal link this universe does not contain. Every property of the schema is optional, so absence is the document's own way of saying so. The operation declares NO page-token and NO page-size, so `next_page_token` is always null: issuing one would name a parameter the operation cannot accept
one environment per distinct `Deployment.environment` off `reader.listDeployments`, created at the earliest deployment to it and updated at the latest - THE SAME DERIVATION `GET /context` has published since 2026-09-05, and conformance asserts the two lists are the same length so one column cannot produce two different answers. `description` is ABSENT because canon gives an environment no prose; `labels` is an honest empty. `org-id` and `page-size` are declared REQUIRED and are enforced, and the caller's `page-size` is the page size this host uses rather than its own PAGE_SIZE
the same derivation addressed by id, asserted byte-identical to the row the list prints. A well-formed uuid naming no environment answers the shared entity 404; an id that is not a uuid answers the operation's own 400, the same split the context and schedule families already make on this host
the founder ruled this row and eighteen siblings on 2026-09-05, re-ruling B2.1's proposed empty: data is the product, so fulfil the contract. SERVED — and `derive` rather than `generate` is the accurate label, because the response is computed from artifact rows that already exist: one context per distinct `deployment.environment`, created at the earliest canonical deployment to it. No new canon and no new words — `staging` and `production` are structural canon strings, not themed prose
the same derivation addressed by id (founder ruling 2026-09-05). A well-formed uuid naming no context answers the document's own `context_not_found` sentence; an id that is not a uuid answers `400_invalid_context_id`
one variable per row of the canonical VENDOR_CATALOG - the third-party credentials a deploy job carries, named from vendor names the theme baked in at compile time, so no real company is named and no word is authored in the renderer. THE OPERATION PUBLISHES NO VALUES AT ALL: `env_var_list` declares variable/created_at/updated_at/context_id and nothing else, which is CircleCI's own posture on context credentials (founder ruling 2026-09-05)
a `project` restriction naming the canonical project by the same id /project/{project-slug} prints, so the reference resolves on this host. `project` is the only one of CircleCI's three restriction kinds this canon can state - `expression` carries OPA source text and `group` names an SSO identity group, which B2.1 already ruled generate (founder ruling 2026-09-05)
the org roster IS the collaboration list, and Collaboration.avatar_url is the organization's avatar ON THE VCS - gh.sandboxapis.dev/avatars/o/{id}, built with renderer-github's own githubId rather than a second copy of the hash
hello-15's IdentityGroup, and the canon answers the objection this row was refused for. The 2026-09-05 reason was that mapping a Team onto an SSO group `would assert an SSO configuration nobody made`; hello-15 MAKES the configuration (IdentityProviderConfig - a protocol, a date and an administrator) and derives four groups from access facts rather than from team membership. Both canon suites assert no group has exactly a team's membership and that at least one crosses team boundaries, so the two entities stay distinct
the same IdentityGroup by id. MEMBERS ARE NOT INCLUDED - the document says so on this operation, and the list item carries the same three fields, so neither addressing publishes the membership canon records
hello-15's OidcClaimConfiguration. The org-scoped row is the one with no project, which is what makes it distinguishable from the project override beside it. `ttl` is formatted into Go's duration grammar because the document types it as a STRING (`JSONDuration`) rather than a number of seconds
OidcClaimConfiguration at project scope. ABSENT IS MEANINGFUL: a project with no override inherits the org row, so answering with the org row here would make the two endpoints indistinguishable - the reader keeps `orgOidcClaims` and `projectOidcClaims` apart for exactly this reason and a project with no override answers the entity 404
hello-15's UrlOrbSource. The 2026-09-05 reason was that `every candidate prefix would be a URL that 404s on gh.sandboxapis.dev (invariant #5)`, so the entity carries NO PREFIX AT ALL - repository, branch and directory - and the compiler writes a genuine orb document into that directory in that repository's tree. The renderer composes the prefix from names the artifact already carries, in GitHub's own contents-API shape, and `ci-parity` FETCHES the orb document from the gh host and asserts it answers 200. The URL resolves because the file is there (DECISIONS 2026-09-06)
one definition per canonical `Workflow` that really ran - ci, lint, release, the same theme-free keys renderer-github serves as the workflow identity on the same runs, in the artifact since hello-2. `description` is ABSENT because every property of `pipelineDefinition` is optional and canon states no prose about a workflow; `repo.external_id` is absent because it is the VCS's own repository id and this host mints none, so emitting one would hand back a value that resolves nowhere (invariant #5). `config_source.file_path` is .circleci/{key}.yml: the directory and extension are CircleCI's own grammar and the only variable part is the canonical key - the canonical `Workflow.path` is NOT reused, because it is a GitHub Actions path and printing it as the file CircleCI reads would state something false about both hosts (founder ruling 2026-09-05)
the same derivation addressed by id (founder ruling 2026-09-05)
hello-15's WorkflowSchedule. The 2026-09-05 reason was exact and it is the reason this row can be served now: `a schedule served here would promise a nightly pipeline that GET /pipeline does not contain, and the first caller to check the two against each other would find it out`. So the canon did not add a schedule ROW, it added ~87 scheduled WorkflowRuns with their own jobs, logs, uploads and outcomes - a schedule is not a row, it is the runs it produced. The pipelines are there to be checked against, and `pinned-cross-category`/`ci-parity` do check. Name and description are canon prose the theme baked at compile time, so the second half of the old reason (`prose canon does not carry`) is answered too
the same derivation addressed by id. A well-formed uuid naming no schedule answers the shared entity 404; an id that is not a uuid answers the operations' own 400, the same split the context family already makes on this host
one trigger per DISTINCT event the canon records that workflow's runs really being started by. A trigger is a claim that pipelines get created when something happens, so a pull-request trigger on a workflow only ever run by pushes would promise pipelines GET /pipeline cannot show - the trigger list is therefore derived from `WorkflowRun.event` rather than from CircleCI's enum. `event_preset` maps the canon's two events onto the two presets the document says every provider supports (all-pushes, only-build-prs); `disabled` is read off `Workflow.state` (founder ruling 2026-09-05)
the same trigger reached directly rather than through its definition, asserted byte-identical to the row the definition's list prints (founder ruling 2026-09-05)
the project's outbound build webhook, delivering to the org's own release-bot receiver - canon's `ReceiverSlot` is a CLOSED canonical union whose words are canon's, and the URL is READ OUT OF THE ARTIFACT where the theme baked it at compile time rather than composed in the renderer. `url` is REQUIRED and is a URL, so this is the same bind PagerDuty's `delivery_method.url` was in, resolved with the same canon. `signing_secret` is the document's own masked form ******** on a field described as a MASKED value - mirroring a provider's redaction is not a placeholder, and there is no secret in this universe to redact. `scope-id` and `scope-type` are both declared required and are enforced (founder ruling 2026-09-05)
the same derivation addressed by id, with its scope asserted to be the project's own id on this host (founder ruling 2026-09-05)
hello-15's TelemetryExporter. The 2026-09-05 reason was that `exporter.endpoint` is a HOSTNAME and `the org's own hosts are a THEME construction a renderer may not replicate (invariant #6)` - so the endpoint is BAKED BY THE THEME AT COMPILE TIME into `telemetry_exporter.endpoint` and read straight off the row here, never composed in the renderer. `headers` publishes the configured header NAMES with CircleCI's own masked value, the same posture the context environment-variable row takes; `issues` is an honest empty, because an exporter this universe never failed to deliver through has none. `org-id` is declared REQUIRED, so a request without it is not a request this operation accepts
refuse — a usage export job is created by a POST this replica refuses, so no job id can exist - CircleCI's own 404 for an object that was never created is the whole answer
03 / What's simulated
Each line below is one assertion in the conformance suite named beside it — run on every build, over one artifact, through the real renderers. Nothing is claimed here that no expect checks.
A pipeline's `vcs.revision` is the 40-character SHA of a commit GitHub really serves, and the GitHub Actions run and the Bitbucket pipeline on that same SHA carry the same job names with the same verdicts.
A workflow's `started_by` resolves to a user on this host whose login is the actor GitHub names on the Actions run for the same commit, and that person is a fetchable member of the organization there.
Against GitHub · parity/ci-parity.test.ts
A project's `vcs_info.vcs_url` is byte-identical to the `html_url` GitHub prints for that repository, and both hosts report the same default branch.
Against GitHub · parity/ci-parity.test.ts
05 / Pinned snapshots
Each pin regenerates byte-identically on every request, so a test written against one never drifts. Generations are DIFFERENT universes, not versions of one — never swap a suffix expecting the same data.
circleci-v2-g10.snap.sandboxapis.devgeneration 10v2servedcircleci-v2-g11.snap.sandboxapis.devgeneration 11v2servedcircleci-v2-g8.snap.sandboxapis.devgeneration 8v2servedcircleci-v2-g9.snap.sandboxapis.devgeneration 9v2servedNeed an endpoint that is not served yet?
Every row CircleCI's manifest carries is on this page, so “not here” is an answer rather than a gap in the rendering. Tell us which path and which client, and it moves up the queue — the order is set by what people ask for.