Anthropic launched the Usage and Cost Analytics API in beta on October 29, behind the analytics-usage-cost-2026-08-24 header, with two endpoints: /v1/organizations/analytics/usage and /v1/organizations/analytics/cost. The same release note makes the Usage and Cost API a legacy API, along with the usage_report, cost_report, user_usage_report and user_cost_report endpoints of the Claude Enterprise Analytics API, and adds: “All of them remain supported.” Neither the release note nor the new page gives a sunset date. Release notes · Usage and Cost Analytics API
A day earlier, on October 28, Anthropic raised the maximum request size for the Messages and Token Counting APIs “from 32 MB to 128 MB on the first-party Claude API”. Release notes That qualifier, first-party, matters for code that also talks to Bedrock or Vertex, and it gets its own section below.
S5 Labs has not called either analytics endpoint or sent a 100 MB request. Everything below comes from Anthropic’s release notes, the analytics API page and the API overview, read on October 30, and the arithmetic is marked as ours.
What the new endpoints add
The headline dimension is actor: who a request is attributed to. It is a user, a service account, a federated cloud identity (an AWS or Google Cloud principal), or, when none of those is behind the request, the API key itself. Each row’s actor is an object whose type says which it is, and usage that cannot be attributed to any identity comes back as actor: null. Personal and service-account keys show their linked identity as the actor and the key in api_key_id; a legacy workspace key appears as both. Requests with no API key at all, such as from the Console or a Workload Identity Federation token, have api_key_id: null, and the filter api_key_ids[]= (an empty entry) is how you include them. Actors
group_by[] takes up to five dimensions, and a dimension is null unless you group by it. The cost endpoint has two more that do not count toward the five: cost_type, which splits each row by cost type, and token_type, which splits token cost by token type. limit does not apply to those two either, so a page can hold more rows than limit. Each cost row carries amount (after discounts, before credits), list_amount (at list prices), currency (always "USD") and requests. Amounts are decimal strings in cents with six decimal places: "41280.000000" is $412.80. How results are shaped · Cost endpoint
Filters sit alongside grouping in bracket notation, OR within a filter and AND across filters, up to 100 values per list. Two behaviors differ from the legacy endpoint and both are quiet. An unknown API key or workspace ID “matches nothing, including a misspelled models[] name”, where the legacy endpoint returned an error. And a dimension that does not apply to your organization, such as api_key_id on Claude Enterprise, is null on every row and its filter matches nothing; only rbac_group_id errors instead, and only when teams are not available to your organization. A chargeback job that filters by a mistyped key ID will not get an error from the API; it will see zero. Migration table
What it costs: freshness and reach
| Usage and Cost API (legacy) | Usage and Cost Analytics API | |
|---|---|---|
| Freshness | “Data typically appears within 5 minutes” | “Data typically refreshes within 4 hours and can take up to 24 hours” |
Earliest starting_at | Any date range | On or after January 1, 2026, and within the last 365 days |
| Span per request | Any, paged forward by bucket | At most 31 days |
1m buckets | Any span, paged at up to 1,440 buckets | At most 24 hours per request |
ending_at with buckets | Not documented as required | Required |
limit | Counts time buckets per page | Counts rows per page, 1 to 1,000, default 20 |
Source: the migration table on the Usage and Cost Analytics API page.
Freshness is the row that decides who moves. Every response carries data_refreshed_at, and usage after that timestamp “is missing or partial”. When nothing in the range has landed yet, data_refreshed_at is null and data is empty. Values can then be revised “until about 7 days after the end of the calendar month”, so October 1 can change until about November 7; for final totals, Anthropic says to query only months that ended at least 7 days ago. Data freshness A spend alert that fires on the legacy endpoint’s typical 5-minute lag today would fire 4 to 24 hours late on the new endpoint. A month-end close has a 7-day settling window to respect; we did not re-read the legacy page, so we cannot say whether its numbers settle on the same schedule.
The reach limits compound. Nothing before January 1, 2026 is reachable, so any 2025 history you want to keep has to come from the legacy endpoint. The 365-day window sits behind the January 1 floor; by our arithmetic the floor is the tighter limit until January 1, 2027, after which the rolling year takes over. A quarter is three or four requests, a year is twelve or more, and a per-minute series is one request per day. Date ranges and time buckets
What breaks in existing code
The response shape changes. The legacy endpoint returns time buckets oldest first, empty ones included, each with a results list. The new one returns rows ranked by order_by (largest first by default), each with its own starting_at and ending_at, dimensions in group and metrics in usage or cost; combinations with nothing in them have no row. bucket_width becomes time_bucket_width with no default, so omitting it now returns whole-range totals (one row per group combination) rather than daily rows. To reproduce the daily report, Anthropic’s recipe is time_bucket_width=1d with the same group_by[], limit=1000, order_by=time&order=asc, then group rows by starting_at and fill missing days with zeros. Migration table
Smaller renames from the same table: account_ids[] and service_account_ids[] become actor_ids[]; group_by[]=account_id becomes group_by[]=actor or actor_type; context_window[] becomes context_windows[]; the cost report’s description string is gone, replaced by structured model, cost_type, token_type, context_window, service_tier, inference_geo and speed. The default workspace gets its real workspace_id instead of null. Usage with no geo or tier reports null where it reported "not_available" and "standard". Code execution shows up as usage rows with model: null, and both endpoints now report requests. Migration table
Headers: the beta header and an anthropic-version header are required on every request; the page’s curl examples send anthropic-version: 2023-06-01. The SDKs and the ant CLI send both and fetch the remaining pages for you, “so limit sets only the page size”. Usage and Cost Analytics API The Python SDK’s 2.2.0 release listed usage and cost reports by dimension among its additions, as noted in our 2026-10-21 migration piece; an unpinned dependency may already have it. Console organizations authenticate with an Admin API key or another Admin API credential, Enterprise organizations with a read:analytics key. The page also says both endpoints are available on Claude Platform on AWS (one region’s workspaces per request) and on the Anthropic-managed Google Cloud offering, with cloud credentials in place of an Admin key; we did not test either path. Usage and Cost Analytics API
On rate limits, the page says only that the “organization-level rate limit” carries over for Enterprise organizations and gives no number for Console organizations. Check the docs for your own figure before scheduling a backfill. Migrate from Enterprise reports
Claude Enterprise: less change, one regression
For Enterprise organizations the earliest date, the 365-day lookback, the 31-day span, data_refreshed_at and the filter and dimension names already applied to the legacy reports and “carry over”. The only new header is the beta header. What they gain is every group in every bucket instead of the top 100 per bucket, actor and actor_type grouping alongside other dimensions on both endpoints, and ranking by a chosen metric across the range. What they lose: the legacy usage_report and cost_report allowed 1m buckets across 31 days, and the new endpoints cap 1m at 24 hours per request for everyone. user_usage_report becomes group_by[]=actor&actor_types[]=user_actor; without that filter, non-user identities and an actor: null row come back too. Migrate from Enterprise reports
Who should move
Our reading, which Anthropic does not spell out:
| Workload | Move now? | Why |
|---|---|---|
| Near-real-time spend alerts, budget cut-offs | No | 5 minutes versus 4 to 24 hours; the legacy endpoint “remains supported” with no sunset date |
| Monthly chargeback by team or service account | Yes | actor and cost_type/token_type are the dimensions chargeback wants, and a monthly job can wait out the 7-day reconciliation window |
| Dashboards with 2025 history | Both | Export pre-2026 data from the legacy endpoint; the new one cannot reach it |
| Enterprise per-minute reports over multi-day ranges | Not yet | 24-hour cap on 1m buckets is a new constraint |
The one trap in the “yes” row is the silent filter. Build the chargeback job to assert that the set of keys or workspaces it filtered by appeared in the grouped output, because the API will not tell you a list entry matched nothing.
128 MB requests, first-party only
The API overview’s request size table now reads: API overview
| Endpoint | Maximum request size |
|---|---|
| Messages, Token Counting | 128 MB |
| Message Batches | 256 MB |
| Files | 500 MB |
| Sessions, Agents, Environments | 32 MB |
Requests over the limit return 413 request_too_large. The note beneath the table is the part multi-cloud code has to read: Bedrock limits requests to 20 MB, Claude Models on Google Cloud (Google managed) to 30 MB, and the overview lists 32 MB for Messages and Token Counting on Claude Platform on AWS, the Anthropic-managed Google Cloud offering and Microsoft Foundry. Neither the overview note nor the October 28 release note says whether those three Anthropic-operated platforms are expected to follow the first-party API to 128 MB. API overview
By our arithmetic, 128 MB is four times the previous first-party ceiling and 6.4 times Bedrock’s. Code that routes the same request across providers has to keep to the lowest ceiling in its path, 20 MB if Bedrock is in the mix. The docs do not say whether the 128 MB is measured on the encoded HTTP body, so budget against the bytes you actually send rather than the size of the files you attach. The Sessions, Agents and Environments row stays at 32 MB; our Managed Agents piece covers that surface.
What the sources don’t say
There is no retirement date for the Usage and Cost API or the Enterprise report endpoints, no rate-limit number for the new endpoints on Console organizations, and no statement about 128 MB on the Anthropic-operated cloud platforms. If your integration only needs daily totals by model and workspace, the legacy endpoint still does that faster and with no beta header; what the new API buys is attribution, and the price is a lag of hours that the page offers no way to shorten.
Sources
Anthropic: Release notes · Usage and Cost Analytics API · Usage and Cost API (legacy) · Claude Enterprise Analytics API · API overview
Related S5 Labs coverage: Claude API version 2026-10-21 and the SDK majors · Managed Agents workflows and OpenTelemetry
