To export Cursor's usage events: open the Cursor dashboard, go to Usage, and click Export CSV. It downloads every request your team made in the selected window — one row per event, not one row per person or per day.

The file's real header, verbatim from a verified 601-row export (2026-08-24 to 2026-08-29, 9 users):

Real header row13 columns
Date,User,Cloud Agent ID,Automation ID,Kind,Model,Max Mode,Input (w/ Cache Write),Input (w/o Cache Write),Cache Read,Output Tokens,Total Tokens,Cost

Two things about this header surprise anyone who builds against Cursor's own /teams/filtered-usage-events API first: there's no Conversation ID column at all, and Kind prints the short form of a status the API returns longer (Included, never Included in Business).

What each column means

ColumnMeaning
DateRequest timestamp, ISO with milliseconds (2026-08-26T09:00:12.345Z).
UserActor's email — blank on a service-account or cloud-agent row.
KindIncluded, Usage-based, Free, Errored, Not Charged, Aborted, Not Charged, or User API Key. This is the column that decides billing — see below.
ModelExact model string, e.g. cursor-grok-4.6-xhigh-fast, claude-opus-5-thinking-high.
Max ModeYes/No.
Input (w/ Cache Write)Despite the name, this is the cache-write token count on its own — not a sum that includes the write.
Input (w/o Cache Write)Ordinary input tokens.
Cache Read / Output TokensStraightforward token counts.
Cost- for a normal Included row, Free for promotional usage, or a real dollar figure. See below — this is the column a naive sum gets wrong.

Included vs Usage-based — the distinction that decides what you were charged

Kind = Included means the request was covered by the seat's plan allowance — it shows up in the log with real token counts, but Cursor's own Cost cell reads -. Kind = Usage-based means it billed beyond the allowance, and Cost carries a real number. Free is a third, separate case — promotional usage, also a genuine $0.

Why a naive row-sum overstates spend

It's tempting to price every row yourself — tokens × the model's published rate — and call that "spend." Don't: on a verified 601-row export, every single row's Kind is Included — the split that actually matters is in Cost, not Kind: 589 rows show Cost = - (no charge) and 12 show Cost = Free (a genuine $0), all zero-dollar either way. Re-pricing those 601 rows at list rate instead of reading Cost turns real $0 usage into fabricated spend — the seat allowance those requests actually drew from never appears in the CSV at all.

The column to trust for "what did this actually cost" is Cost itself, not a token-based estimate: any non--/Free value is a real, vendor-stated charge, regardless of Kind — an Included row can still carry a real charge if your org's plan works that way, so checking Kind alone isn't enough either.

One more gap worth knowing before you upload it

This export has no Conversation ID column, so a CSV-uploaded row for the same underlying event your team's live-collected data already has does not automatically merge with it — uploading a CSV that overlaps a period you've already synced via the API adds a second, parallel set of rows for that window. That duplication is harmless for dollars only when every overlapping row is genuinely -/Free: as above, a row can carry a real Cost regardless of Kind, and any such row is counted as real spend twice. On a team with usage-based billing, re-uploading an overlapping window can double-count actual dollars — worth checking your date range before you upload, not just requests or tokens.