The only dollars-per-PR number that is real money on Claude Code lives in one undocumented endpoint
Three different numbers all claim to be "dollars per pull request" for Claude Code subscribers. Two are phantoms: the API-list projection ccusage prints, and the amortized fee divided by PR count. Only the third, a delta on used_credits from /api/organizations/{org}/overage_spend_limit, divided by 100, ever lands as a Stripe charge. This page is about the divide-by-100 and where the cents come from.
The one-paragraph version
On a flat Claude Code subscription you do not pay per PR. The dollar figure that ccusage prints is what an API customer would have paid for the same tokens, not what you paid. The dollar figure you get from dividing your monthly fee by PR count is amortization arithmetic and never appears on a Stripe invoice. The only Anthropic-side field that maps one-to-one to a real card charge is used_credits on the undocumented /api/organizations/{org_uuid}/overage_spend_limit endpoint, returned in cents. Subtract the value at first commit from the value at last commit, divide by 100, and you have the real dollars-per-PR for that branch. Until at least one subscription rolling window has crossed 1.0, that number is exactly $0.00.
The three numbers, side by side
Each is a real number. Only one of them ever produces a real card charge.
API-list dollars
What ccusage and Claude-Code-Usage-Monitor print. Local token sum times Anthropic's public per-million rate. Right answer if you are an API customer; phantom number if you are a subscriber.
Amortized dollars
Your monthly subscription divided by the count of PRs you ship in that window. An accounting fiction that gets cheaper the more you ship; never appears on any single invoice line.
Overage dollars (real)
Delta on used_credits from /api/organizations/{org}/overage_spend_limit, divided by 100. The only field that becomes an actual extra Stripe charge. Sits at $0 until your subscription windows are full.
The anchor fact: cents on the wire, dollars on the menu bar
Anthropic returns used_credits and monthly_credit_limit in cents on the overage endpoint, the same convention Stripe uses internally for every amount. ClaudeMeter divides by 100 at exactly one place, and that is where the menu-bar dollar reading is born:
The struct that JSON deserializes into makes the units explicit. Two fields are i64/f64 in cents, one is an ISO 4217 code that tells you whether 100 means one dollar, one euro, or one pound:
And here is the actual call into Anthropic. One line of URL construction, plus the same session cookies the browser uses on claude.ai/settings/billing:
Reading the real dollars-per-PR with one curl
You do not need ClaudeMeter installed to see the same number. You do need claude.ai session cookies in a file. With those, the entire measurement is two snapshots and a subtraction:
For comparison, the same PR through the local-log lens. Same code, same tokens, completely different dollar value, and importantly: zero dollars of the figure below were actually charged to anyone.
Why the inputs to dollar-charge collapse to one field
Every billable thing your PR does (tokens, thinking, tool calls, model mix) flows into the same server-side counter. By the time it reaches your wallet there is exactly one number to read.
from PR activity to a real Stripe charge
The four numbers that pin this page down
All four come straight from the open-source ClaudeMeter implementation; none are projected, estimated, or rounded.
A worked example you can verify
A Max 20x subscriber on a heavy week. By Wednesday the seven_day_opus window already sat at 0.93. They started a refactor PR Thursday morning, tipped over the weekly Opus ceiling halfway through, and finished Friday afternoon. The four numbers in their ClaudeMeter snapshot file:
The Stripe invoice for that month posted a separate $1.47 overage line on top of the $200 Max fee. The $42.74 ccusage figure was for a parallel universe where they were on the API instead. Anthropic enforced one number, charged one number, and ClaudeMeter watched it tick up live in the menu bar.
Real-dollars view vs API-list-dollars view
Both look like "dollars per PR." Only one corresponds to a line on a real invoice.
| Feature | Local log + API list price | ClaudeMeter (overage delta) |
|---|---|---|
| Source field on Anthropic's surface | Local JSONL token sum (no Anthropic field reads dollar amounts directly) | used_credits on /api/organizations/{org}/overage_spend_limit (cents) |
| Unit returned by Anthropic | N/A (computed locally from tokens) | Cents (divide by 100) |
| Matches a Stripe invoice line | No | Yes, the overage charge line |
| Equals $0 when subscription windows have headroom | No, always positive | Yes, exactly $0.00 |
| Includes adaptive-thinking tokens generated server-side | No, JSONL omits hidden thinking | Yes, already aggregated server-side |
| Includes Opus 4.7 tokenizer expansion (1.0x to 1.35x vs 4.6) | No, JSONL is pre-tokenizer | Yes |
| Works on an API-only account (no claude.ai login) | Yes | No, requires claude.ai cookies |
| Works offline | Yes | No, hits Anthropic each sample |
| Sample cadence in ClaudeMeter | On-demand from local files | Every 60 seconds (POLL_MINUTES = 1) |
How to measure your own number
real dollars-per-PR in four steps
- 1
Confirm overage is enabled
Hit /api/organizations/{org_uuid}/overage_spend_limit. If is_enabled is false, dollars-per-PR is $0 and you are done. If true, continue.
- 2
Snapshot used_credits at first commit
Read used_credits from the same endpoint, divide by 100. Save it next to the SHA so you can find it later.
- 3
Work the PR
Each Opus or Sonnet request you make once a subscription window is at 1.0 increments used_credits server-side, in cents.
- 4
Snapshot used_credits at last commit
Same endpoint, same divide-by-100. The difference between this and the first snapshot is your real dollars-per-PR.
Get this number right (preconditions)
before you trust the dollars-per-PR delta
- You read used_credits from /api/organizations/{your_org_uuid}/overage_spend_limit, not from /usage's extra_usage object. Both work but the former also returns the cap and the disabled_until lockout date in one call.
- You divided by 100. Anthropic returns the field in the smallest unit of currency (cents for usd, eurocents for eur, pence for gbp). Forgetting the divide reports 100x.
- You captured a snapshot before the first commit, not just after. ClaudeMeter polls every 60 seconds in the background so the first sample of the day is captured automatically as long as the extension or desktop app is running.
- You confirmed neither snapshot crossed subscription_details.next_charge_date. If the billing period rolled over inside your PR, used_credits resets to 0 and a naive subtraction goes negative.
- You did not multiply local tokens by the public API rate to estimate. That number answers a different question (what an API customer would pay) and has no relationship to your card.
Why local-log tools cannot give you this number
ccusage and Claude-Code-Usage-Monitor read ~/.claude/projects/**/*.jsonl and multiply by Anthropic's public API rate. Those local files do not know whether you are on a subscription, do not know whether your subscription windows have headroom, and do not know whether overage is enabled on your org. The only Anthropic-side fact that determines whether a PR costs you any incremental dollars is used_credits, and that field lives behind a cookie-protected endpoint at claude.ai/api/organizations/{org}/overage_spend_limit. ClaudeMeter is the path that calls it: the browser extension is already authenticated as you, and the desktop client lifts your session cookies from your local browser keychain.
That is not a flaw in the local-log tools. They were built for a different question (what is this work worth at API list price). They are right for that question. They are wrong, structurally, for the question this page is about.
The honest caveat
The /api/organizations/{org_uuid}/overage_spend_limit endpoint is internal to claude.ai and undocumented. The cents convention has been stable for many months and matches how the Settings billing page renders the same numbers, but Anthropic could rename, restructure, or split the response at any time. ClaudeMeter deserializes into a strict Rust struct, so if the shape moves the desktop app surfaces a parse error and gets patched. If you are billed on the API instead of a subscription, this whole page is the wrong tool for your question; ccusage is the right one and there is no reason to read the overage endpoint at all. The dollars-per-PR framing here is specifically for the Pro, Max, Team, and Enterprise subscriber who wants to know which Claude Code activity, if any, actually shows up as a Stripe overage line.
See your real dollars-per-PR live
ClaudeMeter sits in your macOS menu bar and refreshes the overage endpoint every 60 seconds. The dollar figure you watch tick up is the same figure Stripe will charge. Free, MIT, no cookie paste.
Install ClaudeMeterFrequently asked questions
What is the actual dollars-per-PR number that hits my card on Claude Code?
On any subscription plan (Pro, Max 5x, Max 20x, Team Premium, Enterprise), the only Claude Code activity that produces a real card charge is overage. Anthropic exposes that number at one undocumented endpoint: GET https://claude.ai/api/organizations/{your_org_uuid}/overage_spend_limit. Look at the used_credits field, divide by 100 to convert cents to dollars, snapshot it at first commit, snapshot at last commit, subtract. That delta is the dollars-per-PR figure that will appear as an extra Stripe charge separate from your flat monthly fee. Until at least one rolling-window utilization passes 1.0, that delta is exactly $0.00, no matter how many tokens ccusage says you spent.
Why is ccusage's 'this PR cost $0.47' figure wrong for me?
ccusage reads ~/.claude/projects/**/*.jsonl, sums the tokens, and multiplies by Anthropic's public API list price ($15 per million input, $75 per million output for Opus 4.7). That math is right for an API account because Anthropic actually bills you per million tokens. On a $20 Pro plan or a $200 Max plan you do not pay per million tokens, you pay flat. The dollar figure ccusage prints is what the same work would have cost you if you had been on the API. It is a counterfactual, not an invoice line. The real invoice line is in Stripe and is driven entirely by the overage_spend_limit endpoint described above.
Where exactly in the source is used_credits divided by 100, and why?
claude-meter/src/format.rs at line 25 reads `let u = ov.used_credits.unwrap_or(0.0) / 100.0;` and lines 27 to 30 do the same for monthly_credit_limit. The reason is that Anthropic returns both fields denominated in cents on the /api/organizations/{org_uuid}/overage_spend_limit endpoint, the same convention Stripe uses internally for amounts. ClaudeMeter's menu-bar dollar reading (`$3.42 / $40.00 (9%)`) is literally `cents / 100.0`. If you write your own client and forget to divide, you will report 100x your real overage spend.
Does the /usage endpoint also return dollars somewhere?
Sort of. The /api/organizations/{org_uuid}/usage payload has an extra_usage object (declared at claude-meter/src/models.rs lines 9 to 16) with a used_credits field that mirrors the overage endpoint's used_credits. It is the same number expressed two ways: extra_usage.used_credits on /usage is the running cents-spent counter, while /overage_spend_limit returns the same counter alongside the cap and currency. Either source works for the dollars-per-PR delta as long as you remember the cents-to-dollars conversion. ClaudeMeter samples the overage endpoint so it can also surface the cap and the disabled_until lockout date.
Can a single PR really cost real dollars on a $20 Pro plan?
Yes, if you have already burned through the rolling windows by the time the PR starts. On Pro, once any of the four utilization fractions on /usage hits 1.0 (typically five_hour or seven_day_opus), Claude Code requests start drawing from extra_usage.used_credits instead of refusing. That is when the dollars start counting. A heavy Opus session that runs after your weekly bucket is exhausted can post genuine dollars to the same Stripe customer the subscription is billed against. The overage_spend_limit endpoint includes monthly_credit_limit (also in cents), which is the cap you set so this cannot run away.
How does ClaudeMeter render this in the menu bar?
Look at claude-meter/src/format.rs lines 24 to 39. The render is shaped like `Extra usage $3.42 / $40.00 (9%)` if you set a cap, or `$3.42 used (no cap)` if you did not. If Anthropic flips out_of_credits to true, ClaudeMeter appends `BLOCKED`. If a disabled_until is set (because you tripped the cap), it appends `until <date>`. Every value in that line comes from the same overage_spend_limit response, divided by 100 where needed. Watching that line move during a PR is the live, honest dollars-per-PR signal.
Why don't local-log tools just call this endpoint and report real dollars?
Because the endpoint requires your live claude.ai session cookies; it is not part of the public API. ccusage and Claude-Code-Usage-Monitor read your local JSONL files instead, which is auth-free and works offline. ClaudeMeter is the path that calls the cookie-protected endpoint directly. The browser extension calls it from extension/background.js (the same browser is already authenticated to claude.ai), and the desktop client calls it from src/api.rs after lifting cookies from your local browser keychain. There is no way to get the real dollar figure from your local logs alone, because the local logs do not know your subscription state.
If overage is disabled on my account, what does the endpoint return?
It still returns. The OverageResponse struct at claude-meter/src/models.rs lines 30 to 40 has is_enabled (bool), monthly_credit_limit (Option<i64>, in cents), used_credits (Option<f64>, in cents), currency (Option<String>), disabled_reason (Option<String>), disabled_until (Option<DateTime<Utc>>), and out_of_credits (bool, defaults false). When overage is off, is_enabled is false, used_credits stays at 0.0, and out_of_credits is irrelevant. Your dollars-per-PR is then guaranteed to be $0 and the question collapses; what you really care about in that case is the four utilization fractions on /usage, which is the rate-limiter signal.
Does extra_usage.used_credits ever decrease, or is it monotonic per month?
It accumulates within a billing period and resets at the next charge. The reset cadence is on the subscription endpoint, not the overage endpoint; check subscription_details.next_charge_date (declared at claude-meter/src/models.rs line 53). For dollars-per-PR you only care about the delta between two snapshots in the same period, so the reset is mostly a footnote unless your PR straddles a billing rollover. ClaudeMeter snapshots both endpoints together so it can detect a reset and not report a negative delta.
What unit is currency in, and what should I expect to see?
currency is a lowercase three-letter ISO 4217 code on both the overage_spend_limit response and the subscription_details response. For individual Pro and Max subscribers it almost always returns 'usd' regardless of where you are in the world (your card network handles FX on the way to your bank). For Team and Enterprise plans it can return 'eur', 'gbp', and so on. Either way, the used_credits value is in the smallest unit of that currency: cents for usd, eurocents for eur, pence for gbp. Dividing by 100 is correct in all three cases.
How fast does used_credits update after a Claude Code request lands?
Within seconds, server-side. ClaudeMeter samples it once a minute (POLL_MINUTES = 1 at extension/background.js line 3), which is dense enough to capture per-PR deltas accurately. If you want sub-minute resolution for a forensic read on one specific PR, point your own polling at /api/organizations/{org_uuid}/overage_spend_limit at any cadence; the endpoint is read-only and idempotent and Anthropic does not rate limit it harshly.
Keep reading
Claude Code cost per PR: the four utilization deltas
If you do not care about real dollars and want the rate-limiter view instead, the cost of a PR is a delta on four utilization fractions. Sister page to this one.
Claude Pro's rolling-window caps explained
What 'utilization = 1.0' actually means and why crossing it is the trigger for real-dollar overage charges.
ClaudeMeter vs ccusage
ccusage prints API-list dollars from your local logs. ClaudeMeter reads server-truth utilization and overage. Different inputs, different answers.
Want a real-dollars-per-PR alert wired into Slack?
The overage endpoint is read-only and idempotent, so a 5-line script can post the delta on every merge. 15 minutes to walk through whether it fits your team.