The Claude usage limit message is five messages wearing the same name.

When Anthropic tells you you have hit your usage limit, the wording comes from a small set of templates. Each template reads a different field on a different endpoint. The reset clock in the message is for the window the message names, which is not always the wall in front of you. Below: each variant verbatim, the JSON field that produced it, and what the message does not tell you.

M
Matthew Diakonov
9 min read

Direct answer (verified 2026-05-01)

The “Claude usage limit reached” banner is one of at least five distinct messages: a soft warning before the wall, a hard 5-hour wall, a 5-hour wall with extra usage continuing, an Opus weekly wall, and the collapsed Claude Code CLI banner that does not name the window. Each one is produced by a different field on the /api/organizations/{org_uuid}/usage endpoint plus the overage endpoint. The reset time in the banner is for the window it names, not for any other wall that may also be up. Anthropic's troubleshoot article (support.claude.com) lists the web variants. The CLI variant is documented in anthropics/claude-code#9236.

Why the banner is so vague on purpose

The banner is a user-facing surface. Naming a JSON field would scare most readers and would not help the ones who do not run a tracker. So Anthropic compresses the rate-limit decision into one of five short templates. The compression is fine when only one wall is up; it gets confusing when two are. A user can read “5-hour limit reached - resets 6:42pm,” wait an hour and a half, and still be blocked because seven_day_opus.utilization was also at 1.0 and the gateway only quoted one of them.

The fix is not to read the banner harder; it is to read the same fields the banner reads. Three endpoints on claude.ai, available to any logged-in browser, return the structured truth. ClaudeMeter polls them every 60 seconds and renders the eight floats plus the overage block in a menu-bar tile. Same data the banner read; more of it on screen.

The five messages, decoded

Each card below is one verbatim banner. Click or expand to see which field on which endpoint produced it, and what the banner does not tell you.

1

Approaching 5-hour limit.

Soft warning. Triggered while five_hour.utilization is high but still under 1.0. The five-hour window is the rolling session quota; the warning fires before the wall.

five_hour.utilization on GET /api/organizations/{org}/usage

Source: Anthropic troubleshoot article, listed verbatim under usage limit warnings.

What to do: nothing yet. The popup's bar paints orange at 80 percent (extension/popup.js line 31), Anthropic surfaces the warning on its own threshold a bit later. You still have headroom in the window.

2

5-hour limit reached - resets [time].

Hard wall. Triggered when five_hour.utilization >= 1.0 and overage is unavailable for any reason. Prompts 429 outright until resets_at.

five_hour.utilization on /usage plus the overage block on /overage_spend_limit showing not-enabled, out-of-credits, or disabled_until in the future.

Reset time in the message comes from five_hour.resets_at. If the real wall is overage-driven, the CLI banner does not say so.

What to do: wait, switch to Sonnet if seven_day_sonnet has headroom, or enable extra usage if billing allows.

3

5-hour limit resets [time] - continuing with extra usage.

Same float, softer outcome. five_hour.utilization is still >= 1.0, but extra_usage is on, has credit, and is not in a disabled_until hold. Subsequent prompts meter against the monthly cap.

Branch: extra_usage.is_enabled == true, out_of_credits == false, disabled_until null or in the past.

The five-hour wall is still on; you are paying through it. The CLI's overage line (format.rs lines 24 to 39) renders this as $X.XX / $Y.YY with a percent so you watch the meter run.

What to do: keep going if the spend is intentional. Set or lower the monthly cap if it is not.

4

Opus weekly limit reached . resets [date], [time].

Different window entirely. Triggered when seven_day_opus.utilization >= 1.0. The 5-hour window may still have headroom; switching to Sonnet usually unblocks because seven_day_sonnet is its own field.

seven_day_opus.utilization on /usage. The reset comes from seven_day_opus.resets_at, not five_hour.resets_at.

The weekly windows reset 7 days from your first message in that weekly window, not on a fixed calendar boundary, which is why two users on the same plan can see different reset times.

What to do: switch to Sonnet for the rest of the week, or wait.

5

Claude usage limit reached. Your limit will reset at 3pm (America/Santiago).

Claude Code CLI variant. Verbatim from GitHub issue anthropics/claude-code#9236. The CLI does not name the window. The reset time is in the user's IANA timezone but does not include the date, so a user can read 3pm and assume today.

Source: anthropics/claude-code GitHub issue 9236, where a user reported still seeing the banner 23 hours after the quoted reset time. The 5-hour window had reset; the wall blocking them was a different field.

The CLI banner string is the most ambiguous of the five because the CLI does not surface which JSON field tripped or which endpoint returned the 429. A tracker that renders the underlying floats in your menu bar tells you what the banner does not.

What to do: open claude.ai/settings/usage in a browser, or run the ClaudeMeter CLI, to see which window is actually at the wall.

The fields, in one block of code

Each banner above maps onto one of these fields. The UsageResponse struct in src/models.rs holds the eight utilization floats. The overage block lives next to it. ClaudeMeter parses the three responses into one snapshot the menu bar redraws.

claude-meter/src/models.rs

What the banner says vs. what the fields say

A real session: the banner names the 5-hour reset and stops there. The CLI prints every wall in the same view. The named reset will free the 5-hour float. The other two walls keep blocking.

claude-meter

Banner vs. ClaudeMeter, side by side

Two views of the same 429. The banner compresses, the tracker decompresses.

FeatureThe banner aloneClaudeMeter
What you read'Claude usage limit reached. Your limit will reset at 3pm.'five_hour 100% (in 1h), seven_day_opus 100% (in 2d 14h), overage BLOCKED until May 3
SourceSingle banner template, no JSON field nameEight utilization floats + overage block, by field
Reset clock the user seesOne time, named windowPer-window resets_at + overage disabled_until, side by side
When the named reset arrivesBanner disappears, but a second wall may still be upEach wall ticks down independently; you see which one will free you
Endpoint coverageWhichever field the gateway picked for the 429/usage + /overage_spend_limit + /subscription_details, all three
Refresh cadenceOn the next prompt that 429s60 seconds, fixed (configurable 30s to 5m)

How to decode the message in five steps

When the banner appears, do this. The first three steps work without any tool. The last two are easier with a tracker.

1

Read the banner verbatim, ignore the conclusion

The wording is a template, not a diagnosis. Pull out the named window (5-hour, weekly, Opus) and the reset time, but treat them as a starting point, not the answer.

2

Open claude.ai/settings/usage or run ClaudeMeter

Both surfaces hit GET /api/organizations/{org}/usage. Settings renders four bars; the CLI prints all four plus the overage block. Either way you now have the eight floats the banner is hiding.

3

Find every field at or above 1.0

Sort the floats. five_hour, seven_day_sonnet, seven_day_opus, and the seven_day aggregate are the four that gate Pro/Max users. If two are at 1.0, your banner only named one.

4

Check overage_spend_limit

GET /api/organizations/{org}/overage_spend_limit. If is_enabled is false, out_of_credits is true, or disabled_until is in the future, the CLI banner is hiding a fourth wall the named-window reset will not lift.

5

Pick your unblock path against the real fields

If only five_hour is at 1.0 and overage is healthy, the named reset will free you. If seven_day_opus is also at 1.0, switching to Sonnet usually works for the rest of the week. If overage is on a disabled_until, you wait for the date in that field, not the time in the banner.

The 23-hour gap

On anthropics/claude-code#9236, a user reported the Claude Code CLI banner saying Your limit will reset at 3pm (America/Santiago) at 4pm the previous day. They waited the 23 hours, and the banner was still there. The 5-hour window had reset on schedule; the wall blocking them was a different field on a different endpoint that the CLI banner does not reference.

Two takeaways. The banner is honest about the window it names. It is silent about every other window and about the overage clock. If you are seeing the same banner more than 5 hours later, you are almost certainly looking at a second wall. ClaudeMeter prints them all together so you do not have to wait the 23 hours to find out.

Where the data comes from

Three endpoints, all on claude.ai, all callable with the cookies your browser already has. ClaudeMeter's browser extension calls them with credentials: 'include' and POSTs the parsed snapshot to the menu-bar app over 127.0.0.1:63762. Nothing leaves your machine. The same JSON the Settings page renders is what the menu bar redraws every minute.

claude-meter/src/api.rs

Stuck on a banner that will not lift?

If the banner has been up longer than the named reset, two walls are probably stacked. Walk through your snapshot with us and we will help you find the second one.

Common questions about the limit message

What does 'Claude usage limit reached' actually mean?

It means the rate limiter on claude.ai returned a 429 against your org and the client substituted a friendlier banner. The banner you see comes from one of at least five distinct templates documented in Anthropic's troubleshooting article, plus the Claude Code CLI variant. Each template reads a different field. 'Approaching 5-hour limit.' reads five_hour.utilization above the warning threshold. '5-hour limit reached - resets [time].' reads five_hour.utilization >= 1.0 with overage either off or already exhausted. '5-hour limit resets [time] - continuing with extra usage.' reads the same float at 1.0 but with extra_usage.is_enabled true and out_of_credits false. 'Opus weekly limit reached' reads seven_day_opus.utilization >= 1.0. The CLI banner 'Claude usage limit reached. Your limit will reset at 3pm (America/Santiago).' is the Claude Code CLI's collapsed version that does not name which window tripped at all. The wording does not tell you which field fired. ClaudeMeter polls the underlying endpoint every 60 seconds so you can read the field directly.

Is the reset time in the message accurate?

It is accurate for the window the message names, not necessarily for the wall you actually hit. GitHub issue anthropics/claude-code#9236 documents a user who saw 'Your limit will reset at 3pm (America/Santiago)' and was still locked out 23 hours later. The 5-hour window did reset on schedule; the wall in front of them was a different field on a different endpoint (overage_spend_limit.disabled_until) that the CLI banner never references. The /api/organizations/{org_uuid}/usage payload returns its own resets_at per window, and /api/organizations/{org_uuid}/overage_spend_limit returns its own disabled_until. ClaudeMeter prints both clocks in the CLI output (src/format.rs lines 75 to 98) so the disagreement is visible.

Why does the message sometimes say 'continuing with extra usage' and sometimes just 'reached'?

Both messages fire when five_hour.utilization >= 1.0. The branch is on the overage_spend_limit endpoint. When is_enabled is true, out_of_credits is false, and disabled_until is null or already past, Anthropic switches the banner to '5-hour limit resets [time] - continuing with extra usage.' and meters subsequent prompts against your monthly extra usage cap. When any one of those three blocks, the banner stays at the harder '5-hour limit reached - resets [time].' wording and your prompts 429 outright. ClaudeMeter parses all three fields into the OverageResponse struct in src/models.rs lines 30 to 40 and renders the BLOCKED state inline so you see the branch, not just the banner.

What is the difference between the claude.ai banner and the Claude Code CLI banner?

The web banners (Approaching 5-hour limit, 5-hour limit reached, Opus weekly limit reached) name the specific window. The Claude Code CLI prints a collapsed banner: 'Claude usage limit reached. Your limit will reset at 3pm (America/Santiago).' That string does not say five-hour, weekly, Opus, or extra usage. It is a single template the CLI reuses across every 429 family. The reset time is whichever resets_at field the gateway returned, formatted in the local IANA zone of the user's machine. If the wall is overage-driven, the CLI still prints a five-hour-shaped reset because the response shape it parses does not include disabled_until. This is why the Claude Code CLI banner is the most ambiguous of the five and why a usage tracker that reads the underlying fields is more useful than the banner itself.

Why does the bar in the popup turn orange before claude.ai shows any banner?

The popup uses an earlier threshold than Anthropic does. extension/popup.js line 31 picks the bar class as v >= 100 ? 'hot' : v >= 80 ? 'warn' : '' so the bar paints orange at 80 percent utilization, while the troubleshoot article confirms Anthropic only renders 'Approaching 5-hour limit.' once the gateway has decided to surface the warning. The 80 percent threshold catches you a tier earlier on the bar view because the bar is a compositional unit (it shares the popup with other rows and benefits from a stronger color step) while the menu-bar chip waits until 90 percent (src/bin/menubar.rs bg_for thresholds) because a chip flashing orange at 80 percent is noise.

Does the message ever lie about the cause?

It does not lie, but it reports only the named window. If five_hour.utilization is at 1.0 and seven_day_opus.utilization is also at 1.0, you will see one banner: usually whichever the gateway picked for that specific request. Switching to Sonnet may unblock you (because seven_day_sonnet is its own float) even though the Opus banner suggested every model was capped. The /api/organizations/{org_uuid}/usage payload returns eight separate utilization floats (UsageResponse in src/models.rs lines 19 to 28); the banner only references one. A tracker that renders all eight tells you which models still have room.

Can I see the underlying field that produced the message?

Yes. Open DevTools on claude.ai/settings/usage, refresh, and look for the XHR to /api/organizations/{org_uuid}/usage. The response body has utilization floats per window. Or run /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter --json to get the same payload pretty-printed in your terminal. The CLI prints the per-window resets_at in your local timezone next to each percent so you can compare what the banner said with what the field actually says. ClaudeMeter never reads, parses, or sees the banner text itself; it only reads the JSON.

Is 'Claude usage limit reached' the same as the API rate-limit response?

No. The API surface returns 429 with structured headers (anthropic-ratelimit-requests-remaining, anthropic-ratelimit-tokens-remaining, retry-after) documented at platform.claude.com/docs/en/api/rate-limits. The claude.ai web banner and the Claude Code CLI banner are user-facing translations of a 429 from the per-org rate limiter on the web stack. They share the underlying mechanism (you have hit a quota) but the surfaces are different: API consumers parse the headers themselves, web and CLI users see the banner. The /api/organizations/{org_uuid}/usage endpoint is the closest a web user gets to a structured view, and it is the one ClaudeMeter calls.