Your Claude extra usage balance is two endpoints, three fields, and one BLOCKED string
When Anthropic enabled metered billing on Pro and Max in April 2026, a new line appeared on claude.ai/settings/usage: a dollar figure ticking up against a monthly cap. People started calling it “extra usage balance” on Reddit and in comments. Behind that one line are two undocumented endpoints, a handful of fields shipped in cents, and one boolean that flips when you get locked out. This page walks every part of it, and shows the exact 17-line Rust function that turns the JSON into the line you see in the menu bar.
Direct answer (verified 2026-04-30)
Your “extra usage balance” is the dollar amount Anthropic has counted against your metered billing cap during the current billing cycle. The number lives at GET /api/organizations/{org}/overage_spend_limit on claude.ai (cookie-authenticated, undocumented), as used_credits and monthly_credit_limit, both in cents. A second flag, out_of_credits, flips to true when the cap is reached. The free open-source way to watch all three live is ClaudeMeter, verified at src/format.rs.
What the line actually looks like
Run the bundled CLI and you get the same five-row block the menu bar dropdown renders. The fifth row is your extra usage balance. The dollars-used number is on the left, the cap is in the middle, the percent is in parentheses.
When the cap trips, out_of_credits flips and the line gains a literal BLOCKED suffix plus a date. This is the case nothing else surfaces in a single line:
Notice the rolling windows above: 41 percent and 67 percent. Both green by the usual color-coding. The next prompt still 429s because the metered cap is what blocks now, and the menu-bar line is the only thing telling you that.
The two endpoints behind the line
The dollar number ships from two different places on claude.ai. They overlap on the cents-used and the cap; they differ on the lockout state. ClaudeMeter calls both, in sequence, and merges them into one snapshot:
The order matters. The usage call is required because its five_hour and seven_day floats drive the toolbar badge. The overage call is optional: free workspace orgs and team orgs without metered billing 404 here, and the menu bar still renders the rows above the Extra usage line when that happens. The same pattern lives in the browser extension at extension/background.js line 26, with credentials: ‘include’.
Two structs, because two endpoints carry slightly different fields
The Rust schema declares both shapes side by side. The first lines up with the rolling-window response on /usage; the second covers the dedicated billing-state response on /overage_spend_limit. The diff is three fields: disabled_reason, disabled_until, and the out_of_credits boolean.
The fields ship in cents on the wire. That is one of the small things you have to know cold, because rendering them as dollars is a divide by 100 in the format function, and a missed division gives you $1720.00 / $5000.00 where Anthropic shows $17.20 / $50.00. Pure unit-of-measure trap.
The 17-line function that builds the line
Everything you read in the menu bar comes out of this block. Two divisions by 100 to convert cents to dollars. One match arm for the no-cap case. One conditional suffix for the lockout date. One hardcoded uppercase BLOCKED string. Then a left-padded label so the column lines up with the rolling-window rows above:
The reason " BLOCKED" is two leading spaces and uppercase: it is a visual offset for a monospaced terminal column, not a CSS state. format.rs line 26 hardcodes the literal so the flag floats off the percent, and line 39 uses {:<16} to left-pad “Extra usage” to match the 16-character labels above.
The Settings page in prose vs the JSON the tracker reads
The Anthropic Settings page renders the balance as a paragraph and a progress bar. The tracker reads the underlying JSON. Both see the same numbers; only the JSON gives you the BLOCKED flag in a form you can pipe into a status line.
Same field, two states, two renderings
# claude.ai/settings/usage prose paraphrase:
"You have used $17.20 of your $50.00 monthly extra usage cap.
Metered billing is enabled. Your billing cycle ends May 14, 2026.
If you reach your cap, additional usage will be blocked until
your next billing cycle or until you raise the cap."
# claude-meter --json output (excerpt):
{
"overage": {
"is_enabled": true,
"monthly_credit_limit": 5000, // cents
"used_credits": 1720.0, // cents
"out_of_credits": false,
"disabled_reason": null,
"disabled_until": null,
"currency": "USD"
}
}On the BLOCKED side, three fields move at once: used_credits equals monthly_credit_limit, out_of_credits flips to true, disabled_until carries the next-cycle timestamp. format.rs glues all three into one line; nothing else does.
The balance row, tracker vs Settings page
Both read the same backing fields. The diff is what they render at a glance and how often.
| Feature | claude.ai/settings/usage | ClaudeMeter (menu bar + browser) |
|---|---|---|
| The dollar figure | Same number, on a Settings page bar with the 'Extra usage' label | Extra usage $17.20 / $50.00 (34%) |
| BLOCKED state surfaced | A separate banner above the bar; not in any one-line summary | Literal ' BLOCKED' suffix on the dollar line |
| Lockout date | In the BLOCKED banner text, requires reading prose | ' until Thu May 1' appended on the same line |
| Refresh cadence | On full page reload | Once per 60 seconds in the background |
| Where you read it | claude.ai/settings/usage page | macOS menu bar dropdown, browser toolbar popup, CLI |
| Multi-account | One organization per visible page | Iterates account.memberships, prints one Extra usage line per org with metered billing on |
| Cost | Bundled with the plan | Free, MIT licensed Rust + JavaScript |
Six invariants the Extra usage line holds
What an extra usage balance line has to get right
- The dollar number is used_credits / 100 (the field ships in cents). monthly_credit_limit is the cap, also divided by 100. The percent is u / l * 100, computed locally, never read from the server. format.rs lines 25-30 do this in five lines.
- The BLOCKED suffix is exactly two leading spaces and uppercase, hardcoded in format.rs line 26. It only appends when out_of_credits = true on the overage_spend_limit response. The flag is the single source of truth for 'metered billing is locked right now'.
- If monthly_credit_limit is None the format switches to '$X.XX used (no cap)'. That happens when the user enabled metered billing without setting a cap. The percent is omitted because there is nothing to divide against.
- If disabled_until is set the format appends ' until <Day Mon D>' using a Local timezone format. The date is the Anthropic-side timestamp at which metered billing un-blocks (cap rollover or admin re-enable). format.rs lines 35-37 do the conversion.
- If overage_spend_limit returns 404 (free org, no metered billing) the entire Extra usage line is skipped. The 5-hour and 7-day rows above still render. Errors are pushed to a `errors` Vec on the snapshot, surfaced in the dropdown footer, but they do not break the rendering of the rest.
- On the browser side, extension/background.js line 26 mirrors the same dual-endpoint pattern with credentials: 'include', and the popup reads the merged snapshot from chrome.storage.local. Same data, same shape, no additional auth.
The numbers behind the line
All readable straight out of the source. None invented.
Install in four steps
Step 1: brew install the menu bar app
brew install --cask m13v/tap/claude-meter. The cask installs ClaudeMeter.app under /Applications and registers a launch agent so the menu bar icon comes back after reboot. The CLI is at /Applications/ClaudeMeter.app/Contents/MacOS/claude-meter for tmux or Starship status lines.
Step 2: load the unpacked extension
Clone github.com/m13v/claude-meter, open chrome://extensions (or arc://extensions, brave://extensions, edge://extensions), enable Developer mode, click 'Load unpacked', select the extension/ folder. The browser pins the icon next to the URL bar. The extension is what reaches claude.ai with your existing session cookies, so no manual cookie paste.
Step 3: visit claude.ai once
If you are not already logged in, visit claude.ai and sign in. The extension reads your existing session cookie via fetch with credentials: 'include' and starts polling /api/organizations/{org}/usage and /api/organizations/{org}/overage_spend_limit on a 60-second tick. Within one minute the badge lights up.
Step 4: open the menu bar dropdown
Click the ClaudeMeter icon in the macOS menu bar. The Extra usage line shows your dollar balance, percent, and any BLOCKED suffix. If you do not see it, your org has not enabled metered billing on claude.ai/settings/usage; the absence of the line means absence of the feature, not a bug.
Why this line is the one to watch
Before April 2026, hitting a Claude rate limit meant you waited for the rolling window to reset. After April 2026, with metered billing flipped on, the rolling windows hand off to the cap, and the cap silently spends real dollars. The dollar line is the first place you see the cost. Without it, your first signal that metered billing got expensive is the next invoice.
Local-token tools cannot help here. ccusage, Claude-Code-Usage-Monitor, and similar utilities read ~/.claude/projects/<project>/<session>.jsonl on disk. That ledger is real, but it is local-truth, and it does not see metered-billing state at all (no HTTP call to claude.ai, no cookies, no overage_spend_limit endpoint). The extra usage balance is server-truth; the only way to read it is the cookie-authenticated GET on claude.ai. ClaudeMeter automates that GET, the cookie wrangling, and the 60-second loop.
Run the local-token tool and the server-truth tool side by side and you have the whole picture: tokens spent locally and the dollar figure Anthropic counted those tokens as. The two numbers do not match because they measure different things; that is the feature, not a bug.
The honest caveat
The endpoint is undocumented. The field names can change in any claude.ai release. The Rust struct in src/models.rs declares each field as Optional so a missing one deserializes as None and the row goes blank instead of crashing. That is a forward-compat hedge, not a guarantee. If a field gets renamed, the open-source repo gets a same-day patch and you pull the next brew release. That is the tradeoff for reading server truth instead of a published API: the surface is closer to reality, the wire is less stable. Worth it for the BLOCKED line; the alternative is finding out from the next invoice.
Building a metered-billing tracker and want to compare endpoint shapes?
Send a 15 minute call. Happy to swap notes on the cents-vs-dollars trap, the BLOCKED state, and the moments the JSON shifts shape.
Frequently asked questions
What does 'extra usage balance' actually mean on a Claude Pro or Max plan?
It is the dollar amount Anthropic has counted against your metered (pay-as-you-go) cap during the current billing month. Once your rolling 5-hour window and 7-day weekly bucket are spent, Anthropic does not stop you outright; it bills further usage against a configurable monthly credit limit, in cents, and surfaces both the spend and the limit on claude.ai/settings/usage. The 'balance' is the difference between used_credits and monthly_credit_limit. ClaudeMeter mirrors that into a single line in your menu bar.
Where exactly does the dollar number come from?
Two endpoints on claude.ai. The first is GET /api/organizations/{org_uuid}/usage, which carries an extra_usage block with is_enabled, monthly_limit, used_credits, utilization, currency. The second is GET /api/organizations/{org_uuid}/overage_spend_limit, which carries is_enabled, monthly_credit_limit, used_credits, currency, plus three fields the first endpoint does not have: disabled_reason, disabled_until, out_of_credits. ClaudeMeter prefers the second endpoint when present because BLOCKED is only diagnosable from those three extra fields. Both numbers are in cents and divided by 100 to render dollars.
Why are there two endpoints showing roughly the same balance?
The usage endpoint includes the metered block as a sub-object so a single GET can reconstruct the whole rolling-window plus pay-as-you-go view. The overage_spend_limit endpoint is the dedicated billing-state endpoint that the Settings page uses to render the BLOCKED banner and the 'until <date>' message when an admin pauses metered billing or the cap is hit. They overlap on the dollars used and the cap; they diverge on the lockout state. ClaudeMeter calls both, in sequence, and merges them into one snapshot.
What does 'BLOCKED' mean in the menu bar line?
It means the JSON came back with out_of_credits = true. The user has metered billing enabled, has consumed the entire monthly_credit_limit, and Anthropic is now refusing overage-billed calls until disabled_until passes (or the user raises the cap on the Settings page). The 5-hour and 7-day bars can still look green when this happens, which is why the BLOCKED string is the harshest debugging case in the whole UI: green windows plus a BLOCKED extra-usage line means the next prompt 429s and the cause is not the rolling cap.
Why are the values divided by 100 in src/format.rs?
The fields ship in cents. used_credits and monthly_credit_limit on the overage_spend_limit response are integer cents (or for used_credits, a float of cents). format.rs line 25 does `let u = ov.used_credits.unwrap_or(0.0) / 100.0;` and line 29 does `let l = l as f64 / 100.0;`, then line 31 prints `${:.2} / ${:.2} ({:.0}%)` so the dollar sign + two-decimal format reads like a normal billing line. If you skipped the division you would see $172000.00 / $50000.00 instead of $1720.00 / $500.00 and assume the reader was hallucinating.
Where do free tools like ccusage report this same balance?
They do not. ccusage reads ~/.claude/projects/<project>/<session>.jsonl on disk and sums input + output tokens per turn against the official model price card. That is a faithful local-token estimate, but it cannot see the extra_usage block on claude.ai (claude.ai's pricing folds in peak-hour multipliers and per-model weights ccusage does not) and it cannot see the overage_spend_limit endpoint at all (it never makes an HTTP call to claude.ai). The extra-usage balance is server truth; ccusage measures local truth. Use both together if you want to compare the two ledgers.
Can I curl the endpoint myself?
Yes. Open DevTools on claude.ai/settings/usage, copy your full Cookie header, then run `curl -H 'Cookie: $YOUR_COOKIE' -H 'Referer: https://claude.ai/settings/usage' https://claude.ai/api/organizations/$ORG_UUID/overage_spend_limit`. You get back the same JSON the extension does: { is_enabled, monthly_credit_limit, used_credits, currency, out_of_credits, disabled_reason, disabled_until }. Pipe through jq and you have a one-shot view of your extra usage balance. ClaudeMeter automates the cookie wrangling, the org enumeration, and the 60-second cadence.
What if overage_spend_limit returns 404?
It does for free workspace orgs and team orgs without metered billing turned on. ClaudeMeter wraps the call in try/catch (extension/background.js line 26-27, src/api.rs lines 31-45) and falls through to the extra_usage block on the usage response if it is present, or omits the line entirely if neither endpoint hands back a balance. So if you do not see an Extra usage line in the menu bar, your org has not enabled metered billing or you are on a free tier; the absence of the line is informative, not a bug.
Why does claude-meter render BLOCKED as exactly two leading spaces and uppercase?
Because the line is laid out for monospaced terminal width: 16 characters of label, then the dollar line, then the optional status flag. format.rs line 26 hardcodes `" BLOCKED"` (two spaces, all caps) so the flag is visually offset from the percent column without needing a separate column. format.rs line 39 then prints with `{:<16}` left-padded label, so 'Extra usage' aligns with '5-hour' and '7-day' above it. It is purely cosmetic, but it is the literal string you will see in the menu bar and the CLI when out_of_credits goes hot.
Does the balance reset every month or every billing cycle?
Every billing cycle. The overage_spend_limit endpoint reflects the current cycle's used_credits and monthly_credit_limit; both reset on the cycle boundary the subscription_details endpoint reports as next_charge_date. ClaudeMeter does not interpolate the reset (the Settings page does not render a countdown for the metered cap), but you can see the renewal date by checking the subscription line printed under the Extra usage line in the CLI or the menu bar dropdown.
What happens if I raise the cap mid-month? Does the balance number change?
monthly_credit_limit changes on the very next poll. used_credits keeps climbing from where it was. Percent recomputes from the new cap, so a balance that was at 100 percent BLOCKED can drop back to (for example) 60 percent when you double the cap, and the BLOCKED suffix disappears within one minute on the menu-bar refresh. ClaudeMeter does not cache the cap; every 60-second poll re-reads it from the server.
Keep reading
Plan + pricing tracker: how the three claude.ai endpoints stitch together
Usage, overage_spend_limit, and subscription_details on the same 60-second tick, joined into one menu-bar surface so renewal date, card, and cap are all readable at once.
Rate limit dashboard: the eight floats and one BLOCKED string the JSON ships
Every utilization float in the /usage response, why some come back 0-1 and others 0-100, and how the dashboard renders the green-bars-but-still-rate-limited case.
Local counter vs server quota: why ccusage and claude.ai disagree
ccusage at 8 percent and claude.ai at 71 percent are both correct. Two ledgers, two sources, neither replaces the other; the extra usage balance is squarely on the server side.