Discrepancies between cursor-CLI `usage` and billing

Where does the bug appear (feature/product)?

Cursor CLI

Describe the Bug

I was happy to see the usage is now available in the repsonse

"usage": {"inputTokens": 7, "outputTokens": 548, "cacheReadTokens": 147695, "cacheWriteTokens": 39331}

but the input tokens are implausibly low. checking against https://cursor.com/dashboard/usage all numbers are different except cacheWriteTokens which is always exact.

it would be good to get the literal exact usage.

It would additionally be great to get back the cost in the response.

Steps to Reproduce

do a CLI call with --stream-json

Operating System

Windows 10/11

Version Information

About Cursor CLI

CLI Version 2026.06.26-7079533
Model Sonnet 4.6 200K Medium No Thinking
Subscription Tier Enterprise
OS win32 (x64)
Terminal unknown
Shell cmd
User Email [email protected]

For AI issues: which model did you use?

claude-4.6-sonnet-medium

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hi @Mark_Lemay Thanks for the post! This is actually mostly expected behavior, allow me to explain. The numbers are accurate, but inputTokens in the CLI output means something more specific than it looks.

inputTokens here is Anthropic’s uncached count: it’s only the tokens that were neither read from cache nor written to cache. Your new message and context this turn get cache-written (that’s why cacheWriteTokens is large at 39,331), and the prior conversation is served from cache (cacheReadTokens 147,695). What’s left over as truly uncached is tiny, just 7. So a low inputTokens means caching covered almost everything, not that the input was small. For the real total input, sum the three input-side fields:

inputTokens + cacheReadTokens + cacheWriteTokens = 7 + 147695 + 39331 = 187033

That 187,033 is what billing is based on. cacheWriteTokens matches the dashboard exactly because it’s passed through unchanged.

The dashboard’s main “Tokens” value is the sum of all four categories, so it won’t match any single CLI field. Hover over it to see the per-type breakdown - your CLI inputTokens lines up with the “Input” line there, not the headline. Also note the CLI usage block covers the whole turn (every model call), while the dashboard lists individual requests, so one run can show as several rows.

Let me know if you have any follow-up questions!

should have included the image earlier

@kevinn, this is the discrepancy I am referring to: different Input, output, and Cache Read numbers.

I am also trying to set things up in as clean a manner as possible. so each turn should match the request.