The Claude weekly quota server-truth meter, and why its number cannot disagree with claude.ai

You are looking for a tool that puts the weekly quota number from claude.ai/settings/usage on your menu bar without you clicking into the settings page every twenty minutes. That tool is ClaudeMeter. It is free, open source (MIT), no telemetry, and the reason its number cannot disagree with the settings page is that it makes the exact same HTTPS call.

M
Matthew Diakonov
5 min read

Direct answer (verified 2026-05-10)

The meter is ClaudeMeter. It polls GET claude.ai /api/organizations/[uuid]/usage every 60 seconds with your existing claude.ai session cookie, parses seven_day.utilization (a 0 to 100 percent), and renders it on your macOS menu bar. Same call your /settings/usage page makes on reload, same field, same number. Source: src/api.rs (142 lines).

Why the phrase "server truth" matters

You may have seen ccusage or Claude-Code-Usage-Monitor say you are at five percent of your week while Claude itself rate-limits you mid-refactor. They are not lying; they are measuring what is on your disk (input/output tokens summed from ~/.claude/projects/*.jsonl). Anthropic does not enforce a quota in tokens. It enforces a dimensionless utilization fraction computed against a denominator the server never returns: per-plan, per-model, weighted by peak-hour load. The denominator is not on your machine.

The only number that matches what Anthropic will rate-limit you on is the one Anthropic itself ships back. That number is the utilization field on each window of the /usage response. If you have a tool that does not name an endpoint, it cannot be reading server truth. ClaudeMeter names the endpoint, in 142 lines of Rust you can read on a phone.

60s poll, 142 LOC, 0 telemetry

Claude Code killed my refactor mid-way at 62% weekly used. Installed ClaudeMeter, now I watch the bar tick instead of guessing.

What the meter actually reads

Open the Network tab on claude.ai/settings/usage right now and you will see the response below. ClaudeMeter calls the same URL, with the same cookie, with the same Referer header, and parses the same payload. Two fields per window: a percent and a UTC reset moment. That is the whole truth surface.

claude.ai · /api/organizations/{uuid}/usage

How the truth gets from Anthropic to your menu bar

Four steps, each verifiable in the open-source repo. The whole chain is shorter than most people's ESLint config.

1

You log into claude.ai once.

Your browser stores a session cookie under the claude.ai domain. The cookie is what the settings page uses to ask Anthropic 'what does this account look like right now'. You did this the day you signed up for Pro or Max.

2

The extension borrows that cookie, in-page.

extension/background.js line 7 calls fetch with credentials: 'include', so the request rides on the same cookie your /settings/usage page uses. No password prompt, no token paste, no separate auth server. Read background.js if you want; the entire client is 121 lines.

3

Anthropic returns the same JSON it would render.

GET /api/organizations/{org_uuid}/usage replies with five_hour, seven_day, and the per-model weekly windows. Each window is just utilization (a 0.0-1.0 fraction or 0-100 percent, the server is inconsistent and the extension handles both at line 62) and resets_at (the rolling window's tail aging out).

4

The menu bar renders the worst window as the badge.

src/bin/menubar.rs computes a fingerprint over five_hour, seven_day, and the per-model weeklies (lines 448-459) and the extension picks the worst seven_day percent for the badge title (background.js lines 65-73). When the bar reads 91%, the settings page reads 91% on the same window. They cannot drift, they came from the same call.

Install in one line

Two routes. The extension route avoids any keychain prompt because the in-page fetch already has your session.

ClaudeMeter install

Full instructions, including the menu-bar-only Route B (Chrome Safe Storage prompt), live at claude-meter.com/install.

Server-truth meter vs. local token estimator

The two tools answer different questions. ccusage tells you what you spent in tokens, ClaudeMeter tells you where that puts you against Anthropic's enforced ceiling. Use both if you want, but only one of them can predict the wall.

FeatureLocal token estimatorClaudeMeter
Source of the numberSums tokens from ~/.claude/projects/*.jsonl on disk. Local-only, no server call.GET /api/organizations/{uuid}/usage on claude.ai. Same call /settings/usage makes on reload.
Can it equal the server's enforcement?No. The denominator (Anthropic's per-plan, per-model, peak-hour-weighted ceiling) is not on disk.Yes by definition. The number is the server's own utilization field.
Names the weekly bucket that walled youNo. Token totals are flat; there is no concept of seven_day_oauth_apps in JSONL.Yes. Renders seven_day, seven_day_sonnet, seven_day_opus, seven_day_oauth_apps separately in the dropdown.
Knows when the wall liftsNo. Logs do not carry the rolling window tail.Yes. Each window has a resets_at UTC timestamp from the server.
Cost / licenseFree, MIT (ccusage). Some paid dashboards exist for the org-level Console.Free, MIT, no telemetry. github.com/m13v/claude-meter.
What you give itRead access to ~/.claude/projects.Your existing claude.ai cookie, via the extension. No password, no API key.

The reader-can-verify checklist

You do not have to take my word that the meter reads server truth. Run this in five minutes and convince yourself.

30-second sanity check

  • Brew install ClaudeMeter, load the extension, look at the menu bar number.
  • Open https://claude.ai/settings/usage in any tab.
  • Compare the weekly bar to the menu-bar number. They will match (modulo the 60-second poll window).
  • Open DevTools, intercept the /api/organizations/.../usage call, read the seven_day.utilization field. It will match too.
  • If any of the three disagree by more than the poll window, file an issue at github.com/m13v/claude-meter/issues.

The six weekly buckets, what each one counts

When you say "weekly quota", you probably mean one number. Anthropic has six, all named in the open Rust schema at src/models.rs lines 18-28. The one that walls you on a given Wednesday is whichever happens to cross 1.0 first. ClaudeMeter exposes all of them in the dropdown so you do not have to guess.

FieldWhat it countsWalls what
five_hourRolling 5-hour window across the whole account.Both web and Claude Code in the same 5-hour slice.
seven_dayAll-up rolling 168-hour aggregate.The headline weekly quota everybody talks about.
seven_day_sonnetRolling weekly bucket scoped to Sonnet traffic.Sonnet calls only; Opus keeps working when this fires.
seven_day_opusRolling weekly bucket scoped to Opus traffic.Opus calls only; drop to Sonnet for the rest of the week.
seven_day_oauth_appsOAuth-authenticated clients (Claude Code, MCP host loops).Terminal stops; web chat keeps working.
seven_day_omelette / seven_day_coworkInternal experimental buckets, frequently null.Usually nothing for individual accounts.

Frequently asked questions

What is the 'weekly quota server-truth meter' actually pointing at?

Anthropic's per-organization usage endpoint, served from claude.ai under the path /api/organizations/[org_uuid]/usage. That is the JSON the /settings/usage page renders into the bars and percentages you can already see in your browser. ClaudeMeter calls the same URL with your existing claude.ai session cookie and parses the response into the Window struct in src/models.rs lines 4-7 of github.com/m13v/claude-meter. Two fields: utilization: f64 and resets_at: Option<DateTime<Utc>>. Nothing else; there is no other source of weekly truth on the wire.

Why can ccusage and Claude-Code-Usage-Monitor not show the same number?

They sum input/output tokens from ~/.claude/projects/*.jsonl. The numerator is real. The denominator is not on disk. Anthropic's plan caps are expressed as utilization (a dimensionless fraction the server computes against a private weighting) and the local logs do not include the weighting, the per-model multipliers, or the rolling-window arithmetic. So a local counter at 5% can perfectly coexist with a server response of seven_day.utilization = 0.91. Both are honest about different things; only one of them will rate-limit you. ClaudeMeter sits next to ccusage, not against it.

Why does ClaudeMeter send Referer: https://claude.ai/settings/usage on every poll?

Because that is what your browser sends when you reload the settings page. Look at src/api.rs line 126 of the open-source repo. The Rust client sets exactly three headers on each GET: Cookie (your session), Referer (the settings URL), and Accept: */*. Cloudflare's bot heuristics see a request that is byte-identical to a tab reload, so the response is byte-identical too. The meter is impersonating your own browser, not consuming a 'tracker API' that does not exist.

How fresh is the number on my menu bar?

60 seconds when you have ClaudeMeter running with the browser extension. The extension's chrome.alarms job is set to POLL_MINUTES = 1 in extension/background.js line 3, fetches /usage, and POSTs the snapshot to the menu-bar app at http://127.0.0.1:63762/snapshots. If you cross 80 percent on any window, the menu-bar app's HIGH_UTIL_FAST_POLL kicks in (src/bin/menubar.rs line 34) and POLL_MIN drops the cadence to 90 seconds (line 29) so the bar reflects burn while you are at the wall.

What if I do not want to install a browser extension?

Brew install --cask m13v/tap/claude-meter and accept the macOS keychain prompt for 'Chrome Safe Storage'. The menu-bar app reads Chromium's encrypted cookie file directly and runs the same call itself. This is documented in the README under Route B. The trade-off is the prompt is broad (Chrome's master key covers cookies, saved passwords, and credit cards) and only Chromium-family browsers are supported on this path. The extension route avoids the prompt entirely.

Is there a moment when the meter and claude.ai actually disagree?

Only at the seam. If the server returns an updated utilization at second 31 of the minute, the next poll happens at second 60, so for 29 seconds the menu bar is stale. The popover dropdown shows fetched_at at the bottom so you can see exactly how old the number is. The two NEVER disagree on the calculation itself, only on freshness; both numbers came from the same payload, computed once on Anthropic's side.

Can I just curl this myself and skip the menu bar?

Yes. The shape is below. You need a session cookie from claude.ai (open DevTools, copy the Cookie header from any /api/organizations/.../usage call in the Network tab) and the org UUID (it is in the URL of any settings page). A one-line curl plus jq prints the exact same utilization the bar would render. ClaudeMeter exists because doing that on a 60-second loop, across multiple orgs, while watching for the worst bucket, while not paying telemetry to a third party, is the actual work.

What does the meter cost? What does it phone home with?

Free, MIT licensed, github.com/m13v/claude-meter. Network egress: one HTTPS request per minute to claude.ai per org membership and (when present) one to the same host's /api/organizations/{org}/overage_spend_limit and /subscription_details endpoints. No analytics ping, no auth server, no cloud account. The bridge between the extension and the menu bar is bound to 127.0.0.1:63762; nothing on your network can reach it. Audit src/api.rs (142 lines) and extension/background.js (121 lines) before you trust me.

Want a 20-minute walk-through?

Show me your usage page, I will show you which bucket is closest to walling you and how to read it from a script.