Claude Max usage tracking is seven counters, not one

The Claude Max plan is metered by seven independent utilization windows plus a separate extra-usage block, all returned in the same JSON payload at claude.ai/api/organizations/{org}/usage. Most browser extensions and CLI tools collapse this into a 5-hour bar and a weekly bar. Two of seven. The other five are where the surprise rate-limit hits come from. Below is the full shape, which bucket bites first under which workload, and how ClaudeMeter exposes all of them on a 60-second poll without a manual cookie paste.

M
Matthew Diakonov
9 min read
Direct answer (verified 2026-04-29)

How do I track Claude Max plan usage?

Read claude.ai/api/organizations/{org}/usage with your live session cookies. The JSON returns seven utilization windows (five_hour, seven_day, seven_day_sonnet, seven_day_opus, seven_day_oauth_apps, seven_day_omelette, seven_day_cowork) plus an extra_usage block for the April 2026 metered-billing line item. The rate limiter fires on the first one to hit 100 percent, so all seven need to be in view. ClaudeMeter polls all three internal endpoints (/usage, /overage_spend_limit, /subscription_details) on a 60-second cadence using your existing claude.ai cookies. Source verified live against claude.ai/settings/usage on 2026-04-29.

The full payload, exactly as the endpoint returns it

Below is a real snapshot from a Claude Max account on 2026-04-29. Eight top-level keys. The first seven are Window objects with utilization and resets_at. The eighth is the extra-usage block, with its own dollar-denominated shape. Notice how five_hour is at 0.91 while seven_day is at 0.42 and seven_day_opus is at 0.71. Three independent stories on the same account at the same instant.

GET /api/organizations/{org}/usage

The seven windows, one by one

The reason most trackers only surface two of these is that claude.ai/settings/usage itself only renders two big bars. The full list is in the JSON, unrendered. Here is what each one is and when it actually matters.

1

five_hour

The rolling 5-hour session window. Resets continuously: oldest message rolls out 5 hours after it was sent. Hits 100 first for almost all heavy Claude Code users on Max. The bucket that throws the surprise message limit reached mid-refactor.

2

seven_day

The overall weekly bucket. Aggregates everything you do across all models. Slow-moving for most Max users; fast-moving for heavy writers. Resets weekly on a fixed UTC offset tied to your account's billing day.

3

seven_day_sonnet

Sonnet-specific weekly bucket. Independent of seven_day_opus. Tracks how much of your weekly Sonnet allowance you have used. Most Max users sit here at moderate utilization; this is rarely the bucket that bites first.

4

seven_day_opus

Opus-specific weekly bucket. The bucket that bites Max users with heavy Opus workloads. Can reach 100 mid-week even when seven_day is at 30 percent and seven_day_sonnet is at 20 percent. Watch this if you run Opus a lot.

5

seven_day_oauth_apps

Weekly usage attributed to OAuth-connected third-party apps (Claude integrations, GitHub Copilot-style integrations, anything that holds a Claude OAuth token on your behalf). On most accounts this stays near zero; on accounts with many integrations connected it can climb in the background.

6

seven_day_omelette

Internal-name bucket. Populated on some accounts, zero on others. The literal field name is seven_day_omelette in the JSON response. ClaudeMeter exposes it as-is rather than rename or hide it, because hiding a bucket means hiding the reason a future limit fires.

7

seven_day_cowork

Weekly bucket attributed to collaboration features (shared projects, team artifacts). Distinct from the per-model weekly buckets. Mostly relevant for Max users on team plans.

The Rust struct that catches a schema change loud

ClaudeMeter does not parse this JSON with serde_json::Value and then look for keys. It deserializes into an explicit struct so a schema change surfaces as a parse error instead of a silent zero. If Anthropic renames seven_day_opus to something else next month, the deserializer fails loudly in your terminal and you know to update the struct. A field that is dropped from the response just becomes None (every field is Option<Window>), so a missing bucket renders as no bar instead of a wrong bar.

claude-meter/src/models.rs

Three endpoints, one poll cycle

The seven utilization windows are only part of the picture. ClaudeMeter pulls two more endpoints on the same minute-poll so the extra-usage dollar values, the next-charge date, and the monthly cap are all in one snapshot. All three are unauthenticated except for your live claude.ai cookies, which the menu bar app reads from the browser keychain or the extension forwards via the localhost bridge.

claude-meter/src/api.rs

Which bucket bites first under which workload

The reason watching only the 5-hour and weekly bars produces surprise rate limits is that different work patterns push different buckets to 100 first. The five rows below are real patterns ClaudeMeter has seen on Max accounts. The pattern in the left column is the workload; the middle column is what an extension that only shows five_hour and seven_day can see; the right column is what is actually moving on the account at the same moment.

FeatureWhat the standard 2-bucket view showsWhat you actually see
Heavy Claude Code agentic loop in one afternoonfive_hour goes red first, often within 90 minutes of startingseven_day_opus is the second to red if the model is Opus
Slow steady weekly Pro-style writingseven_day creeps up linearly through the weekfive_hour stays low, seven_day_sonnet tracks seven_day closely
Heavy Opus refactor Monday morningseven_day_opus jumps to 60-70 percent by lunchfive_hour spikes during the work, seven_day stays under 30 percent
Several OAuth integrations holding tokensseven_day_oauth_apps climbs even when you are not in claude.aiOther six buckets unchanged; this one needs explicit attention
Pay-as-you-go enabled, plan quota exhaustedextra_usage.utilization climbs in dollar termsfive_hour and seven_day stay pinned at 1.0; the new movement is in extra_usage

Pull the full key list yourself, in 30 seconds

You do not need ClaudeMeter to confirm the seven-key shape. Open DevTools on claude.ai/settings/usage, find the request to /api/organizations/{org}/usage in the Network tab, copy as cURL, and pipe through jq 'keys'. You get back the same eight top-level keys, every time.

DevTools, then curl, then jq

The one normalize step every tracker needs

The endpoint is inconsistent about whether utilization comes back on the 0-1 scale or the 0-100 scale. Different buckets in the same response can use different scales. If you build your own dashboard and skip the clamp, your chart will visibly snap to the wrong axis every time the format flips. ClaudeMeter applies the same one-line clamp in both the Rust core and the extension JavaScript so the menu bar bar and the toolbar badge always read the same percentage.

claude-meter/extension/background.js

The bridge that removes the manual cookie paste

Most browser extensions that read claude.ai usage either ask you to paste the full Cookie header from DevTools, embed a WebKit sign-in window, or take an Anthropic API key (which only sees console spend, not plan quota). ClaudeMeter does none of these. The extension runs in the same origin as claude.ai, so its fetch calls carry your live cookies automatically; it then POSTs the fetched snapshots to http://127.0.0.1:63762/snapshots, a localhost bridge the macOS menu bar app listens on. Your live session never leaves your machine. There is nothing to paste.

claude-meter/extension/background.js

What ClaudeMeter does that the others do not

The competitor column below is the modal browser extension or CLI tool in this category: a 5-hour bar, a 7-day bar, and a paste-your-cookie setup, or a token-counting CLI that reads local JSONL files and cannot see server quota at all.

FeatureTypical Claude usage trackerClaudeMeter
Reads /api/organizations/{org}/usage (server quota)NoYes, every 60 seconds
Surfaces all seven utilization windowsNo (most show 5-hour + weekly only)Yes, populated buckets shown as-is
Surfaces seven_day_opus separate from seven_day_sonnetNo (collapsed into one weekly bar)Yes
Surfaces extra_usage block (April 2026 metered billing)NoYes, with monthly_limit and used_credits in dollars
Reads /overage_spend_limit and /subscription_detailsNoYes (next charge date, payment method, monthly cap)
SetupManual cookie paste, embedded WebKit sign-in, or API keyInstall, log into claude.ai once, done
Data source for token-counting tools~/.claude/projects/*.jsonl local logs (cannot see server quota)Server endpoint that powers claude.ai/settings/usage

What this gets you

  • Reads the same /api/organizations/{org}/usage endpoint claude.ai/settings/usage uses.
  • Deserializes all seven utilization windows into typed Rust fields, no buckets dropped.
  • Pulls /overage_spend_limit and /subscription_details on the same poll for full plan picture.
  • Browser extension forwards your live session via localhost bridge on port 63762, no paste.
  • Free, MIT licensed, single HTTPS request per minute, zero telemetry.

Want a walk-through of all seven buckets on your account?

Fifteen minutes; we open claude.ai/settings/usage with you, pull the JSON, and identify which bucket is most likely to bite first given how you use Claude.

Frequently asked questions

How do I track Claude Max plan usage end to end?

Open claude.ai/settings/usage in a logged-in browser. The page reads three internal endpoints behind the scenes: /api/organizations/{org}/usage (returns seven utilization windows plus the extra_usage block), /api/organizations/{org}/overage_spend_limit (your monthly extra-usage cap and credits used), and /api/organizations/{org}/subscription_details (next charge date and payment method). To watch all three live, install ClaudeMeter; the macOS menu bar app and the browser extension both pull the same three endpoints with your existing claude.ai session cookies once a minute. No paste, no API key, no embedded sign-in.

What are the seven utilization windows?

From the JSON the endpoint returns: five_hour (the rolling 5-hour session window), seven_day (the overall weekly bucket), seven_day_sonnet (Sonnet-specific weekly bucket), seven_day_opus (Opus-specific weekly bucket), seven_day_oauth_apps (usage attributed to OAuth-connected third-party apps), seven_day_omelette (an internal-name bucket that some accounts have populated), and seven_day_cowork (collaboration features). They are independent. You can be at 12 percent on seven_day_opus and 91 percent on five_hour at the same moment. The rate limiter fires on whichever bucket hits 100 first, which is why watching only the first two collapses the picture.

Why is tracking the seven_day_opus bucket separately important on Max?

Because Opus eats the Opus-specific weekly bucket faster than the same workload eats the Sonnet bucket, but most trackers only show one combined weekly bar. If you do a heavy Opus refactor on Monday morning, your seven_day_opus.utilization can be at 70 percent while seven_day.utilization is at 28 percent. The combined-weekly bar tells you you are fine. The Opus-specific bar tells you Opus is going to throttle this Wednesday. They are different questions.

What is the extra_usage block?

It is the new April 2026 metered-billing block on the same /usage payload. The shape is { is_enabled, monthly_limit, used_credits, utilization, currency }. is_enabled tells you whether your account opted into pay-as-you-go; monthly_limit is the dollar cap you set; used_credits is how much you have spilled this month after running out of plan quota; utilization is used_credits / monthly_limit. ClaudeMeter parses this into an ExtraUsage Rust struct (src/models.rs lines 9 to 16) and surfaces it next to the seven utilization windows so you can see plan-quota exhaustion and dollars-spent in the same view.

Does ccusage or Claude-Code-Usage-Monitor show any of this?

No. Both read ~/.claude/projects/*.jsonl files written by the Claude Code CLI and count tokens locally. Local token counts have no relationship to the server-side utilization fields. ccusage is great for understanding which session burned which model and at what cost; it cannot tell you what percent of your Max plan's seven_day_opus bucket is gone, because that information only exists on Anthropic's side. ClaudeMeter and ccusage measure different things and complement each other.

Why do some utilization values come back as 0.64 and others as 64.0?

Inconsistent. The same payload from the same endpoint returns some windows on the 0-1 scale and others on the 0-100 scale. ClaudeMeter normalizes with the clamp u <= 1 ? u * 100 : u (extension/background.js, pctFromWindow function, lines 58 to 63). If you build your own dashboard against this endpoint without that clamp, you will plot two scales on the same axis and the chart will look broken every time the format flips.

How often does ClaudeMeter poll?

Once per 60 seconds. The browser extension uses chrome.alarms.create('refresh', { periodInMinutes: 1 }) (extension/background.js line 105). The macOS menu bar app refreshes on the same cadence by default and lets you change it from 30 seconds to 5 minutes in the popover. 60 seconds is the cadence that catches a slope change in five_hour without hammering Anthropic's endpoint.

Does Claude's official Usage page show all seven buckets?

No. claude.ai/settings/usage renders a 5-hour bar, a weekly bar, and the per-model breakdowns when expanded. seven_day_oauth_apps, seven_day_omelette, and seven_day_cowork are in the JSON response but are not surfaced as separate bars on the page. You see them by opening DevTools, copying the response of /api/organizations/{org}/usage, and reading the field list. ClaudeMeter shows whichever ones come back populated for your account so a non-zero bucket cannot hide.

Is the /api/organizations/{org}/usage endpoint official?

No. It is internal and undocumented. It powers claude.ai/settings/usage, which means Anthropic depends on it being correct, but they can rename fields or remove buckets in any release. ClaudeMeter deserializes into an explicit Rust struct (src/models.rs UsageResponse), so a schema change surfaces as a parse error rather than a silent zero. The seven field names listed above were stable through 2026-04-29.

Will ClaudeMeter work without a paid plan?

There is nothing for it to meter on a free account. The endpoint returns a payload with the windows present but utilization fields populated only when the plan has quota to consume. If you are on Pro you see five_hour and seven_day plus the per-model windows. If you are on Max you see all seven plus extra_usage when the metered-billing block is enabled. Free accounts do not have plan quota, so the bars stay at zero or null.