Point your Cursor team-API calls at https://cursor.sandboxapis.dev (curl or any HTTP client — Cursor publishes no official SDK). Auth is HTTP Basic with the key as the USERNAME and an empty password (curl -u any-key:) or a Bearer token; any value is accepted. Admin usage endpoints are POST-as-read (JSON date-range body, epoch ms); analytics + AI code tracking are GETs with startDate/endDate. The AI code tracking commits carry REAL SHAs — every commitHash resolves on the gh./gl./bb./ado. hosts.
Coverage badge
Full21/21 · 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.
cursor.sandboxapis.devServed & verified
20 / 95%
Answering with real universe data, each response checked against Cursor's published spec by the conformance suite on this build.
The full read API
21
Every read surface Cursor 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 Cursor publishes is answered. 1 endpoint was retired by Cursor itself and is served only on snapshots pinned before that date — not a gap on our side.
01 / The swap
No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.
curl -u any-key: "https://cursor.sandboxapis.dev/teams/members"Verified drop-in clients
No client library is version-pinned against Cursor yet, so this page claims none. What is asserted is the wire: every response above is validated against Cursor'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.
This spec is hand-authored, and that is a weaker guarantee.
Cursor publishes no machine-readable API description, so the spec we conform to is written from their documentation plus live captures (retrieved 2026-08-16) and re-diffed against those pages on a schedule. Where a vendored spec makes conformance a mechanical check, this one is only as good as our reading of the docs — which is why it is stated here rather than buried in the manifest.
Spec of record: cursor.com docs (no official machine-readable spec exists — hand-authored shape-of-record)
02 / Coverage by family
All 21 rows the coverage manifest carries for Cursor, 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.
21 read surfaces in 6 families
derive — served on the pins frozen before the retirement; the live host refuses it (meta.retired_meaning)
03 / What's simulated
Every Cursor call resolves against the same simulated data set every other provider serves. Counted from the cursor-2026-08-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 vendor's team roster is disjoint from the GitHub Copilot cohort and from Anthropic's, Devin's and OpenAI's — nobody holds two vendors' seats — it equals its own slice of the canonical seat table, and the token totals summed across the paged event stream equal that slice's totals.
Against GitHub, Anthropic, Devin, OpenAI · parity/m3-parity.test.ts
Every `commitHash` on `/analytics/ai-code/commits` fetches on the GitHub host with the same `sha` and an `author.login` equal to the reported `userEmail`'s localpart, and every FINISHED agent's `target.prUrl` is a GitHub pull request whose `head.ref` is that agent's `target.branchName`.
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.
cursor-2026-08.snap.sandboxapis.devgeneration 3unversionedservedcursor-2026-08-g10.snap.sandboxapis.devgeneration 10unversionedservedcursor-2026-08-g11.snap.sandboxapis.devgeneration 11unversionedservedcursor-2026-08-g6.snap.sandboxapis.devgeneration 6unversionedservedcursor-2026-08-g8.snap.sandboxapis.devgeneration 8unversionedservedcursor-2026-08-g9.snap.sandboxapis.devgeneration 9unversionedservedNeed an endpoint that is not served yet?
Every row Cursor'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.