The Claude rate limit dashboard for Pro and Max does not exist. Here is what a real one has to render.
Anthropic ships a rate-limit and usage analytics surface in the Console, but the Console analytics features are documented as Team and Enterprise only. Individual Pro and Max subscribers get claude.ai/settings/usage, which renders four bars from a payload that contains eight utilization floats. So “a Claude rate limit dashboard” for a Pro/Max user is something you assemble locally from the same JSON the Settings page calls. This page walks through what that dashboard has to render, field by field, with the exact rendering code from ClaudeMeter’s menu bar app and browser extension.
Direct answer (verified 2026-04-29)
No first-party rate-limit dashboard exists for individual Claude Pro and Max subscribers. The Console analytics surface (activity, acceptance rate, lines accepted, spend) is documented as Team and Enterprise only. The closest thing Pro/Max get is claude.ai/settings/usage, a four-bar settings page. The endpoint that backs it (GET /api/organizations/{org_uuid}/usage) returns eight utilization floats, so a third-party dashboard that reads the same payload locally has more to work with than the Settings page does. Documentation on rate-limit shape lives at platform.claude.com/docs/en/api/rate-limits.
Where the data has to come from
Three endpoints on claude.ai, fetched per account, with the existing logged-in cookies. The browser extension is the only piece that can easily attach those cookies (credentials: 'include' on a same-origin request from inside the extension). A native menu bar app cannot ride that session directly, which is why a real dashboard has to bridge the two.
One poll, three endpoints, three render surfaces
The eight floats the dashboard works with
The UsageResponse struct in src/models.rs lines 19-28 lists every utilization float Anthropic returns:
Seven Window-typed fields plus an ExtraUsage block whose own utilization float is the eighth. The Settings page renders the first four. The back four (seven_day_oauth_apps, seven_day_omelette, seven_day_cowork, and extra_usage.utilization) are present in the JSON but not in the UI. A self-hosted dashboard can render any subset its surface holds.
What goes in a single tile
A “tile” is one account. In the menu-bar dashboard, each tile is a native NSMenu submenu; in the popup, each tile is a div with an email header. The tile body is the same in both: four utilization rows, an extra-usage line, an errors block, and a footer.
Tile body: four utilization rows
build_menu in src/bin/menubar.rs lines 661-749 walks each snapshot and appends one disabled menu line per non-null Window: 5-hour, 7-day, 7-day Sonnet, 7-day Opus. Each line is '<bucket name> <pct>%<reset suffix>'. Missing fields are skipped, never rendered as zero, because seven_day_sonnet on a fresh account that has never used Sonnet returns null and a zero bar would be misleading.
Tile body: extra-usage dollar line
Lines 708-723. The overage block becomes 'Extra $X.XX / $Y.YY (Z%)' if monthly_credit_limit is set, or 'Extra $X.XX used (no cap)' if it is not. If out_of_credits is true, ' BLOCKED' is appended. If disabled_until is set, ' until <Mon Day>' is added. This is the line that catches the green-bars-but-still-rate-limited case the user actually walks into mid-refactor.
Tile footer: errors block
Lines 725-731. Any backend error string captured during fetch is appended after a separator, truncated to 80 characters. This is intentional dashboard noise: it is louder to render the parse error than to drop the field silently, because a silent field at 0 percent reads as 'plenty of headroom' when the truth is 'we did not check'.
Tile footer: jump-to-Settings link
Lines 733-739. Every tile ends with a 'Open claude.ai/settings/usage' menu item that opens the URL in the default browser. The dashboard is not trying to replace the Settings page; it is trying to be the surface you watch all day. When you need the official page (history, billing portal, plan management), one click from the tile takes you there.
Tile footer: forget-this-account button
Lines 741-744. If the snapshot is stale (no fresh data for two minutes), the tile renders a 'Forget this account' option. That removes it from the persisted snapshots.json so a one-off account you logged into once does not haunt your menu bar forever. Stale tiles do not count toward the title chip; only live snapshots do (title_segments line 965).
The exact code that renders one tile
ClaudeMeter does it like this:
One Submenu::new per snapshot, one disabled line per non-null Window. Disabled means the line renders as a label, not a clickable item; the tile is for reading, not for picking. The per-row format string {:>5.1}% right-aligns the percent in five characters, so “5.0%” and “100.0%” line up vertically across rows. That alignment is the difference between a tile you read and a tile you squint at.
Color thresholds: the anchor of the whole dashboard
The single most important rendering decision is when the menu-bar chip changes color. ClaudeMeter picks two thresholds, three states. The exact RGB triples are not arbitrary; they are the same red and orange most macOS system widgets use for warning and error states, tuned so the chip reads against both light and dark menu-bar backgrounds:
The 90-percent threshold for the title chip is set higher than the 80-percent bar threshold on purpose. The chip lives in the corner of your screen all day; flashing orange at 80 percent burns attention you cannot get back. The bar lives inside the popup, which you only look at when you have already opened it; an earlier orange there is a legitimate hint, not a distraction. Two surfaces, two thresholds, one rule: warn at the moment a course-correction is still cheap.
The title chip: compressing two numbers and a state into six characters
The popup is a panel; the title chip is what you see without opening anything. It has to fit two utilization percents and a color state into a few characters of menu-bar real estate. ClaudeMeter offers three formats (Compact, Medium, Long); the single-account branch renders like this:
Two segments per number: the “5h ” / “7d ” label (no color) and the percent (colored by bg_for). Multi-account users get the same shape repeated, prefixed by the first letter of each account email. The chip never tries to surface extra_usage or weekly Opus by default; both are too situational for a glance surface. They live in the tile, one click away.
The localhost bridge: how the extension feeds the menu bar
The browser extension can call /usage with the user’s logged-in claude.ai cookies attached. The native menu-bar app cannot. So the two pieces talk over loopback. The bridge runs a tiny HTTP server on 127.0.0.1:63762 that accepts POST /snapshots from the extension:
Three details worth pulling out. First, the bridge only listens on 127.0.0.1; nothing off your machine can reach it. Second, it accepts only POST /snapshots; everything else 404s, which keeps the surface minimal. Third, it identifies the sending browser by looking up which local process owns the peer TCP port via lsof (peer_browser_by_port at lines 437-462). That means the menu bar always knows which browser a snapshot came from, even if the extension lies about its User-Agent. The browser provenance gets stamped into every tile.
The CLI dashboard: same data, scriptable
The same UsageSnapshot the menu bar renders is also what the CLI binary prints. Same struct, two render targets. This is how you wire the rate-limit dashboard into a tmux pane, a Starship prompt, or a Slack reminder cron:
The render comes from print_pretty in src/format.rs lines 4-73. Each window is formatted by format_window (lines 75-98), which is where the “in 22m” / “in 4d 7h” humanization happens. The CLI is what tells you the menu bar number is real: same numbers, same payload, just different surfaces.
Pro/Max self-hosted dashboard vs Anthropic Console
The Console analytics surface and a Pro/Max self-hosted dashboard solve overlapping problems with different audiences. Both read live data. The Console renders aggregations; the self-hosted view renders the rolling-window detail Pro/Max users actually trip on.
| Feature | Anthropic Console | ClaudeMeter (self-hosted) |
|---|---|---|
| Available to Pro/Max individual subscribers | No (Team/Enterprise only) | Yes (third-party, MIT-licensed) |
| Where the dashboard lives | Web app behind console.anthropic.com login | macOS menu bar, browser toolbar, CLI |
| Refresh cadence | Page reload | 60 seconds, fixed |
| Multi-account view | One org per signed-in seat | One tile per (browser, account) pair |
| Renders the 5-hour rolling window | No, only weekly aggregates and spend | Yes, with countdown to resets_at |
| Renders the extra_usage BLOCKED state | Spend overage shows on billing page, not the analytics view | Yes, painted into the tile and the title chip |
| Data source | Anthropic's analytics aggregations | Same JSON the Settings page calls |
| Cost | Bundled into Team/Enterprise plan price | Free (MIT licensed) |
The Console is the right surface for plan administration and team-wide spend. ClaudeMeter is the right surface for the rolling-window decisions a single Pro/Max user makes mid-refactor.
What this dashboard deliberately does not do
A few things a rate-limit dashboard can do that ClaudeMeter chose not to, and the reasoning:
- No projection.The dashboard does not predict “you will hit the wall in 38 minutes at this burn rate.” The rolling window slides on every prompt, weighted by model class and tool calls. Any projection beyond the next minute is fiction. The countdown to resets_at is the only honest forward-looking number.
- No history.No day-over-day chart, no week-over-week percent, no per-prompt log. The “rolling window” the data describes is server-side and ephemeral; the dashboard keeps only the last fetched snapshot on disk (snapshots.json) so the menu bar can repaint immediately on wake.
- No notifications. No push at 90 percent, no toast at 100. The chip painting orange is the notification. A second notification stream would compete for the same attention and lose.
- No sign-in. No account, no auth, no telemetry endpoint. The dashboard has nothing to log in to because there is no remote service. The only network call is the browser extension polling claude.ai with the cookies the browser already has.
Hitting the wall mid-refactor and want a second pair of eyes?
Fifteen minutes to walk through what your dashboard is showing, where the gating bucket actually sits, and whether overage or a model swap is the cheaper unblock.
Frequently asked questions
Does Anthropic ship a rate-limit dashboard for Pro and Max users?
No. The Claude Console analytics surface (activity, suggestion accept rate, lines-of-code accepted, spend) is documented as available to Team and Enterprise seats only. Individual Pro and Max subscribers see claude.ai/settings/usage, which renders four bars (5-hour, 7-day, 7-day Sonnet, 7-day Opus) but no analytics view, no per-prompt history, no projection. The endpoint that backs that page (GET /api/organizations/{org_uuid}/usage) returns eight utilization floats, so a third-party dashboard that re-renders the same payload locally has more to work with than the Settings page does.
What does a Claude rate-limit dashboard for Pro/Max actually have to render?
Per account: the four utilization bars Anthropic also renders (5-hour, 7-day, 7-day Sonnet, 7-day Opus), each paired with its own resets_at countdown. Plus the extra_usage block (utilization, used credits in dollars, monthly limit if set, and a BLOCKED flag when out_of_credits is true). Plus the subscription block (status, next_charge_date, payment method last4 if you want to surface a billing-failure case). The dashboard then needs a top-line summary chip you can read at a glance from a menu bar or browser toolbar without expanding anything; that chip has to compress two numbers (5-hour percent, 7-day percent) into a six-character format and color-code them when they cross thresholds.
What color thresholds should the dashboard use?
ClaudeMeter's bg_for() function at src/bin/menubar.rs lines 942-950 picks three states: utilization >= 100.0 paints RGB (215, 58, 73), a saturated red. Utilization >= 90.0 paints RGB (219, 118, 32), an orange. Below 90 paints no background (the chip stays plain text). The popup uses a related rule with a different threshold: extension/popup.css declares .bar.warn { background: #b26a00 } at >= 80 percent and .bar.hot { background: #b00020 } at >= 100 percent. The 80 percent threshold catches you a tier earlier on the bar view because the bar is a compositional unit, not a glance unit; the menu-bar chip waits until 90 because a chip in the corner of your screen flashing orange at 80 percent is noise.
Why does the Pro/Max rate-limit dashboard need a localhost bridge?
Because the data lives in two places. The browser extension can call /api/organizations/{org_uuid}/usage with credentials: 'include' (the user's already-logged-in claude.ai cookies are attached automatically), but a native menu-bar app cannot. A native app sees the macOS keychain and the system network stack but has no way to ride the browser's session. ClaudeMeter solves that by running a tiny tiny_http server on 127.0.0.1:63762 (BRIDGE_PORT in src/bin/menubar.rs line 349) that accepts POST /snapshots from the extension. The extension polls the API, posts the parsed snapshot to the bridge, and the menu bar redraws. No cookie ever leaves your machine; the bridge only listens on the loopback interface.
How does the dashboard handle multiple Claude accounts?
Each snapshot keys on (browser, account email). The merge logic at src/bin/menubar.rs lines 840-895 walks each new snapshot, finds the matching persisted entry by that key, and prefers the fresher one (or the live one over a stale one). The menu bar then renders one Submenu per surviving snapshot, with the email or org_uuid as the submenu label. The top-line title chip switches format: a single-account user sees '5h 92% · 7d 45%', a multi-account user sees 'M: 5h 92% · 7d 45% P: 5h 30% · 7d 12%', where 'M' and 'P' are the first letter of each account email (account_tag at lines 952-958).
Where does the data on the dashboard come from?
Three endpoints on claude.ai, fetched per account: GET /api/organizations/{org_uuid}/usage returns the eight utilization floats and their resets_at timestamps. GET /api/organizations/{org_uuid}/usage/overage returns the extra_usage block (out_of_credits, used_credits, monthly_credit_limit, disabled_until). GET /api/organizations/{org_uuid}/subscription returns subscription status and next charge date. ClaudeMeter parses the three responses into a single UsageSnapshot struct (src/models.rs lines 60-73) and the dashboard renders all three side by side. A 429 can fire because of any of the three: a saturated 5-hour float, a tripped weekly opus float, or extra_usage.utilization at 1.0 with overage enabled.
Why does claude.ai/settings/usage show four bars when the payload has eight floats?
Because the Settings page is a plan-summary view, not a debugging view. It picks the four floats most users care about (five_hour, seven_day, seven_day_sonnet, seven_day_opus) and skips three weekly buckets that are rarely the gating limit (seven_day_oauth_apps, seven_day_omelette, seven_day_cowork) plus the extra_usage utilization float. The full eight-float payload is still in the response body if you open DevTools on that page; the page just does not render the back four. A self-hosted dashboard can render whatever subset its surface can hold.
Can I read the Claude rate-limit dashboard data from the command line?
Yes. /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter --json prints the parsed UsageSnapshot to stdout in JSON. /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter (no flag) prints a human-formatted block via the format_window() function at src/format.rs lines 75-98, which renders each window as 'X.X% used -> resets <local clock> (in Nh)'. The same data is reachable over the bridge: curl http://127.0.0.1:63762/snapshots returns the live snapshot the menu bar is currently drawing.
How often does the dashboard refresh?
The browser extension's chrome.alarms tick is set to POLL_MINUTES = 1 (extension/background.js). One full poll per minute, every minute, while the browser is awake. The native menu bar refreshes whenever the bridge accepts a new snapshot, plus an internal poll loop at the same one-minute cadence as a fallback. There is no exponential backoff, no on-focus poll, no jitter; the cadence is fixed because the rolling window is a sliding boundary and you want the countdown to re-derive at a predictable interval.
What does the 'BLOCKED' state on the extra-usage line mean?
It means out_of_credits in the OverageResponse came back true. ClaudeMeter renders that as the literal string ' BLOCKED' appended to the dollar line (src/format.rs lines 26 and 30, src/bin/menubar.rs line 710). It is the case where the user has enabled metered billing, has consumed the entire monthly_credit_limit, and Anthropic is now refusing overage-billed calls until disabled_until passes (or the user raises the limit). The 5-hour and 7-day bars can still look green in this state; the dashboard surfaces it specifically because a green bar plus a BLOCKED line is the harshest debugging case in the whole UI.
More on the data behind the dashboard.
Related guides
Claude Code 4.7 rate limit: eight floats, four hidden
The /usage payload returns eight utilization floats. The Settings page renders only four of them. Field names, file paths, why a 4.7 session 429s while bars look green.
Local counter vs server quota: why ccusage and claude.ai disagree
Why ccusage at 5 percent and claude.ai at rate-limited are both correct. They are reading two different sources.
A 5-hour window tracker is mostly a countdown problem
The percent on its own is half information. Walking the resets_at humanization math, line by line.