|
| 1 | +<h1 align="center">📊 cursor-usage</h1> |
| 2 | + |
| 3 | +<p align="center"> |
| 4 | + <b>See your <a href="https://cursor.com">Cursor</a> usage, spend, and per-event logs — right from your terminal.</b> |
| 5 | +</p> |
| 6 | + |
| 7 | +<p align="center"> |
| 8 | + <img alt="Python" src="https://img.shields.io/badge/python-3.8%2B-blue"> |
| 9 | + <img alt="Platforms" src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey"> |
| 10 | + <img alt="Dependencies" src="https://img.shields.io/badge/dependencies-zero-brightgreen"> |
| 11 | + <img alt="License" src="https://img.shields.io/badge/license-MIT-green"> |
| 12 | +</p> |
| 13 | + |
| 14 | +--- |
| 15 | + |
| 16 | +Cursor shows your usage on its web dashboard, but there's no official way to get |
| 17 | +it from the command line. **`cursor-usage` gives you that** — a clean summary, a |
| 18 | +per-day breakdown, and a full per-event CSV export — using the session your |
| 19 | +Cursor app already has. No API key to manage, nothing to configure. |
| 20 | + |
| 21 | +```text |
| 22 | +============================================================================== |
| 23 | +CURSOR USAGE | you@example.com | 2026-06-04 -> 2026-06-09 |
| 24 | +============================================================================== |
| 25 | +Included value used : $875.81 (compute consumed; included in plan) |
| 26 | +Tokens in=126,033,860 out=18,989,068 |
| 27 | + cacheRead=2,492,781,450 cacheWrite=8,322,520 |
| 28 | +------------------------------------------------------------------------------ |
| 29 | +model $ value in tok out tok |
| 30 | +------------------------------------------------------------------------------ |
| 31 | +composer-2.5 460.14 95,638,983 13,315,470 |
| 32 | +claude-4.6-opus-high 233.71 786,434 1,059,451 |
| 33 | +gemini-3.5-flash 45.77 16,097,065 1,075,904 |
| 34 | +gpt-5.4-high 43.65 4,069,043 1,041,967 |
| 35 | +... |
| 36 | +``` |
| 37 | + |
| 38 | +## ✨ Features |
| 39 | + |
| 40 | +- **One command, real numbers** — per-model tokens and compute value for the |
| 41 | + current billing month. |
| 42 | +- **📅 Per-day breakdown** — `--by-day` shows how much you burned each day. |
| 43 | +- **🧾 CSV export** — `--csv` dumps every usage event (timestamp, model, tokens, |
| 44 | + cost) for your own spreadsheets and charts. |
| 45 | +- **🌍 Cross-platform** — macOS, Linux, and Windows. |
| 46 | +- **🔋 Zero dependencies** — pure Python standard library. |
| 47 | +- **🔒 Local & private** — reads the session your Cursor app already stored; |
| 48 | + talks only to `cursor.com`. No telemetry, no third parties. |
| 49 | + |
| 50 | +## 🚀 Quickstart |
| 51 | + |
| 52 | +```bash |
| 53 | +pip install cursor-usage-cli # or: pip install . from a clone |
| 54 | +cursor-usage # summary for the current billing month |
| 55 | +``` |
| 56 | + |
| 57 | +That's it — if you're signed in to Cursor on this machine, it just works. |
| 58 | + |
| 59 | +## 🧑💻 Usage |
| 60 | + |
| 61 | +| Command | What it does | |
| 62 | +|---|---| |
| 63 | +| `cursor-usage` | Summary for the current billing month | |
| 64 | +| `cursor-usage --by-day` | Add a per-day breakdown | |
| 65 | +| `cursor-usage --csv usage.csv` | Export every usage event to CSV | |
| 66 | +| `cursor-usage --days 7` | Window: the last 7 days | |
| 67 | +| `cursor-usage --month 2026-05` | Window: a specific month | |
| 68 | +| `cursor-usage --start 2026-06-01 --end 2026-06-07` | Window: an explicit range | |
| 69 | +| `cursor-usage --json` | Raw aggregated JSON (for scripting) | |
| 70 | +| `cursor-usage -v` | Also print which session source was used | |
| 71 | + |
| 72 | +Flags combine — e.g. `cursor-usage --by-day --csv june.csv --month 2026-06`. |
| 73 | + |
| 74 | +<details> |
| 75 | +<summary><b>📅 Example: <code>--by-day</code></b></summary> |
| 76 | + |
| 77 | +```text |
| 78 | +============================================================================== |
| 79 | +CURSOR USAGE BY DAY | you@example.com | 2026-06-02 -> 2026-06-09 |
| 80 | +============================================================================== |
| 81 | +date events $ value in tok out tok |
| 82 | +------------------------------------------------------------------------------ |
| 83 | +2026-06-04 433 324.46 38,602,275 6,080,617 |
| 84 | +2026-06-05 368 252.58 40,616,543 6,469,309 |
| 85 | +2026-06-06 416 121.06 29,686,247 4,497,010 |
| 86 | +------------------------------------------------------------------------------ |
| 87 | +TOTAL 1,661 929.46 128,631,599 20,101,078 |
| 88 | +``` |
| 89 | +</details> |
| 90 | + |
| 91 | +<details> |
| 92 | +<summary><b>🧾 CSV columns</b></summary> |
| 93 | + |
| 94 | +`datetime_local, timestamp_ms, date, model, kind, input_tokens, output_tokens, |
| 95 | +cache_read_tokens, cache_write_tokens, value_cents, charged_cents, |
| 96 | +requests_costs, is_headless, owning_user` — one row per usage event, sorted by |
| 97 | +time. |
| 98 | +</details> |
| 99 | + |
| 100 | +## 🤔 How it works |
| 101 | + |
| 102 | +A Cursor **API key** (`crsr_…`) can't read usage — that data lives behind your |
| 103 | +web **session**, the same one your browser/app uses on `cursor.com`. This tool |
| 104 | +finds that session locally and asks Cursor's dashboard API for your numbers. |
| 105 | + |
| 106 | +It looks for the session in this order (all **local-only**): |
| 107 | + |
| 108 | +1. `CURSOR_SESSION_TOKEN` environment variable (manual override) |
| 109 | +2. macOS Keychain (written by the `cursor-agent` CLI) |
| 110 | +3. Your OS keyring, if the optional `keyring` package is installed |
| 111 | +4. The Cursor app's local state database (works on every OS) |
| 112 | + |
| 113 | +If it can't find one, sign in to the Cursor app and run it again. |
| 114 | + |
| 115 | +<details> |
| 116 | +<summary><b>🔍 Where exactly the session lives (per OS)</b></summary> |
| 117 | + |
| 118 | +The Cursor IDE stores the session token in a small SQLite file |
| 119 | +(`state.vscdb` → key `cursorAuth/accessToken`), in the same place on every OS: |
| 120 | + |
| 121 | +| OS | Path | |
| 122 | +|---|---| |
| 123 | +| macOS | `~/Library/Application Support/Cursor/User/globalStorage/state.vscdb` | |
| 124 | +| Linux | `~/.config/Cursor/User/globalStorage/state.vscdb` | |
| 125 | +| Windows | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | |
| 126 | + |
| 127 | +Want the full reverse-engineering story (and a recipe to rebuild this tool)? See |
| 128 | +**[docs/HOW_THIS_WAS_BUILT.md](docs/HOW_THIS_WAS_BUILT.md)**. |
| 129 | +</details> |
| 130 | + |
| 131 | +### Manual override |
| 132 | + |
| 133 | +On any OS you can skip auto-detection entirely: |
| 134 | + |
| 135 | +```bash |
| 136 | +# cursor.com → DevTools → Application → Cookies → copy WorkosCursorSessionToken |
| 137 | +export CURSOR_SESSION_TOKEN='user_…::eyJhbGci…' |
| 138 | +cursor-usage |
| 139 | +``` |
| 140 | + |
| 141 | +## 🔒 Privacy & security |
| 142 | + |
| 143 | +- The tool only **reads** your existing local session — it never writes, |
| 144 | + refreshes, or sends it anywhere except `cursor.com`. |
| 145 | +- **No telemetry. No third-party calls.** |
| 146 | +- CSV exports contain your own usage data; they're git-ignored by default so you |
| 147 | + don't commit them by accident. |
| 148 | + |
| 149 | +## ⚠️ Good to know |
| 150 | + |
| 151 | +- **`$ value` is compute consumed, not money owed.** On plans where usage-based |
| 152 | + pricing is off, your bill is just the flat subscription — these figures show |
| 153 | + the value of the compute included in your plan. |
| 154 | +- This uses Cursor's **internal, undocumented** dashboard API. It works great |
| 155 | + today, but Cursor could change it at any time. If something breaks, please open |
| 156 | + an issue. |
| 157 | +- If your session has expired, sign back in to Cursor and run the command again. |
| 158 | + |
| 159 | +## 🛠️ Install options |
| 160 | + |
| 161 | +```bash |
| 162 | +pip install cursor-usage-cli # from PyPI (once published) |
| 163 | +pip install . # from a local clone |
| 164 | +pip install "cursor-usage-cli[keyring]" # + OS-keyring lookup on Linux/Windows |
| 165 | +``` |
| 166 | + |
| 167 | +Requires Python 3.8+. |
| 168 | + |
| 169 | +## 🤝 Contributing |
| 170 | + |
| 171 | +Issues and PRs are welcome. Run the tests with: |
| 172 | + |
| 173 | +```bash |
| 174 | +pip install pytest && pytest -q |
| 175 | +``` |
| 176 | + |
| 177 | +## 📄 License |
| 178 | + |
| 179 | +[MIT](LICENSE) — do whatever you like. |
0 commit comments