Add Quota Information Access to Claude Code CLI
Status Open
Maintainer reply None cached
Workaround ✓ Mentioned in thread ↓
Activity 26 comments · opened Dec 10, 2025
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
Description
Problem
Claude Desktop displays quota information (session %, weekly %) in the UI, but this data is not accessible to Claude Code CLI users or automation scripts. This forces users to manually check the desktop app and record values, preventing automated monitoring and workflow optimization.
Request
Expose quota information via Claude Code CLI through one of these methods:
- New
claude quotacommand (recommended) - API endpoint that CLI can query
- Environment variables set by Claude Code
- Local configuration file that gets updated
Example Use Cases
# Get current quota
$ claude quota
Session: 78%
Weekly (All): 17%
Weekly (Sonnet): 5%
# JSON for scripting
$ claude quota --json
{"session": 78, "weekly_all": 17, "weekly_sonnet": 5}
# Enable/disable features based on quota
if [ $(claude quota --session) -gt 80 ]; then
export ALWAYS_THINKING=false
else
export ALWAYS_THINKING=true
fi
Why This Matters
- ✅ Enables automated quota monitoring
- ✅ Allows workflow optimization based on resource limits
- ✅ Reduces manual, repetitive checking
- ✅ Enables third-party tool integration
- ✅ Data already exists; just needs exposure
Proposed Solution
Proposed Solution
Option 1: CLI Command (Recommended)
# Basic usage
claude quota
# Output:
# Session: 78% (resets in 3h 20m)
# Weekly (All): 17% (resets in 6 days)
# Weekly (Sonnet): 5% (resets in 6 days)
# JSON output
claude quota --json
# { "session_percent": 78, "weekly_all_percent": 17, "weekly_sonnet_percent": 5 }
# Individual values
claude quota --session # 78
claude quota --weekly-all # 17
claude quota --weekly-sonnet # 5
# With reset times
claude quota --json --with-reset-times
Option 2: Environment Variables
# Set by Claude Code when running
export CLAUDE_QUOTA_SESSION=78
export CLAUDE_QUOTA_WEEKLY_ALL=17
export CLAUDE_QUOTA_WEEKLY_SONNET=5
Option 3: Config File
// ~/.claude/quota.json (auto-updated)
{
"session": {
"percent": 78,
"resets_in_seconds": 12600
},
"weekly_all": {
"percent": 17,
"resets_at": "2025-12-16T13:59:00Z"
},
"weekly_sonnet": {
"percent": 5,
"resets_at": "2025-12-16T19:59:00Z"
}
}
Benefits
For Users
- Automated quota monitoring without manual checking
- Ability to build quota-aware workflows
- Better resource management
- Integration with terminal tools (statusline, etc.)
For Anthropic
- Improved user experience
- Enables ecosystem of tools
- Reduces support burden
- Competitive advantage
No Downsides
- No security issues (quota is per-user, already in UI)
- No breaking changes (new feature only)
- Low implementation effort (data already exists)
Alternative Solutions
Current Workaround (User Experience)
Every 3-4 hours:
1. Open Claude Desktop
2. Check quota percentages
3. Manually run script: cq update 78 17 5
4. Continue work
This is tedious, error-prone, and prevents automation.
Priority
High - Significant impact on productivity
Feature Category
Interactive mode (TUI)
Use Case Example
Example Use Cases
# Get current quota
$ claude quota
Session: 78%
Weekly (All): 17%
Weekly (Sonnet): 5%
# JSON for scripting
$ claude quota --json
{"session": 78, "weekly_all": 17, "weekly_sonnet": 5}
# Enable/disable features based on quota
if [ $(claude quota --session) -gt 80 ]; then
export ALWAYS_THINKING=false
else
export ALWAYS_THINKING=true
fi
Additional Context
Technical Notes
Data Already Exists
- Claude Desktop displays this data
- Calculated server-side
- Just needs CLI exposure
Implementation Considerations
- Rate limiting (if needed) - recommend none (local data)
- Backwards compatibility - not an issue (new feature)
- Cross-platform support - should work on all platforms
- Error handling - graceful fallback when not available
---
Related
- Users unable to monitor quota automatically
- Cannot integrate quota data into workflows
- No programmatic access to resource limits
- Third-party tools cannot access quota data
---
Additional Context
Current User Solution (Workaround)
Users have built their own quota tracking:
- Manual
cq updatecommand - Daemon that sends reminders every 5 minutes
- Cannot auto-fetch because no API exists
- Result: Still manual, just with notifications
Ideal User Solution
With this feature:
claude quotacommand provides current data- Daemons can automatically fetch and display
- Tools can build quota-aware features
- No manual intervention needed
---
Example: Terminal Status Line Integration
With quota API, tools like Powerlevel10k could display:
╭─ 📁 my-project main │ ⚡78% W:17%
╰─ Claude Haiku │ 14:23 │ ⏱ 2h 45m
Currently impossible without access to quota data.
---
Acceptance Criteria
- [ ]
claude quotacommand available - [ ] Returns current session/weekly percentages
- [ ] JSON output for scripting
- [ ] Works across all platforms
- [ ] Documentation provided
- [ ] Examples in help text
- [ ] No breaking changes
---
Priority
High - Enables many user workflows and integrations
---
References
- Claude Code GitHub: https://github.com/anthropics/claude-code
- Claude Documentation: https://claude.com/claude-code
- Issue: Users cannot automate quota monitoring
26 Comments
Cross-Platform Usage Visibility Gap
This request is even more critical when you consider that Claude Pro usage is shared across all platforms (web, mobile, desktop apps, and Claude Code CLI).
The Problem
Currently, Claude Code has zero visibility into the user's total Claude Pro usage, even though:
ccusageandclaude-monitorcan only track local JSONL files from Claude Code sessionsReal-World Impact
CLI-first users who rarely open the web interface have no way to know if they're approaching their limits until they hit them unexpectedly during important work sessions. This is especially problematic because:
Additional Solution: Official MCP Server
In addition to the CLI command approach outlined in this issue, consider providing an official MCP server like
@anthropic/claude-usagethat exposes:This would enable the entire MCP ecosystem to build quota-aware tools and integrations.
Expected Behavior
Running
/usageor a similar command should show the same data visible on claude.ai:This affects everyone who uses Claude Code as part of a multi-platform workflow, which is likely the majority of Pro users.
+1 for this feature!
One additional idea that could complement the proposed
claude quotacommand: a watch/live mode for real-time monitoring:Watch mode behavior:
watchorhtop)--json)This would allow users to keep a small terminal open as a live usage dashboard while working.
+1 on this. The cross-platform visibility gap is the biggest pain point. Local JSONL parsing can approximate CLI usage, but it completely misses consumption from claude.ai, mobile, and desktop apps — so any local tool will always show inaccurate percentages compared to
/usage.An official API endpoint or MCP server exposing the same data as
/usage(current %, reset times, per-window breakdown) would be extremely valuable. Even a simple JSON output fromclaude quota --jsonwould unlock a whole ecosystem of monitoring tools.Working solution: OAuth usage API endpoint
For anyone building status line integrations, there's already a working endpoint that returns the exact same data as
/limits:Auth: Bearer token from macOS Keychain:
Response:
utilizationvalues are percentages matching what/limitsshows.I've integrated this into a status line script with 60s caching. Works reliably.
Real-world perspective: building a production macOS app on top of these internal endpoints
I'm the developer of Tokamak for Claude, a macOS menu bar app that monitors Claude Max quota and Claude Code session statistics. It's in the App Store review pipeline right now. I want to share what building on top of internal, undocumented endpoints actually looks like in practice — and why a public API is essential.
What we currently do (and why it's fragile)
Tokamak polls two internal endpoints:
GET /api/organizations— to discover the user's org UUID and detect plan type (Max/Pro)GET /api/organizations/{org_id}/usage— for real-time utilization windows (5h, 7d, 7d-sonnet, 7d-opus, 7d-cowork, etc.)Authentication requires a
sessionKeycookie from claude.ai, obtained via a hidden WKWebView that loads the login page. This is inherently fragile:iguana_necktieshowed up as a null window one day.seven_day_coworkandseven_day_oauth_appsappeared without any changelog. We handle all windows as optional and degrade gracefully, but this is defensive programming against an API that could break us at any time.What a public API would unlock
A stable
GET /api/v1/usage(orclaude quota --json) with:This would benefit not just Tokamak but the growing ecosystem: CodexBar, terminal statusline integrations, automation scripts, and anyone who wants to build quota-aware workflows.
The broader ask
Other AI providers already offer this:
GET /v1/organization/usagewith proper API key authClaude is the only major provider where monitoring your own quota requires reverse-engineering internal web endpoints. For a platform that's actively encouraging developers to build with Claude Code, having no official way to check "how much quota do I have left?" is a significant gap.
I'd strongly advocate for Option 1 (CLI command) from the original proposal plus a documented REST endpoint. The CLI command helps individual users; the REST endpoint enables the tool ecosystem.
Happy to help test any beta implementation against Tokamak's existing infrastructure.
Correction to the OAuth endpoint details above — there's a required header that was missing, and the response schema has expanded.
Without the
anthropic-betaheader, the endpoint returns anauthentication_error.Getting the token (macOS):
Full response (as of Feb 2026):
Changes from @trillium's original response format:
seven_day_oauth_apps,seven_day_cowork,iguana_necktiewindows added (all nullable)extra_usageobject added (tracks overuse billing: enabled status, monthly limit, used credits)One-liner to test:
The gap is blocking real tools from shipping
This issue perfectly captures why proper API exposure matters. We already have:
Why this matters for Anthropic:
Making this official would immediately:
/v1/organization/usageendpointThe implementation exists. The OAuth endpoint already returns exactly what
/limitsshows — just needs to be documented and stable. A simpleclaude quota --jsoncommand or versioned REST API would unblock dozens of tools users are already trying to build.This isn't a nice-to-have. Users are currently choosing to ignore quota warnings and hit limits unexpectedly because there's no programmatic way to monitor across platforms. That's a UX failure we can fix right now.
Progress on the data access front: since v2.1.80,
rate_limits(five_hour/seven_dayused_percentage+resets_at) are in the statusline stdin JSON. Not a standaloneclaude quota --jsoncommand yet, but the data is no longer locked behind internal endpoints — statusline scripts can read it without OAuth workarounds.claude-lens reads these fields for real-time quota display. The Tokamak approach for a full CLI/menu bar solution is complementary.
+1
+1 — Strong use case from building a web UI wrapper around Claude Code CLI.
We're building an internal bug triage tool that spawns Claude Code CLI via
child_process.spawnwith--output-format stream-json. The web dashboard manages parallel investigation sessions and needs to show operators:Currently the only way to see this is in the Claude Code status bar during an interactive session, but our tool runs in
--printmode where the status bar isn't available.Ideal for our case: A
claude usage --jsoncommand we can poll, or even better, usage info included in thestream-jsonoutput events (e.g., ausage_updateevent type alongsideresultevents). The latter would let us update the dashboard in real-time without additional polling.This would save us from having to manually track/estimate token budgets as a poor approximation of the actual rate limits.
This is what works reliably for me, on ubuntu:
In this example, I get the
weeklyUsagein bash runtime as a number (eg. 73).See the full response of https://api.anthropic.com/api/oauth/usage for other metrics, like session usage (
five_hour).I hit this exact wall last month. Claude Code stopped me mid-refactor at what turned out to be 71% weekly, but I had no clue until I opened the desktop app. Burned about 40 minutes guessing whether I could keep going or should switch to Sonnet. The frustrating part is the data already exists, claude.ai/settings/usage renders it from an internal endpoint that returns clean JSON. ccusage and similar local-log tools cannot see it because Anthropic enforces the quota server-side. A
claude quota --jsoncommand would solve maybe 80% of the daily 'is it worth starting this task' decision.+1 for usage API for subscription plans
+1
+1
I’d love to see a view like https://claude.ai/settings/usage
ANSI when interactive, markdown when not interactive/--md, simplified JSON
a script I have does this:
ANSI output by default:
+1 — a concrete use case for subscription (Pro/Max, OAuth) users running headless.
We run Claude Code headless in a container and want to surface remaining quota + reset time on an ops dashboard. Today there's no programmatic tap for it:
/usageshows it but is interactive-only — no JSON/export.claude -p --output-format jsonreturns per-turn tokens + cost, but no remaining-quota / reset fields.CLAUDE_CODE_ENABLE_TELEMETRY=1) exposes consumption metrics only — no limit/quota-utilization gauge.anthropic-ratelimit-*headers are API-key only, not surfaced for subscription CLI.A JSON-exportable usage view (e.g.
claude usage --output-format json, or the statusLine/limit fields proposed in #12520) returning rolling-window % used + reset timestamp would close the gap. Consumption is observable; remaining capacity is the missing half. Thanks!+1 to what @lorenzowood just laid out, that's the exact gap left now that @Astro-Han's statusline fix (v2.1.80, rate_limits) landed. One more spot worth adding to that list: hooks don't get rate_limits either, even though hookSpecificOutput.additionalContext already lets a hook feed text straight into the model's context. Right now the only way around that is the same /api/oauth/usage endpoint several people above have flagged as fragile (schema drift, surprise 429s). Putting rate_limits in hook input and in --output-format json would cover the statusline, hooks, and headless cases in one change instead of three separate asks.
The
rate_limitsstatusline addition helps interactive Claude Code sessions. The remaining gap is a stable JSON surface for headless use: hooks, CI wrappers, dashboards, and shell/statusline renderers outside Claude Code's statusline stdin.I'd like
claude quota --jsonor--output-format jsonto define freshness and failure behavior, not only return usage numbers. Useful fields/semantics would include:fetched_atstale: true|falseorsource: "live"|"cache"The lesson from
ax quotawas that percentages were straightforward; the hard part was deciding whether the data was live, cached, or stale fallback, and making statusline/menubar integrations fail quietly.Concrete ask: expose quota through a stable JSON contract that includes both quota values and freshness metadata, so downstream tools can decide whether to show, hide, or label stale data.
---
_Generated with ax._
Now I use CLI to get usage every 15mins, have both web and PICO version.
!image
+1 on this. One specific angle worth including in the design: it'd be great if usage/quota data could also be surfaced within an active session (e.g. via a hook, or fields injected into
additionalContext/statusLineinput), not just as a standaloneclaude quotaCLI print. That would let the assistant itself read current quota state mid-conversation and proactively flag "you're at 80% of your session limit" rather than requiring the user to run/usageand relay the number manually.For anyone looking for a stopgap while waiting for an official
claude quotacommand, I built a tiny local-only dashboard that queries the OAuth usage endpoint and shows Claude Code Max session/weekly limits (plus Kimi and Z.ai if you add those tokens). Tokens stay in your browser and are only sent to the provider APIs.https://ryan-knowone.github.io/quota-dashboard/
It obviously doesn't replace a native CLI command, but it's useful for the "am I about to hit my weekly cap?" check that currently requires opening the desktop app.
There is the undocumented api endpoint that provides all this info, without the need for a AnthropicsAPIkey, but unfortunately its probably against TOS.
Its the same exact endpoint that the App desktop/mobile app uses to show you what your at.
https://claude.ai/api/organizations/{orgID}/usage
You still have to be logged in to use it though.
The ask here is @amphro's, unchanged —
rate_limitsin hook input, and available headless. I want to add the part I have not seen stated: a session cannot learn which account governs it, so a quota reading can be confidently wrong and look completely normal.That is the failure I care about, and it is not budgeting. With several concurrent sessions on one account-wide pool, the thing that costs real work is a session hitting a cutoff mid-task with uncommitted changes. The whole point of reading quota is to commit and hand off before that happens — so a number that is wrong is worse than no number at all, because it is the number a session uses to decide it is safe to keep going.
The payload names no account.
rate_limitsdescribes a per-account pool without identifying which account it belongs to, and nothing else in a session's inputs does either. So a monitor has to hardcode which credentials to read. On a box with more than one Claude account signed in, it will happily display another account's headroom, labelled as this session's, with no indication anything is off. Mine did exactly that — the warning banner every session sees names an account that does not necessarily govern that session.And the one surface that carries
rate_limitshas no host on two of the three ways I run Claude Code. It arrives on a statusLine command's stdin and nowhere else, so quota state cannot be subscribed to — it has to be collected by a statusLine and published somewhere shared, which forces a one-publisher/N-readers design nobody would choose. Then:claude -por the SDK. A headless coordinator can read what an interactive session publishes and can never publish it itself — backwards from where the need is.So the documented workaround everyone in this thread is describing — collect from a statusLine, publish to a file — has nowhere to run for a desktop or headless user. That is why I would rather have it in hook input than have the statusLine path improved.
One ask, then:
rate_limitsin theSessionStart/UserPromptSubmithook payload, or a headless-capable JSON usage output — plus whatever identifies the account the numbers belong to. The second half is small and it is what makes the first half safe to act on.Separately and minor: the payload carries
five_hourandseven_dayonly — no per-model bucket. That was raised in #37227, which went stale, was auto-closed after inactivity and is now locked, so it reads as unresolved rather than decided. It matters here only because a green reading on the two visible windows says nothing about a third that could stop you.Setup: Windows 11,
2.1.219, solo dev, several concurrent sessions on one account. n=1.+1 to this issue/feature. Would be extremely helpful for automation, dashboards etc.
Adding a data point that I think narrows this request considerably: the CLI
already computes and returns this, for free. It just returns it as prose.
The envelope reports
total_cost_usd: 0,input_tokens: 0,output_tokens: 0,num_turns: 0,duration_api_ms: 0. It is answered client-side from state theclient already holds, costs no quota, makes no API call, and returns in about
2.5 seconds. The numbers are account-wide, matching what claude.ai/settings/usage
reports, not a local approximation.
The problem is that it lands in
.resultas human text:So consumers regex it, and prose is not a contract. A concrete failure I hit
building on this: the minutes are omitted on the hour, so the same reset renders
as either
7:59pmor8pmdepending on sub-second rounding of a 7:59:59.xinstant, and it genuinely alternates between calls. My parser required
H:MM,matched roughly two calls in three, and silently produced a null reset on the
rest. Nothing errored; a scheduler downstream just started pacing against a
missing value.
Without a supported path, what I had before this was worse: Playwright driving a
real Chrome under Xvfb against
claude.ai/api/organizations/<org>/usage, becausethat endpoint sits behind Cloudflare and rejects non-browser requests. It needs a
logged-in browser profile on the machine, breaks whenever the page changes, and
is not something I would ask anyone else to run.
My use case is pacing unattended work: deciding whether to start a long job now
or wait for the 5-hour window to reset, and staying inside the weekly allowance.
That needs the reset timestamps as much as the percentages.
One gap worth naming, because it is the only reason I cannot delete the scraper
outright:
/usagedoes not report extra-usage credits, and/usage-creditsreturns a link rather than the numbers.
I am not asking for that here, and I barely use credits. I mention it only
because it is the remaining reason a browser-scraping path exists at all in my
setup.
Two minimal shapes, either of which would be enough:
.resultwhen--output-format jsonispassed, since the values already exist at that point.
cost.total_cost_usdandcontext_windowand is polled by exactly thetooling that wants this.
Happy to test either.