Founding keys are opena year free at 6,000 req/hour, for the first 1,000 developersClaim yours

Cursor

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.

REST · 21 endpointsMCP-ready

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.

Live host
cursor.sandboxapis.dev
Pinned hosts
6 — generation 3, 6, 8, 9, 10, 11
Serving since
2026-08-16
Lifecycle
Live

Served & 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

Point your client at a different base URL.

No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.

shell
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

Every read surface, grouped the way Cursor groups it.

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

served & verified
answers with real universe data, and this build checked that response against the vendor's spec.
deviation
served and faithful to the real provider, but failing the vendored spec — usually a bug in the spec.
retired
the vendor removed the endpoint; snapshots pinned before that date still serve it.
planned / deferred
not served yet — an explicit coverage error naming the gap, never invented data.
excluded
out of the claim by policy (writes, and surfaces we refuse); not in any denominator on this page.

Mode — what kind of answer a row gets

derive
the response is computed from artifact rows that already exist
generate
canon does not carry this yet; the generator will produce it, then derive
empty
the true answer for this universe is an empty collection — reason + reviewed date required
refuse
mirror the provider's OWN refusal (e.g. its 403 for a non-admin token) — reason + reviewed date required
read-only
a write named in the manifest because clients probe it; the read-only 403 IS its final response, and it never joins the badge denominator

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

Full
every published read row has a final answer
Deep
60% up to 100%
Partial
25% up to 60%
Preview
under 25%

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

ai-code-tracking5 of 5 served & verified
GET
/analytics/ai-code/changes
served & verified
Core
GET
/analytics/ai-code/changes.csv
served & verified
Core
GET
/analytics/ai-code/commits
served & verified
Core
GET
/analytics/ai-code/commits.csv
served & verified
Core
GET
/analytics/ai-code/commits/{commitHash}
served & verified
Core
analytics5 of 5 served & verified
GET
/analytics/team/agent-edits
served & verified
Core
GET
/analytics/team/dau
served & verified
Core
GET
/analytics/team/leaderboard
served & verified
Core
GET
/analytics/team/models
served & verified
Core
GET
/analytics/team/tabs
served & verified
Core
cloud-agents5 of 5 served & verified
GET
/v1/agents
served & verified
Next
GET
/v1/agents/{id}
served & verified
Next
GET
/v1/me
served & verified
Next
GET
/v1/models
served & verified
Next
GET
/v1/repositories
served & verified
Next
admin-usage3 of 3 served & verified
POST
/teams/daily-usage-data
served & verified
Core
POST
/teams/filtered-usage-events
served & verified
Core
POST
/teams/spend
served & verified
Core
analytics-by-user1 of 2 served & verified
GET
/analytics/by-user/tabs
served & verified
Next
GET
/analytics/by-user/dau

derive — served on the pins frozen before the retirement; the live host refuses it (meta.retired_meaning)

retired
Next
admin1 of 1 served & verified
GET
/teams/members
served & verified
Core

03 / What's simulated

One data set, rendered in Cursor's dialect.

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):

What another provider has to agree with, and the test that makes it

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.

05 / Pinned snapshots

Frozen universes, on their own hostnames.

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.

PinHostUniverse generationCursor API versionRepository files
cursor-2026-08cursor-2026-08.snap.sandboxapis.devgeneration 3unversionedserved
cursor-2026-08-g10cursor-2026-08-g10.snap.sandboxapis.devgeneration 10unversionedserved
cursor-2026-08-g11cursor-2026-08-g11.snap.sandboxapis.devgeneration 11unversionedserved
cursor-2026-08-g6cursor-2026-08-g6.snap.sandboxapis.devgeneration 6unversionedserved
cursor-2026-08-g8cursor-2026-08-g8.snap.sandboxapis.devgeneration 8unversionedserved
cursor-2026-08-g9cursor-2026-08-g9.snap.sandboxapis.devgeneration 9unversionedserved

Need 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.

Request coverage