I Used 1.05 Billion Tokens in Cursor: What a 93.31% Cache Hit Rate Taught Me
AI Agents

When Cursor’s per-request pricing period was approaching its end, I exported my Usage Events from March 1 to May 19, 2026 and added them up.
The result was larger than I expected: across this Cursor workflow alone, 80 days accounted for 1,051,066,111 tokens of total throughput.
That was not my total AI usage. I was using other tools during the same period; they are not included here. This dataset only covers what I could see in Cursor’s Usage Events: requests, uncached input, cache writes, cache reads, and output.
The number itself is less interesting than the structure behind it. I wanted to know what sustained large-context coding actually looks like in token terms — and which habits become expensive once consumption matters.
Measurement scope
I merged three Cursor Usage Events tables covering March 1 through May 19, 2026.
| Metric | Value |
|---|---|
| Session-event groups | 627 |
| Sub-request calls | 1,225 |
| Total token throughput | 1,051,066,111 |
| Cache-write-related input | 52,728,641 |
| Uncached input | 16,064,432 |
| Cache reads | 975,319,449 |
| Output tokens | 6,953,589 |
The striking number is not only the 1.051 billion total. 975 million tokens were cache reads.
That changes how I interpret “large context.” A huge context does not automatically mean paying the full cost of rebuilding that context on every turn. The important question is how much of it gets reused.
Why my contexts were so large
Across the 627 session-event groups, the average context was 2,043,513 tokens, and the median was 1,137,630 tokens.
That came from how I used Cursor. I rarely limited it to isolated prompts like “write this function.” More often, I let Cursor work with codebase indexing and the relevant files while handling cross-module changes, complicated bugs, refactors, and integration work.
The first load is heavy, but the model gets more of the actual system at once: file relationships, interfaces, historical constraints, and the surrounding implementation. For larger projects, that is closer to real software work than repeatedly pasting individual snippets into a chat.
Without effective caching, though, the economics would look very different.
My model choices changed over the period
In March I still mixed Sonnet and Opus. By April, the main Cursor workload had moved almost entirely to Opus.
| Period | Model-call distribution |
|---|---|
| March 2026 | Sonnet Medium-Thinking: 118 calls (61.1%); Opus High-Thinking: 75 (38.9%) |
| April 2026 | Claude 4.6 Opus High-Thinking: 262 calls (100%) |
| May 2026 through the 19th | Claude 4.6 Opus High-Thinking: 171 calls (100%) |
My reason was practical: on a complicated project, one avoided model mistake can save an hour or two of manual debugging.
That does not mean every task deserves the most expensive model. Small edits, isolated scripts, and well-defined low-risk bugs can be handled by cheaper models. The trade-off becomes different when the task spans files, services, legacy behavior, and multiple constraints.
The 93.31% cache hit rate was the real story
The combined cache hit rate was 93.31%.
| Period | Cache hit rate |
|---|---|
| Overall | 93.31% |
| March 2026 | 90.85% |
| April 2026 | 93.94% |
| May 2026 | 94.38% |
That explains why I was willing to work with such large contexts.
My habit was to keep one conversation alive while working on one core goal. I did not constantly start new chats or clear context. I would establish the relevant code, constraints, and goal once, then keep iterating in the same thread for changes, fixes, and tests.
The initial context write could be large. The follow-up work could reuse a lot of it from cache.
Once usage becomes consumption-sensitive, that habit matters even more. This does not mean “never start a new chat.” It means avoid rebuilding the whole project context for every small branch of the same task. When the goal actually changes, start a new context; when it does not, reuse the one you already paid to establish.
The largest single event
The largest event in the dataset happened on May 7, 2026 at 14:46:
- total context: 20,381,233 tokens
- cache reads: 19,516,684 tokens
- cache rate: 95.76%
- output: 83,968 tokens
The task was a cross-module refactor. The requirement was to change data flow across several core modules without breaking the existing microservice communication protocol. Cursor searched and modified dozens of files and produced nearly 84,000 output tokens in that event.
I could have done the same refactor manually, but it would have been much slower. The value was not merely “typing code faster.” The model could align interfaces, dependencies, historical logic, and the requested change within the same round — provided that I gave it a clear goal and enough context.
What the logs revealed about my work rhythm
The same dataset also exposed my schedule.
Calls were concentrated from Monday through Thursday, with very little activity on Saturday and none on Sunday.
| Day | Calls | Pattern |
|---|---|---|
| Monday | 288 | start and push work forward |
| Tuesday | 355 | busiest day |
| Wednesday | 254 | integration and implementation |
| Thursday | 219 | continued iteration |
| Friday | 98 | wrap-up and checks |
| Saturday | 11 | very little |
| Sunday | 0 | no calls |
By hour, two windows dominated:
- 10:00–12:00: 316 calls, usually problem framing and starting implementation.
- 14:00–19:00: 741 calls, or 60.49% of the day’s calls, where most refactoring and integration work happened.
For me, AI did not turn software work into a 24-hour activity. It compressed a lot of high-intensity development into a few daytime windows. Keeping evenings and weekends mostly out of the dataset was part of the rhythm, not a sign that the tooling was underused.
What I would do under usage-based pricing
The main change is not “use less AI.” It is waste less context.
I would keep five habits:
- Avoid meaningless fresh chats. Keep moving inside the same conversation when the goal is still the same and cache can be reused.
- Define the scope before the first large request. Name relevant files, boundaries that should not change, and acceptance criteria.
- Ask for a plan before a large edit. Confirm direction before letting the model touch twenty files in the wrong way.
- Use cheaper models for small work. A local, explicit, low-risk change does not always need the strongest model.
- Still close long conversations when the goal changes. Reuse context for one coherent goal; do not turn one conversation into a dumping ground for unrelated work.
The 1.051 billion tokens did not teach me that “more tokens are better.” It showed me where large-context coding becomes efficient and where it becomes wasteful.
With a high cache hit rate, a large context can be leverage. With an unclear goal, it can simply amplify wasted work.
Scope of this case study
This dataset represents my own projects, model preferences, and workflow during a specific period. It should not be treated as a universal Cursor usage pattern or as a billing forecast for another developer.
What it does provide is a concrete large-context sample: the raw scale, the cache structure, and the workflow decisions that made that scale workable for me.
Related English articles
- Connect a Local stdio MCP Server to ChatGPT Web
- Fix Codex App
instructions_required400 Behind CLIProxyAPI