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):
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
| Column | Meaning |
|---|---|
Date | Request timestamp, ISO with milliseconds (2026-08-26T09:00:12.345Z). |
User | Actor's email — blank on a service-account or cloud-agent row. |
Kind | Included, Usage-based, Free, Errored, Not Charged, Aborted, Not Charged, or User API Key. This is the column that decides billing — see below. |
Model | Exact model string, e.g. cursor-grok-4.6-xhigh-fast, claude-opus-5-thinking-high. |
Max Mode | Yes/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 Tokens | Straightforward 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.
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.