The Claude Code 4.7 rate limit is eight floats on one endpoint, and the Settings page hides four of them
Every other write-up about this topic treats the quota as two numbers, five hours on the left and a week on the right. That is a redraw of claude.ai/settings/usage, not the payload. The actual response at /api/organizations/{org}/usage contains eight utilization floats, and Anthropic's rate limiter checks every one of them on every request. When a 4.7 call returns 429 while the Settings bars still look green, the cause is almost always one of the four hidden floats.
Why “five hours plus a week” is the wrong model
The common framing of this is two numbers, both drawn from the bars on claude.ai. That framing misses the shape of the payload. Anthropic returns one JSON blob, and the rate limiter reads the whole thing on every request. If any single float reaches 1.0, the request rejects with a 429 and a resets_at timestamp. The Settings page redraws four bars; the rate limiter evaluates eight floats. The mismatch between those two numbers is where confusion lives.
Claude Code inherits this model wholesale. A 4.7 session that appears healthy in Settings can 429 the moment a hidden float reaches 1.0, and no public Anthropic documentation tells you which float it is. The only way to see all eight at once is to read the raw response.
The anchor fact: every float, in the struct
This is the entire shape of the rate-limit state that Anthropic returns and ClaudeMeter parses. Seven optional windows plus an extra-usage utilization float on an inner object. No abstraction, no renaming:
Every field is Option<Window>because Anthropic omits fields that do not apply to your account. A free account sees a shorter payload than a Max 20x account. The parser does not care which fields are present; it just deserializes what is there and leaves the rest as None.
The eight floats, side by side
Four of these are rendered by the Settings page. Four are not. All eight gate your next Claude Code 4.7 request.
five_hour
Sliding 5-hour window, shared across every model. Every Claude Code 4.7 request touches this float, so it is the one that fills first in a burst. Rendered on claude.ai/settings/usage and in the ClaudeMeter menu bar.
seven_day
Weekly aggregate across all models. Every subscription plan has one. Rendered in the Settings UI. On Max 20x accounts this is usually the last bucket to pin.
seven_day_sonnet
Sonnet-only weekly counter. Opus 4.7 calls do not touch this bucket, but a Sonnet-heavy session can pin it and lock your Claude Code out of Sonnet until the UTC rollover.
seven_day_opus
Opus-only weekly counter. Opus 4.7 fills it faster than 4.6 did because the new tokenizer applies a 1.0x to 1.35x server-side expansion before the utilization is written. Rendered in Settings.
seven_day_oauth_apps
Hidden bucket. Weekly counter for requests that arrive via OAuth-authenticated third-party clients. Not drawn on Settings. Only visible through the endpoint directly or ClaudeMeter's bridge.
seven_day_omelette
Hidden bucket with an undocumented internal code name. Declared on src/models.rs line 25. Appears in the payload on some accounts, absent on others. Option<Window> in the client so its disappearance does not crash parsing.
seven_day_cowork
Hidden bucket, also undocumented. Declared on src/models.rs line 26. Observed on some team accounts. Not drawn in any UI Anthropic ships.
extra_usage.utilization
A ninth float, technically inside ExtraUsage (src/models.rs lines 10 to 16), but behaves as an eighth gate: when it reaches 1.0, overage-billed requests stop going through. The Settings page shows a spend line here, not a utilization bar.
What the server checks vs. what the UI draws
One JSON payload feeds two very different consumers. The rate limiter reads every float. The Settings page cherry-picks four.
One /usage response, two very different downstream readers
A request's path through the eight floats
The rate-limit decision happens before the model ever sees your prompt. Five steps, one of which is invisible in any UI Anthropic ships.
From one Claude Code 4.7 request to eight parallel float checks
1. Claude Code sends a request
The 4.7 client posts to Anthropic's backend with the session cookie from your claude.ai login. Every request lands in multiple quota buckets at once, not just the 5-hour one.
2. The server reads eight floats
Before the request is forwarded to the model, the rate limiter checks five_hour, the applicable weekly float (seven_day, seven_day_sonnet, or seven_day_opus), the three feature-scoped weeklies (oauth_apps, omelette, cowork), and extra_usage.utilization.
3. Any float at 1.0 rejects the request
The server picks the first pinned float and returns 429 with a resets_at timestamp that matches the Window struct at src/models.rs lines 3 to 7. The 429 body does not tell you which float tripped, only that one did.
4. Settings UI redraws four bars
claude.ai/settings/usage renders five_hour, seven_day, seven_day_sonnet, and seven_day_opus. The other four floats are in the same response but never painted. A pinned hidden float looks like an inexplicable 429 in the Settings view.
5. ClaudeMeter's bridge returns all eight
127.0.0.1:63762/snapshots serves the parsed UsageResponse verbatim. Run the pre-flight jq script and the pinned bucket is named in one line. No refresh of the Settings page, no guessing.
Why the popup only shows four
The ClaudeMeter popup keeps parity with Settings on purpose. Four rows fit the menu-bar surface without scrolling, and most sessions only need those four to explain a 429. The hidden floats exist in the snapshot; the popup just chooses not to draw them. If you need them, the localhost bridge already has them:
Reading all eight floats from a shell
One curl to the bridge, one jq expression, all eight floats side by side. The null values are fields Anthropic did not return for this account, surfaced verbatim instead of silently dropped:
A pre-flight that names the pinned float
The useful question is not “what is my utilization,” it is “which float will stop me first.” This one-liner against the bridge pulls the highest float in the snapshot, including the hidden ones, and prints its real field name:
Which bucket does a 4.7 request hit?
Sonnet and Opus 4.7 traffic contribute to different subsets of the eight floats. The table below is what ClaudeMeter sees on every tick; it is not a guess from token logs.
How one 4.7 request fans out into utilization updates
The numbers, verbatim from the client
Nothing invented. Every figure below is a line number, a port, or a field count from the ClaudeMeter source on disk.
Eight conditions for a 4.7 request to succeed
Every float the rate limiter can reject on
- five_hour.utilization < 1.0. Shared across every model; a Sonnet-heavy morning can trip this before Opus gets a chance.
- seven_day.utilization < 1.0. Aggregate weekly float, present on every plan.
- seven_day_opus.utilization < 1.0 (if the 4.7 request is Opus). 4.7 fills this faster than 4.6 because of the tokenizer expansion.
- seven_day_sonnet.utilization < 1.0 (if the 4.7 request is Sonnet). Independent from the Opus float.
- seven_day_oauth_apps is either null or under 1.0. Only present if you have authorized an OAuth app that routes through your plan.
- seven_day_omelette and seven_day_cowork are null or under 1.0. Appear on some accounts and not others; no UI surfaces them.
- extra_usage.utilization is null, disabled, or under 1.0. Once at 1.0, overage stops absorbing your 4.7 traffic and you 429 even with paid credit available.
- subscription.status is active (from /subscription_details). A past_due subscription fails every float check server-side.
Server truth vs. local-log tools
Local token counters read ~/.claude/projects/**/*.jsonl and estimate from client-side accounting. The rate limiter runs on server-side floats the JSONL never sees.
| Feature | ccusage / Claude-Code-Usage-Monitor | ClaudeMeter |
|---|---|---|
| Number of rate-limit floats surfaced | 2 (five_hour and a single weekly) | 8 (all fields in UsageResponse + extra_usage.utilization) |
| Shows the Opus-only weekly float | Approximated from local token count | Verbatim from seven_day_opus.utilization |
| Shows seven_day_oauth_apps | No | Yes, named in the snapshot JSON |
| Shows seven_day_omelette / seven_day_cowork | No (no awareness these fields exist) | Yes, surfaced with their real internal field names |
| Shows extra_usage.utilization as a rate-limit gate | No | Yes, on every 60-second tick |
| Names which float pinned a 429 | No | Yes, one jq line against the bridge |
| Access without a browser session | Local JSONL only | Local JSONL irrelevant; reads the live /usage response |
| Reads resets_at per float | No (no resets_at in local logs) | Yes, on every Window |
The part nobody else serves: all eight over HTTP, free
The menu-bar app opens a loopback server on 127.0.0.1:63762 and accepts POSTs from the browser extension on every tick. It also accepts GETs, so any shell, editor, or CI script on your machine can read the current utilization of all eight floats without touching claude.ai directly. The extension handles cookie management for you, so the only thing your script has to know is the port.
Local-log tools cannot replicate this, not because of engineering effort, but because the eight floats are not in the local log at all. They are a server-side concept. The only way to know their current values is to read the endpoint.
The honest caveat about the hidden names
seven_day_omelette and seven_day_cowork are internal code names Anthropic chose for feature-scoped quota buckets that they have not publicly documented. We know they are real because they show up in the JSON payload on some accounts, always as Window objects with a utilization and a resets_at. Anthropic can add, rename, or remove them at any time. ClaudeMeter keeps their fields optional on purpose: if a name changes, parsing continues; if a new float appears, it is a one-line addition to the struct. The repo is MIT and the interesting bits fit in under 200 lines of Rust; you can verify everything above in about ten minutes.
See all eight floats on your own account
ClaudeMeter runs in your macOS menu bar, polls the eight-float /usage payload every 60 seconds, and serves the parsed snapshot at 127.0.0.1:63762/snapshots. Free, MIT, and the browser extension removes the cookie-paste step entirely.
Frequently asked questions
How many rate-limit floats does Claude Code 4.7 actually have?
Eight. GET https://claude.ai/api/organizations/{org_uuid}/usage returns a JSON payload that ClaudeMeter deserializes into the UsageResponse struct at src/models.rs lines 19-28. The struct has seven Option<Window> fields (five_hour, seven_day, seven_day_sonnet, seven_day_opus, seven_day_oauth_apps, seven_day_omelette, seven_day_cowork) plus an ExtraUsage sub-object carrying its own utilization float. That is eight independent numbers that each sit on their own 0.0-to-1.0 scale. Any one of them at 1.0 is a 429.
Which of those eight are hidden from claude.ai/settings/usage?
Four. The Settings page renders five_hour, seven_day, seven_day_sonnet, and seven_day_opus as bars. It does not render seven_day_oauth_apps, seven_day_omelette, or seven_day_cowork, and it does not render extra_usage.utilization as a separate bar. The JSON payload contains all eight; the web UI just picks four. The menu-bar popup in ClaudeMeter also only shows the same first four (extension/popup.js lines 60 to 63), which is why we also expose the full payload over the localhost bridge for callers that need it.
What is seven_day_oauth_apps and does it affect Claude Code?
It is a weekly utilization bucket for requests that come in through OAuth-authenticated clients rather than the claude.ai web session. Claude Code in subscription mode uses your claude.ai cookies, so its traffic lands in five_hour, seven_day, and the model-specific weekly floats (seven_day_sonnet or seven_day_opus). If you authorize a separate OAuth app (for example a third-party IDE integration or an automation that uses Anthropic's OAuth flow), that traffic contributes to seven_day_oauth_apps instead, and it counts toward the same plan. The field is declared as pub seven_day_oauth_apps: Option<Window> in src/models.rs line 24.
What are seven_day_omelette and seven_day_cowork?
They are internal code names Anthropic uses for feature-scoped quota buckets that show up in the payload with no public documentation. They are declared on src/models.rs lines 25 and 26 as pub seven_day_omelette: Option<Window> and pub seven_day_cowork: Option<Window>. ClaudeMeter treats them as Option so it does not crash when they appear or disappear. We surface them verbatim on the localhost bridge rather than renaming them, because the only way to correlate a 429 to a hidden bucket is to see the real field name.
Why would a Claude Code 4.7 request 429 when the Settings bars look fine?
Because a hidden float can be at 1.0 while the four visible bars are green. The most common cause in practice is extra_usage.utilization: once your overage limit is exhausted, Anthropic rate-limits new calls even though five_hour and the weekly floats still have headroom. The second-most-common is an inactive subscription (subscription.status past_due) which collapses the utilization denominators server-side. ClaudeMeter polls usage, overage, and subscription on every tick and surfaces all three as a single snapshot, which makes the hidden-bucket case diagnosable.
Does the extra_usage block count as rate limiting?
Yes. ExtraUsage on src/models.rs lines 10 to 16 has its own utilization float, plus monthly_limit and used_credits. When extra_usage.utilization reaches 1.0, Anthropic stops letting overage-billed requests through. That is a rate-limit event for your Claude Code session, but it is a separate limit from the five-hour and weekly floats. There is no bar for this on claude.ai/settings/usage; the UI shows a spend line, not a utilization bar.
How do I read all eight floats from my own machine?
Three options. (1) Install ClaudeMeter and curl http://127.0.0.1:63762/snapshots, which returns the full UsageSnapshot struct with all eight utilization floats and the raw resets_at on each window. (2) Open DevTools on claude.ai/settings/usage, copy the Cookie header, and curl https://claude.ai/api/organizations/{org_uuid}/usage yourself. The response body is the same JSON ClaudeMeter parses. (3) Run /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter --json from a shell, which prints the parsed snapshot directly.
Does every account have all eight floats in the payload?
No. Every field in UsageResponse is wrapped in Option<Window>, which means the server frequently omits fields that do not apply to your account. Free accounts and team-only accounts see a shorter payload. The Rust client treats missing fields as None instead of erroring; the TypeScript extension does the same with optional-chaining in extension/popup.js lines 62 and 63. If a field is absent it is safe to assume that bucket is not gating your requests.
How does the 5-hour window differ from the weekly floats for Claude Code 4.7?
The 5-hour float is shared across every model and every request. It is a sliding window, not a calendar window; each request adjusts the resets_at timestamp on the Window struct (src/models.rs lines 3 to 7). The weekly floats are model-scoped or feature-scoped. seven_day aggregates everything, seven_day_sonnet counts only Sonnet, seven_day_opus counts only Opus. All weekly floats roll over on the same UTC day across your account. The server checks every applicable float on every request, so a 4.7 request that uses Opus is gated by five_hour AND seven_day AND seven_day_opus at once.
Why is the utilization sometimes a fraction and sometimes a percent in the payload?
Because Anthropic is inconsistent about it. In the same response we have seen five_hour.utilization = 0.72 sitting next to seven_day_opus.utilization = 94.0. The ClaudeMeter extension normalizes it once in extension/popup.js lines 6 to 11 with the clamp u <= 1 ? u * 100 : u. If you write your own client and skip the clamp, a bucket at 0.94 renders as 'less than one percent' and you walk into a 429 that looks unprovoked.
Is this the same rate limit as the Anthropic API's tier limits?
No. Anthropic's developer API (console.anthropic.com) enforces per-minute and per-day token limits scoped to an API key and a tier, reported through HTTP headers like anthropic-ratelimit-tokens-remaining. The eight floats on claude.ai/api/organizations/{org}/usage are the subscription plan's quota system, which gates Claude Code in its default subscription mode. If you run Claude Code against an API key instead of a subscription, the per-key tier limits apply and the /usage endpoint will not see you at all.
Keep reading
Claude Opus 4.7 rate limit: three endpoints, not one number
Zoom in on Opus specifically. Why /usage, /overage_spend_limit, and /subscription_details together are the real rate-limit state.
Claude Code Opus 4.7 usage limits
The Opus weekly float, in detail. Where seven_day_opus lives in the schema and why 4.7 fills it faster than 4.6.
The Claude rolling window cap is seven windows
A companion read on the weekly buckets. Every Window field in the payload and which Claude Code traffic trips which one.
Seeing a float in your payload that is not in the struct?
If your /usage response returns a weekly bucket we have not named here, or the extra_usage block changes shape on your plan, send the JSON over. We patch the struct same day.