Point your Codex Enterprise Analytics calls at https://chatgpt.sandboxapis.dev (curl or any HTTP client — the API is documented by an official OpenAPI, not an SDK). Auth is a Bearer workspace Admin key (any value is accepted here). This universe has ONE workspace, 2c9bcd8f-c169-4ce5-a266-c8cba93fbad5; every path is /v1/analytics/codex/workspaces/{workspace_id}/{usage|code_reviews|code_review_responses}, windowed by start_time/end_time in Unix seconds (end_time exclusive). Usage rows are per user by default and workspace-wide with group=workspace. This is the SAME codex cohort the openai host bills: estimated_cost_usd over a window sums to exactly the openai /v1/organization/costs total for it, and code_attribution counts real commits that resolve on the git hosts.
Coverage badge
Full3/3 · 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.
chatgpt.sandboxapis.devServed & verified
3 / 100%
Answering with real universe data, each response checked against Codex Analytics's published spec by the conformance suite on this build.
The full read API
3
Every read surface Codex Analytics publishes, deferred long tail included, minus the rows excluded by policy. Writes are out of scope: this universe is read-only.
Not served yet
0
Nothing — every read surface Codex Analytics publishes is answered.
01 / The swap
No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.
curl -H 'Authorization: Bearer any-key' "https://chatgpt.sandboxapis.dev/v1/analytics/codex/workspaces/2c9bcd8f-c169-4ce5-a266-c8cba93fbad5/usage?group=workspace&limit=5"Verified drop-in clients
No client library is version-pinned against Codex Analytics yet, so this page claims none. What is asserted is the wire: every response above is validated against Codex Analytics'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 3 rows the coverage manifest carries for Codex Analytics, 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.
3 read surfaces in 3 families
the response side of the same fact: with no code reviews, there are no review responses (DECISIONS 2026-08-18 [P32] decision 4)
the two-seat Codex trial uses CLI and IDE clients and never enabled the GitHub review integration, so no code review exists to report (DECISIONS 2026-08-18 [P32] decision 4)
03 / What's simulated
Every Codex Analytics call resolves against the same simulated data set every other provider serves. Counted from the chatgpt-v1-g11 artifact (universe generation 11):
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.
This surface and the OpenAI platform surface serve ONE cohort — one vendor, one set of seats: every usage row's `actor.user_id` is an id `/v1/organization/users` returns, `actor.email` matches that user's email, and the uncached-input and output token totals of the two hosts are equal.
Against OpenAI · parity/m3-parity.test.ts
Every identity this host reports usage for resolves as a user on the GitHub host with the same name.
Against GitHub · parity/m3-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.
chatgpt-v1.snap.sandboxapis.devgeneration 5v1servedchatgpt-v1-g10.snap.sandboxapis.devgeneration 10v1servedchatgpt-v1-g11.snap.sandboxapis.devgeneration 11v1servedchatgpt-v1-g6.snap.sandboxapis.devgeneration 6v1servedchatgpt-v1-g8.snap.sandboxapis.devgeneration 8v1servedchatgpt-v1-g9.snap.sandboxapis.devgeneration 9v1servedNeed an endpoint that is not served yet?
Every row Codex Analytics'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.