Follow Discord
Sweep 22 Oct 2026 · 21:04Z Build v2.1.309 528 read Stable v2.1.308 Latest v2.1.309 Next v2.1.309 Feeds RSS JSON llms.txt llms-full.txt Unofficial
One capture · api

One read of Claude Developer Platformapi-20260828T000723Z

127 pages moved out of 688 read.

Pages moved 127 significant first
Pages read 688 in this capture
Captured 00:07 UTC
Corpus hash f8f8bcbeab53 corpus-hash

What this read moved

1-25 of 127, page 1 of 6

This capture is too large to show at once. Changes 1-25 of 127 are below, significant first; the rest are on the following screens.

about-claude/models/optimizing-for-cost-and-intelligence Changed · +88 / -51 lines

#### Why caching comes first #### Pick the cache duration #### Turn on caching #### What breaks the cache

from line 20
2020| Your situation | Do this | Where |
2121| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2222| Any workload, any model | Turn on prompt caching and trim unneeded tokens; both are free | [Cache repeated context](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#cache-repeated-context) · [Trim tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
23| A person waits between turns | Use the 1-hour cache duration; it is cheaper once about 1 turn in 20 follows a pause between 5 minutes and an hour and few gaps run over an hour | [Pick the cache duration](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#pick-the-cache-duration) |
2324| Costs are too high; quality is fine | Sweep effort down on your current model | [Tune effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort) |
2425| You are not on the latest model | Upgrade; the current model solves more, usually at lower cost per solved task | [Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model) |
2526| You are choosing or switching models | Compare on cost per completed task, not per token | [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) |
from line 39
3839 
3940### Cache repeated context
4041 
42#### Why caching comes first
43 
4144Turn on [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) before any other lever, because every turn of an agentic task resends the entire growing conversation: system prompt, tool definitions, and every prior turn. A 40-turn task sends its first turn 40 times, so task cost grows with roughly the square of turn count. Caching does not stop the resending, but each resend costs about a tenth as much and processes faster: the prefix is billed at the [cache-read rate](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#pricing), a tenth of the input price, and each turn pays the 1.25x cache-write rate only for what is new.
4245 
4346Across Anthropic's measured runs, cache reads are routinely the largest single component of task cost, making caching worth more than most model-choice decisions. Anthropic priced WideSearch[1](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) and DeepResearch Bench II[7](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) runs with and without caching:
from line 47
4447 
4548![Dumbbell chart, cost per problem with and without prompt caching: each configuration's cost falls by a factor of 2.5 to 3.7](https://platform.claude.com/docs/images/cost-intel-caching.png)
4649 
47The cache's default lifetime is 5 minutes and an agent loop's turns are seconds apart, so the discount applies to most tokens on every turn; the charted runs achieved 81% to 90% hit rates. The saving varies with episode depth, because shorter loops re-read less, but caching stayed the largest single lever on every model and benchmark measured.
50The cache's default lifetime is 5 minutes and an agent loop's turns are seconds apart, so the discount applies to most tokens on every turn. The caching chart's runs achieved 81% to 90% hit rates. The saving varies with episode depth, because shorter loops re-read less, but caching stayed the largest single lever on every model and benchmark measured.
4851 
49If your loop waits on humans between turns, use the [1-hour cache duration](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration). It costs more to write (2x the input price instead of 1.25x) but pays for itself on the first prevented miss, because a miss resends the whole prefix at full price and writes it again.
52#### Pick the cache duration
5053 
54If your loop waits on a person between turns, use the [1-hour cache duration](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#1-hour-cache-duration). It costs more to write (2x the input price instead of 1.25x). A miss on either duration bills the whole prefix at the write price instead of the read price, so the longer duration pays off once a few turns per session follow a pause between 5 minutes and an hour.
55 
56To decide, count the gaps between consecutive requests in a conversation:
57 
58* More than about 1 gap in 20 falls between 5 minutes and an hour, and gaps over an hour are rare: use the 1-hour duration.
59* Turns arrive seconds apart: stay on the 5-minute default. With no pauses, it cost 15% less than the 1-hour setting on Claude Sonnet 5 and 11% less on Claude Opus 5.
60* Gaps over an hour are common: stay on the default. A gap over an hour expires both durations, and the 1-hour setting then re-writes the prefix at 2x the input price instead of 1.25x, so it loses on each of those gaps. It pays off only when, beyond the 1-in-20 share, gaps between 5 minutes and an hour are at least about two-thirds as frequent as gaps over an hour (each in-band gap saves about 1.15x the prefix; each gap over an hour costs about 0.75x).
61 
62Anthropic measured the 20-issue triage job from [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) with pauses inserted before some turns to simulate a person's delay[16](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs). On both models measured, Claude Sonnet 5 and Claude Opus 5, the 1-hour cache became the cheaper setting once about 3% of turns followed a pause, about 1 turn in 30. The 1-in-20 rule is set above that crossover to leave a margin. With a pause before every turn, the 5-minute setting cost $4.13 per 20-issue session compared with $0.70 for the 1-hour setting on Claude Sonnet 5, and $13.41 compared with $2.70 on Claude Opus 5. Every current model uses the same cache multipliers, so the crossover is in the same range on the other models; the exact share depends on how much of a session the model re-reads. Accuracy stayed within run-to-run noise in every cell. The turn after a pause kept its warm-cache latency on the 1-hour setting. The following chart plots cost per session against the share of paused turns on Claude Sonnet 5:
63 
64![Line chart: cost per triage session by share of turns after a pause; the 1-hour cache is cheaper past about 1 turn in 30](https://platform.claude.com/docs/images/cost-intel-cache-ttl.png)
65 
66Anthropic also measured extra requests that keep the 5-minute cache warm. They saved nothing measurable over the 1-hour duration at any share of paused turns and cost more with a pause before every turn, so use the duration instead.
67 
68#### Turn on caching
69 
5170Setup takes little work. [Automatic caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#automatic-caching) places breakpoints for you; otherwise, the [Claude API skill](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/claude-api-skill) that ships with Claude Code can add caching to an existing integration from one prompt. The following excerpt shows the skill adding it to the harness that produced these measurements:
5271 
5372```text wrap
from line 90
7190 
7291Those breakpoint placements follow the standard pattern in [Explicit cache breakpoints](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#explicit-cache-breakpoints).
7392 
93#### What breaks the cache
94 
7495Four things can break your cache during a task. Anything that changes per request, such as a timestamp or a queue position, placed ahead of the stable prefix turns every request into a full cache write: on the triage run in [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens), a 25-token status line at the front of the system prompt cost $4.24 per run instead of $0.59, more than running with caching off. Keep per-request text in the newest user turn. Changing [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) between requests invalidates the cached prefix, so change it only where you would re-cache anyway, such as at a [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) boundary. Changing a [task budget](https://platform.claude.com/docs/en/build-with-claude/task-budgets) partway through does the same, so set it once, on the first request. Every [context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing#context-editing-and-prompt-caching) pass invalidates the prefix from the point it clears and the next request pays to re-cache everything after it, so clear in a few large batches rather than many small ones. Make the last three changes at natural breaks, then confirm cache reads have not dropped; if they have, [cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) shows where the prefix diverged.
7596 
7697### Trim input and context tokens
from line 409
388409 
389410## Measure on your own workload
390411 
391The numbers on this page are from July and August 2026, at the list prices of the time, and will drift as models and prices change. Your escalation rate, how cleanly tasks split, and transcript length move them too. The method stays the same:
412The numbers on this page reflect list prices at the time of measurement and drift as models and prices change. Your escalation rate, how cleanly tasks split, and transcript length move them too. The method stays the same:
392413 
3931. Pull a few tasks from production logs, weighted like real traffic, and [write outcome checks](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) for each: tests pass, ticket closed, row count correct. Record cost per task beside the score: price the four token counts in each response's `usage` at their own rates, summed across the task's requests (the [Usage and Cost API](https://platform.claude.com/docs/en/manage-claude/usage-cost-api) reports the aggregate).
4141. Pull a few tasks from production logs, weighted like real traffic, and [write outcome checks](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests) for each: tests pass, ticket closed, row count correct. Record cost per task beside the score: price the five priced token counts in each response's `usage` at their own rates, summed across the task's requests (the [Usage and Cost API](https://platform.claude.com/docs/en/manage-claude/usage-cost-api) reports the aggregate). The 1-hour cache write bills at 2x the input price, and the 5-minute write at 1.25x.
3944152. Baseline the model tiers across effort levels, not only the default, and plot score against spend. A multi-model configuration must beat the single model's whole curve.
3954163. If the curve shows a gap effort can't close, add the multi-model strategy that fits and re-run the suite.
3964174. Run the winner in shadow on a traffic slice before cutover, then keep the suite running.
from line 437
416437 cost=$(jq -r --argjson in_price "$INPUT_PER_MTOK" --argjson out_price "$OUTPUT_PER_MTOK" '
417438 .usage
418439 | (.input_tokens * $in_price
419 + (.cache_creation_input_tokens // 0) * $in_price * 1.25 # 5-minute cache write
420 + (.cache_read_input_tokens // 0) * $in_price * 0.10 # cache read
440 + (.cache_creation.ephemeral_1h_input_tokens // 0) * $in_price * 2.00 # 1-hour cache write
441 + (.cache_creation.ephemeral_5m_input_tokens // 0) * $in_price * 1.25 # 5-minute cache write
442 + (.cache_read_input_tokens // 0) * $in_price * 0.10 # cache read
421443 + .output_tokens * $out_price) / 1e6
422444 ' <<<"$response")
423445 printf 'Request cost: $%.6f\n' "$cost"
from line 458
436458 
437459 COST=$(jq -r --argjson in_price "$INPUT_PER_MTOK" --argjson out_price "$OUTPUT_PER_MTOK" '
438460 (.input_tokens * $in_price
439 + (.cache_creation_input_tokens // 0) * $in_price * 1.25 # 5-minute cache write
440 + (.cache_read_input_tokens // 0) * $in_price * 0.10 # cache read
461 + (.cache_creation.ephemeral_1h_input_tokens // 0) * $in_price * 2.00 # 1-hour cache write
462 + (.cache_creation.ephemeral_5m_input_tokens // 0) * $in_price * 1.25 # 5-minute cache write
463 + (.cache_read_input_tokens // 0) * $in_price * 0.10 # cache read
441464 + .output_tokens * $out_price) / 1e6
442465 ' <<<"$USAGE")
443466 printf 'Request cost: $%.6f\n' "$COST"
from line 478
455478 messages=[{"role": "user", "content": "Hello, Claude"}],
456479 )
457480 usage = response.usage
481 cache_writes = usage.cache_creation
482 writes_1h = cache_writes.ephemeral_1h_input_tokens if cache_writes else 0
483 writes_5m = cache_writes.ephemeral_5m_input_tokens if cache_writes else 0
458484 cost = (
459485 usage.input_tokens * INPUT_PER_MTOK
460 # Cache writes bill at 1.25x the input price (5-minute cache); cache reads at 0.1x.
461 + (usage.cache_creation_input_tokens or 0) * INPUT_PER_MTOK * 1.25
486 # 1-hour cache writes bill at 2x the input price, 5-minute at 1.25x; reads at 0.1x.
487 + writes_1h * INPUT_PER_MTOK * 2.0
488 + writes_5m * INPUT_PER_MTOK * 1.25
462489 + (usage.cache_read_input_tokens or 0) * INPUT_PER_MTOK * 0.10
463490 + usage.output_tokens * OUTPUT_PER_MTOK
464491 ) / 1_000_000
from line 506
479506 const usage = response.usage;
480507 const cost =
481508 (usage.input_tokens * INPUT_PER_MTOK +
482 (usage.cache_creation_input_tokens ?? 0) * INPUT_PER_MTOK * 1.25 + // 5-minute cache write
509 (usage.cache_creation?.ephemeral_1h_input_tokens ?? 0) * INPUT_PER_MTOK * 2 + // 1-hour cache write
510 (usage.cache_creation?.ephemeral_5m_input_tokens ?? 0) * INPUT_PER_MTOK * 1.25 + // 5-minute cache write
483511 (usage.cache_read_input_tokens ?? 0) * INPUT_PER_MTOK * 0.1 + // cache read
484512 usage.output_tokens * OUTPUT_PER_MTOK) /
485513 1_000_000;
from line 532
504532 double cost =
505533 (
506534 usage.InputTokens * InputPerMtok
507 + (usage.CacheCreationInputTokens ?? 0) * InputPerMtok * 1.25 // 5-minute cache write
535 + (usage.CacheCreation?.Ephemeral1hInputTokens ?? 0) * InputPerMtok * 2.00 // 1-hour cache write
536 + (usage.CacheCreation?.Ephemeral5mInputTokens ?? 0) * InputPerMtok * 1.25 // 5-minute cache write
508537 + (usage.CacheReadInputTokens ?? 0) * InputPerMtok * 0.10 // cache read
509538 + usage.OutputTokens * OutputPerMtok
510539 ) / 1_000_000;
from line 563
534563 
535564 usage := response.Usage
536565 cost := (float64(usage.InputTokens)*inputPerMTok +
537 float64(usage.CacheCreationInputTokens)*inputPerMTok*1.25 + // 5-minute cache write
566 float64(usage.CacheCreation.Ephemeral1hInputTokens)*inputPerMTok*2.00 + // 1-hour cache write
567 float64(usage.CacheCreation.Ephemeral5mInputTokens)*inputPerMTok*1.25 + // 5-minute cache write
538568 float64(usage.CacheReadInputTokens)*inputPerMTok*0.10 + // cache read
539569 float64(usage.OutputTokens)*outputPerMTok) / 1_000_000
540570 fmt.Printf("Request cost: $%.6f\n", cost)
from line 585
555585 .build());
556586 
557587 Usage usage = response.usage();
588 long writes1h = usage.cacheCreation().map(CacheCreation::ephemeral1hInputTokens).orElse(0L);
589 long writes5m = usage.cacheCreation().map(CacheCreation::ephemeral5mInputTokens).orElse(0L);
558590 double cost = (usage.inputTokens() * INPUT_PER_MTOK
559 + usage.cacheCreationInputTokens().orElse(0L) * INPUT_PER_MTOK * 1.25 // 5-minute cache write
591 + writes1h * INPUT_PER_MTOK * 2.00 // 1-hour cache write
592 + writes5m * INPUT_PER_MTOK * 1.25 // 5-minute cache write
560593 + usage.cacheReadInputTokens().orElse(0L) * INPUT_PER_MTOK * 0.10 // cache read
561594 + usage.outputTokens() * OUTPUT_PER_MTOK) / 1_000_000;
562595 IO.println("Request cost: $%.6f".formatted(cost));
from line 610
577610 $usage = $response->usage;
578611 $cost = (
579612 $usage->inputTokens * INPUT_PER_MTOK
580 + ($usage->cacheCreationInputTokens ?? 0) * INPUT_PER_MTOK * 1.25 // 5-minute cache write
613 + ($usage->cacheCreation?->ephemeral1hInputTokens ?? 0) * INPUT_PER_MTOK * 2.00 // 1-hour cache write
614 + ($usage->cacheCreation?->ephemeral5mInputTokens ?? 0) * INPUT_PER_MTOK * 1.25 // 5-minute cache write
581615 + ($usage->cacheReadInputTokens ?? 0) * INPUT_PER_MTOK * 0.10 // cache read
582616 + $usage->outputTokens * OUTPUT_PER_MTOK
583617 ) / 1_000_000;
from line 632
598632 usage = response.usage
599633 cost = (
600634 usage.input_tokens * INPUT_PER_MTOK +
601 usage.cache_creation_input_tokens.to_i * INPUT_PER_MTOK * 1.25 + # 5-minute cache write
635 usage.cache_creation&.ephemeral_1h_input_tokens.to_i * INPUT_PER_MTOK * 2.00 + # 1-hour cache write
636 usage.cache_creation&.ephemeral_5m_input_tokens.to_i * INPUT_PER_MTOK * 1.25 + # 5-minute cache write
602637 usage.cache_read_input_tokens.to_i * INPUT_PER_MTOK * 0.10 + # cache read
603638 usage.output_tokens * OUTPUT_PER_MTOK
604639 ) / 1_000_000
from line 641
606641 ```
607642</CodeGroup>
608643 
609In agent loops the cache-read term is usually the largest of the four; if not, check that caching is engaged. When the [advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#usage-and-billing) or [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction#understanding-usage) is enabled, some tokens are reported only in `usage.iterations` and not in the top-level totals, so sum over `usage.iterations` instead, pricing `advisor_message` entries at the advisor model's rates.
644In agent loops the cache-read term is usually the largest of the five; if not, check that caching is engaged. When the [advisor tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/advisor-tool#usage-and-billing) or [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction#understanding-usage) is enabled, some tokens are reported only in `usage.iterations` and not in the top-level totals, so sum over `usage.iterations` instead, pricing `advisor_message` entries at the advisor model's rates.
610645 
611646The following table lists the levers in the order to try them:
612647 
613| Lever | Saving in these runs | Quality cost | Latency | Where |
614| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
615| Prompt caching | Cost cut by a factor of 2.5 to 3.7 on agent loops; 83% on the triage run | None | Faster | [Cache repeated context](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#cache-repeated-context) |
616| Input trimming | A further 5 percentage points on the triage run | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
617| Prune stale tool results at task boundaries | 39% on the long triage run (compaction 32%); nothing on short loops | None measured | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
618| Tool search | 45% with 500 tool definitions attached; 20% with a GitHub MCP server | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
619| Data files through code execution | 92% on a 25-question data task | A gain, 25 of 25 instead of 6 of 25 | Faster | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
620| Batch API | 50% | None | Results within 24 hours | [Batch work that can wait](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#batch-work-that-can-wait) |
621| Prompt audit against the current model | 14% on both migrations measured | None; a gain on one | Faster (fewer tool rounds) | [Audit prompts against the current model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#audit-prompts-against-the-current-model) |
622| Upgrade the model | Opus 4.7 to Opus 5: about 12% less per solved task, 11 more points; Sonnet 4.6 to Sonnet 5: 14% less, 5 more points | A gain | Neutral | [Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model) |
623| Lower effort | Knowledge work: `medium` 15% to 30%, `low` a third to a half; long coding: `medium` about half, `low` about three quarters | 1 to 3 points on knowledge work, 2 to 8 on long coding | Faster | [Tune effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort) |
624| Re-run failures | About half, at the same pass rate | None | Two runs on the tasks that fail | [Re-run failures at higher effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#re-run-failures-at-higher-effort) |
625| Task budget | 18% to 47% | 3 to 4 points | Faster | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
626| Ask for shorter answers | 39% of output tokens, 14% of cost on the triage run | None | Faster | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
627| Raising `max_tokens` | None per solved task, but more tasks solved | Gains of 2 to 18 points | Neutral | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
628| Advisor | Depends on the capability gap and the consult rate; the chart-reading pairing scored above both models' effort curves, the coding pairing only marginally | Small gains | About two extra calls per task | [Advisor strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#advisor-strategy-escalate-hard-decisions) |
629| Orchestrator | More than 60% below the frontier model beyond one context window; about half on routine tails | 2 to 6 points below the frontier model | Much faster on large inputs | [Orchestrator strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#orchestrator-strategy-delegate-bulk-work) |
648| Lever | Saving in these runs | Quality cost | Latency | Where |
649| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
650| Prompt caching | Cost cut by a factor of 2.5 to 3.7 on agent loops; 83% on the triage run | None | Faster | [Cache repeated context](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#cache-repeated-context) |
651| 1-hour cache duration | Cheaper than the 5-minute default once about 1 turn in 20 follows a pause between 5 minutes and an hour and few gaps run over an hour; with no pauses the default cost 15% less on Claude Sonnet 5 and 11% less on Claude Opus 5 | None | Stays warm after a pause | [Pick the cache duration](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#pick-the-cache-duration) |
652| Input trimming | A further 5 percentage points on the triage run | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
653| Prune stale tool results at task boundaries | 39% on the long triage run (compaction 32%); nothing on short loops | None measured | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
654| Tool search | 45% with 500 tool definitions attached; 20% with a GitHub MCP server | None | Neutral | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
655| Data files through code execution | 92% on a 25-question data task | A gain, 25 of 25 instead of 6 of 25 | Faster | [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens) |
656| Batch API | 50% | None | Results within 24 hours | [Batch work that can wait](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#batch-work-that-can-wait) |
657| Prompt audit against the current model | 14% on both migrations measured | None; a gain on one | Faster (fewer tool rounds) | [Audit prompts against the current model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#audit-prompts-against-the-current-model) |
658| Upgrade the model | Opus 4.7 to Opus 5: about 12% less per solved task, 11 more points; Sonnet 4.6 to Sonnet 5: 14% less, 5 more points | A gain | Neutral | [Upgrade the model](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#upgrade-the-model) |
659| Lower effort | Knowledge work: `medium` 15% to 30%, `low` a third to a half; long coding: `medium` about half, `low` about three quarters | 1 to 3 points on knowledge work, 2 to 8 on long coding | Faster | [Tune effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#tune-effort) |
660| Re-run failures | About half, at the same pass rate | None | Two runs on the tasks that fail | [Re-run failures at higher effort](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#re-run-failures-at-higher-effort) |
661| Task budget | 18% to 47% | 3 to 4 points | Faster | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
662| Ask for shorter answers | 39% of output tokens, 14% of cost on the triage run | None | Faster | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
663| Raising `max_tokens` | None per solved task, but more tasks solved | Gains of 2 to 18 points | Neutral | [Set budgets and output caps](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#set-budgets-and-output-caps) |
664| Advisor | Depends on the capability gap and the consult rate; the chart-reading pairing scored above both models' effort curves, the coding pairing only marginally | Small gains | About two extra calls per task | [Advisor strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#advisor-strategy-escalate-hard-decisions) |
665| Orchestrator | More than 60% below the frontier model beyond one context window; about half on routine tails | 2 to 6 points below the frontier model | Much faster on large inputs | [Orchestrator strategy](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#orchestrator-strategy-delegate-bulk-work) |
630666 
631667## Benchmarks referenced
632668 
633All measurements are Anthropic-internal runs of these benchmarks. Unless noted, costs are USD at August 2026 list prices; Claude Sonnet 5 figures use $2 and $10 per million input and output tokens. Charts labeled "notional USD" price each request's token counts at those rates rather than reporting invoices.
669All measurements are Anthropic-internal runs of these benchmarks. Unless noted, costs are USD at the list prices in effect when each benchmark ran; Claude Sonnet 5 figures use $2 and $10 per million input and output tokens. Charts labeled "notional USD" price each request's token counts at those rates rather than reporting invoices.
634670 
6351. **WideSearch:** Wong et al., "WideSearch: Benchmarking Agentic Broad Info-Seeking," arXiv:2508.07999, 2025. Broad web-research tasks graded on a many-row table's completeness and accuracy; 200 problems, 3 runs per configuration. The caching and effort charts come from separate runs, so per-problem costs differ slightly. The cost-concentration chart is a separate 20-problem run, 3 runs per problem, costed from per-request billing records.
6362. **GDPval:** OpenAI, "GDPval: Evaluating AI Model Performance on Real-World Economically Valuable Tasks," 2025. Knowledge-work deliverables graded against task rubrics; a 210-task run of the released gold set, one attempt per task. A Claude model grades, so absolute scores may differ from published results.
6373. **SWE-bench Pro:** Scale AI, "SWE-Bench Pro: Can AI Agents Solve Long-Horizon Software Engineering Tasks?", 2025. A 482-problem subset selected for compatibility with Anthropic's evaluation harness; scores are not comparable to the public leaderboard. Claude Opus 5 at the default effort averages two runs; reduced-effort settings are single runs. Escalation figures come task by task from those runs: `low` first, then the default on its failures, solved 92.5% to 93.6% across run pairings for about $0.70; `medium` first, 93.8% to 94.2% for about $0.95; the default re-run on its own failures, 94.0% for $1.58; everything at the default, 90.9% to 92.5% for $1.39. The Claude Sonnet 5 executor pairings on the advisor chart come from the same August 2026 series on this subset: the Sonnet-plus-Opus pairing was run twice (a run and an exact replication), the low-effort pairing once, and Claude Sonnet 5 alone twice (77.4%, the baseline for both Pro rows); the task-budget figures are one run per budget on the same subset. The Claude Fable 5 figure in [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) is a single July 2026 run, also the task-budget chart's unbudgeted baseline; every budgeted run completed all 482 problems without harness errors. The upgrade ladder is one run per model at its shipped defaults (two each for Opus 5 and Sonnet 5), run the same week in one harness and organization.
6384. **BrowseComp:** Wei et al., "BrowseComp: A Simple Yet Challenging Benchmark for Browsing Agents," OpenAI, 2025. Effort figures use a 500-problem cut, one to three runs per setting. The cost-insurance chart uses 10 reliably solved problems from a 26-problem slice, 50 delegated and 70 solo runs ($6.45 compared with $11.99 per run in expectation); delegated figures carry a measurement band of about 20%.
6711. **WideSearch:** Wong et al., "WideSearch: Benchmarking Agentic Broad Info-Seeking," arXiv:2508.07999, 2025. Broad web-research tasks graded on a many-row table's completeness and accuracy; 200 problems, 3 runs per configuration, run August 1 to 2, 2026. The caching chart re-prices the effort chart's default-effort runs from their per-request billing records; per-problem costs differ slightly because the two charts use different cost accounting. The cost-concentration chart is a separate 20-problem run, 3 runs per problem, run August 3 to 4, 2026, costed from per-request billing records.
6722. **GDPval:** OpenAI, "GDPval: Evaluating AI Model Performance on Real-World Economically Valuable Tasks," 2025. Knowledge-work deliverables graded against task rubrics; a 210-task run of the released gold set, one attempt per task, run August 2, 2026. A Claude model grades, so absolute scores may differ from published results.
6733. **SWE-bench Pro:** Scale AI, "SWE-Bench Pro: Can AI Agents Solve Long-Horizon Software Engineering Tasks?", 2025. A 482-problem subset selected for compatibility with Anthropic's evaluation harness; scores are not comparable to the public leaderboard. Claude Opus 5 at the default effort averages two runs; reduced-effort settings are single runs; all ran August 4, 2026, as did the task-budget arms. Escalation figures come task by task from those runs: `low` first, then the default on its failures, solved 92.5% to 93.6% across run pairings for about $0.70; `medium` first, 93.8% to 94.2% for about $0.95; the default re-run on its own failures, 94.0% for $1.58; everything at the default, 90.9% to 92.5% for $1.39. The Claude Sonnet 5 executor pairings on the advisor chart come from the same measurement series on this subset: the Sonnet-plus-Opus pairing was run twice (August 7 and August 8, 2026, a run and an exact replication), the low-effort pairing once (August 8, 2026), and Claude Sonnet 5 alone twice (77.4%, the baseline for both Pro rows); the task-budget figures are one run per budget on the same subset. The Claude Fable 5 figure in [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) is a single run from July 2, 2026, also the task-budget chart's unbudgeted baseline; every budgeted run completed all 482 problems without harness errors. The upgrade ladder is one run per model at its shipped defaults (two each for Opus 5 and Sonnet 5), run the same week in one harness and organization.
6744. **BrowseComp:** Wei et al., "BrowseComp: A Simple Yet Challenging Benchmark for Browsing Agents," OpenAI, 2025. Effort figures use a 500-problem cut, one to three runs per setting, run August 3, 2026, with the default point pooling two runs from July 26 to 27, 2026. The cost-insurance chart uses 10 reliably solved problems from a 26-problem slice, 50 delegated runs (August 1 to 2, 2026) and 70 solo runs (50 from August 2 to 3, 2026; 20 archived from July 12 to 13 and August 1, 2026), $6.45 compared with $11.99 per run in expectation; delegated figures carry a measurement band of about 20%.
6396755. **Agent-architecture scaling:** Kim et al., "Towards a Science of Scaling Agent Systems," arXiv:2512.08296, 2025. Independent external study, cited only for the direction of the finding on when delegation does not pay, not for any figure.
6406. **DeepWideSearch:** "DeepWideSearch: Benchmarking Depth and Width in Agentic Information Seeking," arXiv:2510.20168, 2025. The 220 questions span 15 domains, each combining many-row collection with multi-hop retrieval; measured on the benchmark's standing row set, 3 runs per configuration.
6417. **DeepResearch Bench II:** Li et al., "DeepResearch Bench II: Diagnosing Deep Research Agents via Rubrics from Expert Report," arXiv:2601.08536, 2026. Its 132 research tasks across 22 domains are graded against expert-derived binary rubrics; measured on a 50-task subset stratified across all themes, one attempt per task, 3 runs, scored on tasks no configuration refused. Claude Opus 4.6 judges under the benchmark's rubric protocol; the original uses a different judge, and an Anthropic judge may favor the house style. The runs predate Claude Opus 5, hence its absence from the [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) chart. The Sonnet 5 cost differs slightly between the caching chart (inference cost, with and without caching) and that chart (all-in cost, caching on); both come from the same runs.
6428. **Corpus defect sweep:** Anthropic-internal, for work larger than one context window: a 21.6-million-token corpus from 14 public Python package sources with 130 planted defects and deterministic grading; protocol fixed before the runs and internally reviewed; three runs per configuration. Every configuration ran on Claude Managed Agents. The charted team configuration is an August 2026 run in which the Claude Fable 5 coordinator ran the whole sweep inside the platform at its documented limit of 25 concurrent Claude Sonnet 5 workers; its three episodes scored F1 0.842, 0.805, and 0.810 for $263, $299, and $261. The solo configurations are July 2026 runs on the same corpus build. Absolute F1 is specific to this corpus build, not comparable across benchmarks; configuration comparisons are like for like.
6439. **GPQA Diamond:** Rein et al., "GPQA: A Graduate-Level Google-Proof Q\&A Benchmark," 2023. The 198-question Diamond subset, measured August 2026, two runs per configuration, model-graded against reference answers, advisor tokens metered per request. A platform safety check refused two biology questions on the Sonnet and Opus executors; excluding them changes no comparison by more than one point.
64410. **DeepSWE:** Datacurve, "DeepSWE: Measuring Frontier Coding Agents on Original, Long-Horizon Engineering Tasks," arXiv:2607.07946, 2026. Measured August 2026: 113 original tasks across five languages with program-based verifiers. Pairings are two runs each with advisor tokens metered per request, and used a client-side advisor loop rather than the advisor tool, with identical accounting. Single-model effort sweeps are single runs priced from token counts, a cache-aware approximation. Costs per task are run totals divided by 113.
64511. **Internal agentic-coding benchmark:** Anthropic-internal: 370 repository tasks graded by the repositories' own tests. The API figures (Opus 5 alone, Fable 5 alone, and the pairing) were measured August 2026 at the default effort with a 128,000-token output cap, one run per configuration: five attempts per task at the default settings and for the pairing, one at `low` and `medium`; the pairing averaged about two advisor consultations per attempt; costs are per attempt. The Claude Code figures are July 2026 runs of the same tasks, one run per configuration, costs approximate.
64612. **Internal repository-task benchmark (cap measurement):** A separate Anthropic-internal set of about 130 repository tasks, run August 2026 with a plain API agent loop, one attempt per task. The 16,384-token figures average two runs per model; the 64,000-token figures are single runs (124 tasks scored for Opus 5; 108 for Claude Fable 5, the environment having skipped the rest before the model ran). About half the Fable attempts the 16,384 cap had ended solved at 64,000; a further Fable run at 128,000 scored 56.1%, within noise of the 64,000 run. The SWE-bench Pro cap figures are one Claude Fable 5 run per cap at the default effort on a 100-problem subset stratified from reference 3's 482-problem set, not comparable to its scores. The chart's per-turn distributions come from the Opus run at 64,000 and the Fable run at 128,000, so neither is cut off by its own cap.
64713. **Chartography:** Surge AI, "Chartography," 2026. The complete released 100-question set, measured August 2026 with Anthropic's implementation on Claude Managed Agents (standard cloud sandbox; advisor configurations use the Managed Agents advisor). Claude Sonnet 4.6 grades instead of the reference judge and the benchmark runs with tools, so scores compare across configurations here but not to the published leaderboard. Two runs per configuration, pooled; run-to-run spreads were 4 to 10 points. Costs exclude sandbox time, which added under 1%. The consult-rate comparison comes from rerunning the same configurations on the Messages API with a container tool set.
6766. **DeepWideSearch:** "DeepWideSearch: Benchmarking Depth and Width in Agentic Information Seeking," arXiv:2510.20168, 2025. The 220 questions span 15 domains, each combining many-row collection with multi-hop retrieval; measured on the benchmark's standing row set, 3 runs per configuration, run August 2, 2026 (the single-worker team point ran July 26 to 27, 2026).
6777. **DeepResearch Bench II:** Li et al., "DeepResearch Bench II: Diagnosing Deep Research Agents via Rubrics from Expert Report," arXiv:2601.08536, 2026. Its 132 research tasks across 22 domains are graded against expert-derived binary rubrics; measured on a 50-task subset stratified across all themes, one attempt per task, 3 runs (August 2 to 3, 2026), scored on tasks no configuration refused. Claude Opus 4.6 judges under the benchmark's rubric protocol; the original uses a different judge, and an Anthropic judge may favor the house style. Anthropic did not run Claude Opus 5 on this benchmark, so it is absent from the [Compare models](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#compare-models-on-cost-per-task) chart. The Sonnet 5 cost differs slightly between the caching chart (inference cost, with and without caching) and that chart (all-in cost, caching on); both come from the same runs.
6788. **Corpus defect sweep:** Anthropic-internal, for work larger than one context window: a 21.6-million-token corpus from 14 public Python package sources with 130 planted defects and deterministic grading; protocol fixed before the runs and internally reviewed; three runs per configuration. Every configuration ran on Claude Managed Agents. The charted team configuration is an August 13, 2026, run in which the Claude Fable 5 coordinator ran the whole sweep inside the platform at its documented limit of 25 concurrent Claude Sonnet 5 workers; its three episodes scored F1 0.842, 0.805, and 0.810 for $263, $299, and $261. The solo configurations ran August 3 to 4, 2026, on the same corpus build. Absolute F1 is specific to this corpus build, not comparable across benchmarks; configuration comparisons are like for like.
6799. **GPQA Diamond:** Rein et al., "GPQA: A Graduate-Level Google-Proof Q\&A Benchmark," 2023. The 198-question Diamond subset, two runs per configuration, run August 7, 2026, model-graded against reference answers, advisor tokens metered per request. A platform safety check refused two biology questions on the Sonnet and Opus executors; excluding them changes no comparison by more than one point.
68010. **DeepSWE:** Datacurve, "DeepSWE: Measuring Frontier Coding Agents on Original, Long-Horizon Engineering Tasks," arXiv:2607.07946, 2026. The set has 113 original tasks across five languages with program-based verifiers. Pairings are two runs each, run August 7, 2026, with advisor tokens metered per request, and used a client-side advisor loop rather than the advisor tool, with identical accounting. Single-model effort sweeps are single runs priced from token counts, a cache-aware approximation. Costs per task are run totals divided by 113.
68111. **Internal agentic-coding benchmark:** Anthropic-internal: 370 repository tasks graded by the repositories' own tests. The API figures (Opus 5 alone, Fable 5 alone, and the pairing) were measured August 9 to 10, 2026, at the default effort with a 128,000-token output cap, one run per configuration: five attempts per task at the default settings and for the pairing, one at `low` and `medium`; the pairing averaged about two advisor consultations per attempt; costs are per attempt. The Claude Code figures are runs of the same tasks from July 8 to 23, 2026, one run per configuration, costs approximate.
68212. **Internal repository-task benchmark (cap measurement):** A separate Anthropic-internal set of about 130 repository tasks, run August 8 to 10, 2026, with a plain API agent loop, one attempt per task. The 16,384-token figures average two runs per model; the 64,000-token figures are single runs (124 tasks scored for Opus 5; 108 for Claude Fable 5, the environment having skipped the rest before the model ran). About half the Fable attempts the 16,384 cap had ended solved at 64,000; a further Fable run at 128,000 scored 56.1%, within noise of the 64,000 run. The SWE-bench Pro cap figures are one Claude Fable 5 run per cap (August 10, 2026) at the default effort on a 100-problem subset stratified from reference 3's 482-problem set, not comparable to its scores. The chart's per-turn distributions come from the Opus run at 64,000 and the Fable run at 128,000, so neither is cut off by its own cap.
68313. **Chartography:** Surge AI, "Chartography," 2026. The complete released 100-question set, measured August 8 to 10, 2026, with Anthropic's implementation on Claude Managed Agents (standard cloud sandbox; advisor configurations use the Managed Agents advisor). Claude Sonnet 4.6 grades instead of the reference judge and the benchmark runs with tools, so scores compare across configurations here but not to the published leaderboard. Two runs per configuration, pooled; run-to-run spreads were 4 to 10 points. Costs exclude sandbox time, which added under 1%. The consult-rate comparison comes from rerunning the same configurations on the Messages API with a container tool set, August 10 to 11, 2026.
64868414. **Support-desk prompt-audit evaluation:** An Anthropic-constructed set of 44 support tickets with deterministic grading, run August 2026 under six system prompts, each adding to the same clean prompt one pattern common in prompts written for Claude Opus 4.8 and Claude Sonnet 4.6. Each chart point is one of three cases (older model, newer model on the same prompt, newer model after the audit) averaged over the six prompts and 44 tickets. The Opus 5 accuracy gain has a 95% confidence interval of 3 to 8 points; the Sonnet accuracy differences are within noise.
64915. **Data-file question set:** An Anthropic-constructed set of 25 aggregate questions over a 1,862-row slice of a public liquor-sales CSV, with ground truth computed by pandas and exact-match grading, run August 2026 on Claude Sonnet 5 and Claude Opus 5 with thinking disabled (the in-context arm cannot complete at the default), a 4,000-token output cap, and no prompt caching, three runs per configuration. The file arm uploads the CSV through the Files API and uses the `code_execution_20260120` tool.
68515. **Data-file question set:** An Anthropic-constructed set of 25 aggregate questions over a 1,862-row slice of a public liquor-sales CSV, with ground truth computed by pandas and exact-match grading, run on Claude Sonnet 5 and Claude Opus 5 with thinking disabled (the in-context arm cannot complete at the default), a 4,000-token output cap, and no prompt caching, three runs per configuration, run August 19, 2026. The file arm uploads the CSV through the Files API and uses the `code_execution_20260120` tool.
68616. **Cache duration measurement:** The 20-issue triage job from [Trim input and context tokens](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#trim-input-and-context-tokens), run August 23, 2026, on Claude Sonnet 5 and Claude Opus 5 on the Messages API with the same harness, the Claude Opus 5 cells with `max_tokens` raised to 4,096, with pauses inserted before a randomly chosen share of turns (none, 5%, 10%, and every turn at 6 minutes on all 20 issues on both models, plus every turn at 2 minutes on Claude Sonnet 5; 20-minute pauses on a 5-issue subset on both models; 45-minute pauses on a 5-issue subset on Claude Sonnet 5 only). Three runs per cell, cost computed from each response's `usage` fields on a customer-billed organization at list prices, accuracy against the same gold labels. The crossover is about 3.3% of turns on both models: the median of each session's break-even share, computed by the cost model from that session's turn-by-turn context sizes, over all 45 Claude Sonnet 5 and 36 Claude Opus 5 twenty-issue sessions in the analysis (every pause schedule run on the full job, under all three cache settings, three runs each; the 5-issue cells are not in it). The 5% cell tied on Claude Sonnet 5 because that draw's pauses fell on small prefixes. The page's 1-in-20 rule sits above the measured crossover. Anthropic measured keep-alive requests that refresh the 5-minute cache as a comparator only. They matched the 1-hour setting at best and cost more with a pause before every turn, so do not use them.
650687 
651688## Next steps
652689 

api/admin Changed · +795 / -367 lines

This page is larger than the 256 KiB this site keeps, so one side of the diff below stops where the stored text does.

The two sides of this change are more than 400 edits apart, too far apart to line up, so this is the differ's own diff of it and the words inside a line are not marked.

from line 54
5454 
5555**POST** `/v1/organizations/invites`
5656 
57For Claude Enterprise organizations, this endpoint's availability is in beta.
57Invite a user to join the organization by email.
5858 
5959On plans that draw members from a finite pool of purchased seats, the invite automatically consumes a seat from the lowest tier with availability; there is no seat-tier parameter. When no seat is free the request fails with a 400 error rather than purchasing a seat.
6060 
from line 70
7070 
7171 Role for the invited User.
7272 
73 The accepted values depend on the organization type. Console and API organizations accept `user`, `developer`, `billing`, and `claude_code_user`; `admin` cannot be assigned through the API. Claude Enterprise organizations (beta) accept `user` and `managed`.
73 The accepted values depend on the organization type. Console and API organizations accept `user`, `developer`, `billing`, and `claude_code_user`; `admin` cannot be assigned through the API. Claude Enterprise organizations accept `user` and `managed`.
7474 
7575 - `"billing"`
7676 
from line 84
8484 
8585- `rbac_group_ids: optional array of string`
8686 
87 RBAC group IDs to assign to the User when the Invite is accepted. A non-empty array is accepted only for a Claude Enterprise organization with RBAC groups (beta), and requires the key to carry the `write:rbac_groups` scope.
87 RBAC group IDs to assign to the User when the Invite is accepted. A non-empty array is accepted only for a Claude Enterprise organization with RBAC groups, and requires the key to carry the `write:rbac_groups` scope.
8888 
8989 maxItems: 100
9090 
from line 120
120120 
121121 - `rbac_group_ids: array of string`
122122 
123 RBAC group IDs recorded on the Invite (beta, Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
123 RBAC group IDs recorded on the Invite (Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
124124 
125125 - `role: "admin" or "billing" or "claude_code_user" or 6 more`
126126 
from line 199
199199 
200200**GET** `/v1/organizations/invites/{invite_id}`
201201 
202For Claude Enterprise organizations, this endpoint's availability is in beta.
202Retrieve an invite by ID.
203203 
204204#### Path parameters
205205 
from line 239
239239 
240240 - `rbac_group_ids: array of string`
241241 
242 RBAC group IDs recorded on the Invite (beta, Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
242 RBAC group IDs recorded on the Invite (Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
243243 
244244 - `role: "admin" or "billing" or "claude_code_user" or 6 more`
245245 
from line 313
313313 
314314**GET** `/v1/organizations/invites`
315315 
316For Claude Enterprise organizations, this endpoint's availability is in beta.
316List the organization's invites.
317317 
318318#### Query parameters
319319 
from line 343
343343 
344344 Filter to items whose `role` equals one of the supplied values. Repeatable; values are OR'ed together.
345345 
346 Accepted values depend on the organization type: Console and API organizations accept `user`, `developer`, `billing`, `admin`, and `claude_code_user`; Claude Enterprise organizations (beta) accept `user`, `owner`, `primary_owner`, `membership_admin`, and `managed`.
346 Accepted values depend on the organization type: Console and API organizations accept `user`, `developer`, `billing`, `admin`, and `claude_code_user`; Claude Enterprise organizations accept `user`, `owner`, `primary_owner`, `membership_admin`, and `managed`.
347347 
348348- `statuses: optional array of "accepted" or "expired" or "pending"`
349349 
from line 387
387387 
388388 - `rbac_group_ids: array of string`
389389 
390 RBAC group IDs recorded on the Invite (beta, Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
390 RBAC group IDs recorded on the Invite (Claude Enterprise organizations), to be assigned to the User when the Invite is accepted. `[]` when none.
391391 
392392 - `role: "admin" or "billing" or "claude_code_user" or 6 more`
393393 
from line 480
480480 
481481**DELETE** `/v1/organizations/invites/{invite_id}`
482482 
483For Claude Enterprise organizations, this endpoint's availability is in beta.
483Delete a pending invite.
484484 
485485#### Path parameters
486486 
from line 526
526526 
527527**GET** `/v1/organizations/users/{user_id}`
528528 
529For Claude Enterprise organizations, this endpoint's availability is in beta.
529Retrieve a member of the organization by user ID.
530530 
531531#### Path parameters
532532 
from line 611
611611 
612612**GET** `/v1/organizations/users`
613613 
614For Claude Enterprise organizations, this endpoint's availability is in beta.
614List the organization's members.
615615 
616616#### Query parameters
617617 
from line 641
641641 
642642 Filter to items whose `role` equals one of the supplied values. Repeatable; values are OR'ed together.
643643 
644 Accepted values depend on the organization type: Console and API organizations accept `user`, `developer`, `billing`, `admin`, and `claude_code_user`; Claude Enterprise organizations (beta) accept `user`, `owner`, `primary_owner`, `membership_admin`, and `managed`.
644 Accepted values depend on the organization type: Console and API organizations accept `user`, `developer`, `billing`, `admin`, and `claude_code_user`; Claude Enterprise organizations accept `user`, `owner`, `primary_owner`, `membership_admin`, and `managed`.
645645 
646646#### Returns
647647 
from line 739
739739 
740740**POST** `/v1/organizations/users/{user_id}`
741741 
742For Claude Enterprise organizations, this endpoint's availability is in beta.
742Update a member's organization role.
743743 
744744#### Path parameters
745745 
from line 753
753753 
754754 New role for the User.
755755 
756 The accepted values depend on the organization type. Console and API organizations accept `user`, `developer`, `billing`, and `claude_code_user`; `admin` cannot be assigned through the API. Claude Enterprise organizations (beta) accept `user` and `managed`.
756 The accepted values depend on the organization type. Console and API organizations accept `user`, `developer`, `billing`, and `claude_code_user`; `admin` cannot be assigned through the API. Claude Enterprise organizations accept `user` and `managed`.
757757 
758758 - `"billing"`
759759 
from line 846
846846 
847847**DELETE** `/v1/organizations/users/{user_id}`
848848 
849For Claude Enterprise organizations, this endpoint's availability is in beta.
849Remove a member from the organization.
850850 
851851#### Path parameters
852852 
from line 894
894894 
895895List RBAC Groups in the Claude Enterprise tenant.
896896 
897The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
897The RBAC Groups API is available to Claude Enterprise organizations only.
898898 
899899#### Query parameters
900900 
from line 909
909909- `page: optional string`
910910 
911911 Optionally set to the `next_page` token from the previous response.
912 
913#### Headers
914 
915- `"anthropic-beta": optional array of string`
916 
917 Optional header to specify the beta version(s) you want to use.
918 
919 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
920912 
921913#### Returns
922914 
from line 998
1006998 
1007999Retrieve an RBAC Group by ID.
10081000 
1009The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1001The RBAC Groups API is available to Claude Enterprise organizations only.
10101002 
10111003#### Path parameters
10121004 
10131005- `group_id: string`
10141006 
10151007 ID of the RBAC Group.
1016 
1017#### Headers
1018 
1019- `"anthropic-beta": optional array of string`
1020 
1021 Optional header to specify the beta version(s) you want to use.
1022 
1023 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
10241008 
10251009#### Returns
10261010 
from line 1080
10961080 
10971081Create an RBAC Group in the Claude Enterprise tenant. Groups created via the API have source type `"direct"`.
10981082 
1099The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1100 
1101#### Headers
1102 
1103- `"anthropic-beta": optional array of string`
1104 
1105 Optional header to specify the beta version(s) you want to use.
1106 
1107 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
1083The RBAC Groups API is available to Claude Enterprise organizations only.
11081084 
11091085#### Body parameters
11101086 
from line 1168
11921168 
11931169Update an RBAC Group's name. Groups provisioned by an identity provider (source type `"scim"`) cannot be modified via the API.
11941170 
1195The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1171The RBAC Groups API is available to Claude Enterprise organizations only.
11961172 
11971173#### Path parameters
11981174 
11991175- `group_id: string`
12001176 
12011177 ID of the RBAC Group.
1202 
1203#### Headers
1204 
1205- `"anthropic-beta": optional array of string`
1206 
1207 Optional header to specify the beta version(s) you want to use.
1208 
1209 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
12101178 
12111179#### Body parameters
12121180 
from line 1262
12941262 
12951263Delete an RBAC Group. Groups provisioned by an identity provider (source type `"scim"`) cannot be deleted via the API.
12961264 
1297The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1265The RBAC Groups API is available to Claude Enterprise organizations only.
12981266 
12991267#### Path parameters
13001268 
13011269- `group_id: string`
13021270 
13031271 ID of the RBAC Group.
1304 
1305#### Headers
1306 
1307- `"anthropic-beta": optional array of string`
1308 
1309 Optional header to specify the beta version(s) you want to use.
1310 
1311 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
13121272 
13131273#### Returns
13141274 
from line 1312
13521312 
13531313List members of an RBAC Group.
13541314 
1355The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1315The RBAC Groups API is available to Claude Enterprise organizations only.
13561316 
13571317#### Path parameters
13581318 
from line 1333
13731333- `page: optional string`
13741334 
13751335 Optionally set to the `next_page` token from the previous response.
1376 
1377#### Headers
1378 
1379- `"anthropic-beta": optional array of string`
1380 
1381 Optional header to specify the beta version(s) you want to use.
1382 
1383 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
13841336 
13851337#### Returns
13861338 
from line 1404
14521404 
14531405Add a User to an RBAC Group. Membership of groups provisioned by an identity provider (source type `"scim"`) cannot be modified via the API.
14541406 
1455The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1407The RBAC Groups API is available to Claude Enterprise organizations only.
14561408 
14571409#### Path parameters
14581410 
14591411- `group_id: string`
14601412 
14611413 ID of the RBAC Group.
1462 
1463#### Headers
1464 
1465- `"anthropic-beta": optional array of string`
1466 
1467 Optional header to specify the beta version(s) you want to use.
1468 
1469 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
14701414 
14711415#### Body parameters
14721416 
from line 1478
15341478 
15351479Remove a User from an RBAC Group. Membership of groups provisioned by an identity provider (source type `"scim"`) cannot be modified via the API.
15361480 
1537The RBAC Groups API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1481The RBAC Groups API is available to Claude Enterprise organizations only.
15381482 
15391483#### Path parameters
15401484 
from line 1489
15451489- `user_id: string`
15461490 
15471491 ID of the User.
1548 
1549#### Headers
1550 
1551- `"anthropic-beta": optional array of string`
1552 
1553 Optional header to specify the beta version(s) you want to use.
1554 
1555 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
15561492 
15571493#### Returns
15581494 
from line 1535
15991535 
16001536List RBAC Roles in the organization.
16011537 
1602The RBAC Roles API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1538The RBAC Roles API is available to Claude Enterprise organizations only.
16031539 
16041540#### Query parameters
16051541 
from line 1550
16141550- `page: optional string`
16151551 
16161552 Optionally set to the `next_page` token from the previous response.
1617 
1618#### Headers
1619 
1620- `"anthropic-beta": optional array of string`
1621 
1622 Optional header to specify the beta version(s) you want to use.
1623 
1624 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
16251553 
16261554#### Returns
16271555 
from line 1624
16961624 
16971625Retrieve an RBAC Role by ID.
16981626 
1699The RBAC Roles API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1627The RBAC Roles API is available to Claude Enterprise organizations only.
17001628 
17011629#### Path parameters
17021630 
17031631- `role_id: string`
17041632 
17051633 ID of the RBAC Role.
1706 
1707#### Headers
1708 
1709- `"anthropic-beta": optional array of string`
1710 
1711 Optional header to specify the beta version(s) you want to use.
1712 
1713 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
17141634 
17151635#### Returns
17161636 
from line 1692
17721692 
17731693List the permissions an RBAC Role grants.
17741694 
1775The RBAC Roles API is in beta and available to Claude Enterprise organizations only. Requests must send the `ce-user-management-2026-07-13` value in the `anthropic-beta` header.
1695The RBAC Roles API is available to Claude Enterprise organizations only.
17761696 
17771697#### Path parameters
17781698 
from line 1713
17931713- `page: optional string`
17941714 
17951715 Optionally set to the `next_page` token from the previous response.
1796 
1797#### Headers
1798 
1799- `"anthropic-beta": optional array of string`
1800 
1801 Optional header to specify the beta version(s) you want to use.
1802 
1803 To use multiple betas, use a comma separated list like `beta1,beta2` or specify the header multiple times for each beta.
18041716 
18051717#### Returns
18061718 
from line 1889
19771889 
19781890- `data_residency: optional object or null`
19791891 
1980 Data residency configuration for the workspace. If omitted, defaults to workspace_geo=`"us"`, allowed_inference_geos=`"unrestricted"`, and default_inference_geo=`"global"`.
1892 Data residency configuration for the workspace. If omitted, defaults to `workspace_geo: "us"`, `allowed_inference_geos: "unrestricted"`, and `default_inference_geo: "global"`.
19811893 
19821894 - `allowed_inference_geos: optional array of "global" or "us" or "unrestricted" or null`
19831895 
from line 1905
19931905 
19941906 - `default_inference_geo: optional "global" or "us" or null`
19951907 
1996 Default inference geo applied when requests omit the parameter. Defaults to 'global' if omitted. Must be a member of allowed_inference_geos unless allowed_inference_geos is `"unrestricted"`.
1908 Default inference geo applied when requests omit the parameter. Defaults to 'global' if omitted. Must be a member of `allowed_inference_geos` unless `allowed_inference_geos` is `"unrestricted"`.
19971909 
19981910 - `"global"`
19991911 
from line 2362
24502362 
24512363 - `default_inference_geo: optional "global" or "us" or null`
24522364 
2453 Default inference geo applied when requests omit the parameter. Must be a member of allowed_inference_geos unless allowed_inference_geos is `"unrestricted"`.
2365 Default inference geo applied when requests omit the parameter. Must be a member of `allowed_inference_geos` unless `allowed_inference_geos` is `"unrestricted"`.
24542366 
24552367 - `"global"`
24562368 
from line 2651
27392651 
27402652- `workspace_role: "workspace_admin" or "workspace_developer" or "workspace_restricted_developer" or "workspace_user"`
27412653 
2742 Role of the new Workspace Member. Cannot be "workspace_billing".
2654 Role of the new Workspace Member. Cannot be `workspace_billing`.
27432655 
27442656 - `"workspace_admin"`
27452657 
from line 3224
33123224 
33133225- `implicit: boolean or null`
33143226 
3315 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
3227 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
33163228 
33173229- `service_account_id: string`
33183230 
from line 3317
34053317 
34063318- `implicit: boolean or null`
34073319 
3408 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
3320 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
34093321 
34103322- `service_account_id: string`
34113323 
from line 3415
35033415 
35043416 - `implicit: boolean or null`
35053417 
3506 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
3418 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
35073419 
35083420 - `service_account_id: string`
35093421 
from line 3527
36153527 
36163528- `implicit: boolean or null`
36173529 
3618 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
3530 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
36193531 
36203532- `service_account_id: string`
36213533 
from line 3682
37703682 
37713683 ID of the actor that created the object.
37723684 
3773 - `type: string`
3685 - `type: "service_account" or "user"`
37743686 
37753687 Type of the actor that created the object.
37763688 
3689 - `"service_account"`
3690 
3691 - `"user"`
3692 
37773693 - `expires_at: string or null`
37783694 
37793695 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 3704
37883704 
37893705 Partially redacted hint for the API key.
37903706 
3791 - `principal: object or null`
3792 
3793 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
3794 
3795 - `id: string`
3796 
3797 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
3798 
3799 - `type: "service_account" or "user"`
3800 
3801 Type of the principal the API key acts as.
3802 
3803 - `"service_account"`
3804 
3805 - `"user"`
3707 - `principal: object or object or null`
3708 
3709 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
3710 
3711 - `UserActor object`
3712 
3713 - `type: "user_actor"`
3714 
3715 Principal type. Always `"user_actor"` for a User.
3716 
3717 default: user_actor
3718 
3719 - `user_id: string`
3720 
3721 ID of the User the API key acts as.
3722 
3723 - `ServiceAccountActor object`
3724 
3725 - `service_account_id: string`
3726 
3727 ID of the Service Account the API key acts as.
3728 
3729 - `type: "service_account_actor"`
3730 
3731 Principal type. Always `"service_account_actor"` for a Service Account.
3732 
3733 default: service_account_actor
3734 
3735 - `scope: object or object`
3736 
3737 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
3738 
3739 - `Organization object`
3740 
3741 - `type: "organization"`
3742 
3743 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
3744 
3745 default: organization
3746 
3747 - `Workspace object`
3748 
3749 - `type: "workspace"`
3750 
3751 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
3752 
3753 default: workspace
3754 
3755 - `workspace_id: string`
3756 
3757 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
38063758 
38073759 - `status: "active" or "archived" or "expired" or "inactive"`
38083760 
from line 3778
38263778 
38273779 - `workspace_id: string or null`
38283780 
3829 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
3781 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
3782 
3783 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
38303784 
38313785#### Example
38323786 
from line 3804
38503804 "name": "Developer Key",
38513805 "partial_key_hint": "sk-ant-api03-R2D...igAA",
38523806 "principal": {
3853 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
3854 "type": "user"
3807 "type": "user_actor",
3808 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
3809 },
3810 "scope": {
3811 "type": "workspace",
3812 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
38553813 },
38563814 "status": "active",
38573815 "type": "api_key",
from line 3885
39273885 
39283886 ID of the actor that created the object.
39293887 
3930 - `type: string`
3888 - `type: "service_account" or "user"`
39313889 
39323890 Type of the actor that created the object.
39333891 
3892 - `"service_account"`
3893 
3894 - `"user"`
3895 
39343896 - `expires_at: string or null`
39353897 
39363898 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 3907
39453907 
39463908 Partially redacted hint for the API key.
39473909 
3948 - `principal: object or null`
3949 
3950 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
3951 
3952 - `id: string`
3953 
3954 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
3955 
3956 - `type: "service_account" or "user"`
3957 
3958 Type of the principal the API key acts as.
3959 
3960 - `"service_account"`
3961 
3962 - `"user"`
3910 - `principal: object or object or null`
3911 
3912 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
3913 
3914 - `UserActor object`
3915 
3916 - `type: "user_actor"`
3917 
3918 Principal type. Always `"user_actor"` for a User.
3919 
3920 default: user_actor
3921 
3922 - `user_id: string`
3923 
3924 ID of the User the API key acts as.
3925 
3926 - `ServiceAccountActor object`
3927 
3928 - `service_account_id: string`
3929 
3930 ID of the Service Account the API key acts as.
3931 
3932 - `type: "service_account_actor"`
3933 
3934 Principal type. Always `"service_account_actor"` for a Service Account.
3935 
3936 default: service_account_actor
3937 
3938 - `scope: object or object`
3939 
3940 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
3941 
3942 - `Organization object`
3943 
3944 - `type: "organization"`
3945 
3946 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
3947 
3948 default: organization
3949 
3950 - `Workspace object`
3951 
3952 - `type: "workspace"`
3953 
3954 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
3955 
3956 default: workspace
3957 
3958 - `workspace_id: string`
3959 
3960 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
39633961 
39643962 - `status: "active" or "archived" or "expired" or "inactive"`
39653963 
from line 3981
39833981 
39843982 - `workspace_id: string or null`
39853983 
3986 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
3984 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
3985 
3986 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
39873987 
39883988- `first_id: string or null`
39893989 
from line 4021
40214021 "name": "Developer Key",
40224022 "partial_key_hint": "sk-ant-api03-R2D...igAA",
40234023 "principal": {
4024 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
4025 "type": "user"
4024 "type": "user_actor",
4025 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
4026 },
4027 "scope": {
4028 "type": "workspace",
4029 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
40264030 },
40274031 "status": "active",
40284032 "type": "api_key",
from line 4093
40894093 
40904094 ID of the actor that created the object.
40914095 
4092 - `type: string`
4096 - `type: "service_account" or "user"`
40934097 
40944098 Type of the actor that created the object.
40954099 
4100 - `"service_account"`
4101 
4102 - `"user"`
4103 
40964104 - `expires_at: string or null`
40974105 
40984106 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 4115
41074115 
41084116 Partially redacted hint for the API key.
41094117 
4110 - `principal: object or null`
4111 
4112 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
4113 
4114 - `id: string`
4115 
4116 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
4117 
4118 - `type: "service_account" or "user"`
4119 
4120 Type of the principal the API key acts as.
4121 
4122 - `"service_account"`
4123 
4124 - `"user"`
4118 - `principal: object or object or null`
4119 
4120 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
4121 
4122 - `UserActor object`
4123 
4124 - `type: "user_actor"`
4125 
4126 Principal type. Always `"user_actor"` for a User.
4127 
4128 default: user_actor
4129 
4130 - `user_id: string`
4131 
4132 ID of the User the API key acts as.
4133 
4134 - `ServiceAccountActor object`
4135 
4136 - `service_account_id: string`
4137 
4138 ID of the Service Account the API key acts as.
4139 
4140 - `type: "service_account_actor"`
4141 
4142 Principal type. Always `"service_account_actor"` for a Service Account.
4143 
4144 default: service_account_actor
4145 
4146 - `scope: object or object`
4147 
4148 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
4149 
4150 - `Organization object`
4151 
4152 - `type: "organization"`
4153 
4154 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
4155 
4156 default: organization
4157 
4158 - `Workspace object`
4159 
4160 - `type: "workspace"`
4161 
4162 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
4163 
4164 default: workspace
4165 
4166 - `workspace_id: string`
4167 
4168 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
41254169 
41264170 - `status: "active" or "archived" or "expired" or "inactive"`
41274171 
from line 4189
41454189 
41464190 - `workspace_id: string or null`
41474191 
4148 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
4192 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
4193 
4194 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
41494195 
41504196#### Example
41514197 
from line 4217
41714217 "name": "Developer Key",
41724218 "partial_key_hint": "sk-ant-api03-R2D...igAA",
41734219 "principal": {
4174 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
4175 "type": "user"
4220 "type": "user_actor",
4221 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
4222 },
4223 "scope": {
4224 "type": "workspace",
4225 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
41764226 },
41774227 "status": "active",
41784228 "type": "api_key",
from line 4256
42064256 
42074257 - `region: optional string or null`
42084258 
4209 AWS region. Derived from kms_arn if omitted.
4259 AWS region. Derived from `kms_arn` if omitted.
42104260 
42114261 - `role_arn: optional string or null`
42124262 
from line 4288
42384288 
42394289 - `vault_uri: string`
42404290 
4241 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4291 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
42424292 
42434293 - `client_id: optional string or null`
42444294 
from line 4354
43044354 
43054355 - `region: optional string or null`
43064356 
4307 AWS region. Derived from kms_arn if omitted.
4357 AWS region. Derived from `kms_arn` if omitted.
43084358 
43094359 - `role_arn: optional string or null`
43104360 
from line 4384
43344384 
43354385 - `vault_uri: string`
43364386 
4337 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4387 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
43384388 
43394389 - `client_id: optional string or null`
43404390 
from line 4508
44584508 
44594509 - `region: optional string or null`
44604510 
4461 AWS region. Derived from kms_arn if omitted.
4511 AWS region. Derived from `kms_arn` if omitted.
44624512 
44634513 - `role_arn: optional string or null`
44644514 
from line 4538
44884538 
44894539 - `vault_uri: string`
44904540 
4491 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4541 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
44924542 
44934543 - `client_id: optional string or null`
44944544 
from line 4655
46054655 
46064656 - `region: optional string or null`
46074657 
4608 AWS region. Derived from kms_arn if omitted.
4658 AWS region. Derived from `kms_arn` if omitted.
46094659 
46104660 - `role_arn: optional string or null`
46114661 
from line 4685
46354685 
46364686 - `vault_uri: string`
46374687 
4638 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4688 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
46394689 
46404690 - `client_id: optional string or null`
46414691 
from line 4775
47254775 
47264776 - `region: optional string or null`
47274777 
4728 AWS region. Derived from kms_arn if omitted.
4778 AWS region. Derived from `kms_arn` if omitted.
47294779 
47304780 - `role_arn: optional string or null`
47314781 
from line 4807
47574807 
47584808 - `vault_uri: string`
47594809 
4760 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4810 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
47614811 
47624812 - `client_id: optional string or null`
47634813 
from line 4863
48134863 
48144864 - `region: optional string or null`
48154865 
4816 AWS region. Derived from kms_arn if omitted.
4866 AWS region. Derived from `kms_arn` if omitted.
48174867 
48184868 - `role_arn: optional string or null`
48194869 
from line 4893
48434893 
48444894 - `vault_uri: string`
48454895 
4846 Key Vault data-plane URI — https://<vault-name>.vault.azure.net or https://<hsm-name>.managedhsm.azure.net.
4896 Key Vault data-plane URI — `https://{vault-name}.vault.azure.net` or `https://{hsm-name}.managedhsm.azure.net`.
48474897 
48484898 - `client_id: optional string or null`
48494899 
from line 5325
52755325 "cache_read_input_tokens": 200,
52765326 "context_window": "0-200k",
52775327 "inference_geo": "global",
5278 "model": "claude-opus-4-6",
5328 "model": "claude-opus-5",
52795329 "output_tokens": 500,
52805330 "server_tool_use": {
52815331 "web_search_requests": 10
from line 5357
53075357 
53085358 UTC date in YYYY-MM-DD format. Returns metrics for this single day only.
53095359 
5310 pattern: ^\d{4}-\d{2}-\d{2}$
5360 pattern: ^\d{4}-\d{2}-\d{2}$, format: date
53115361 
53125362- `limit: optional number`
53135363 
from line 5561
55115561 "amount": 186,
55125562 "currency": "USD"
55135563 },
5514 "model": "claude-opus-4-8",
5564 "model": "claude-opus-5",
55155565 "tokens": {
55165566 "cache_creation": 2340,
55175567 "cache_read": 8790,
from line 5678
56285678 
56295679 End of the time bucket (exclusive) in RFC 3339 format.
56305680 
5681 format: date-time
5682 
56315683 - `results: array of object`
56325684 
56335685 List of cost items for this time bucket. There may be multiple items if one or more `group_by[]` parameters are specified.
from line 5760
57085760 - `starting_at: string`
57095761 
57105762 Start of the time bucket (inclusive) in RFC 3339 format.
5763 
5764 format: date-time
57115765 
57125766 - `has_more: boolean`
57135767 
from line 5792
57385792 "context_window": "0-200k",
57395793 "cost_type": "tokens",
57405794 "currency": "USD",
5741 "description": "Claude Sonnet 4 Usage - Input Tokens",
5795 "description": "Claude Opus 5 Usage - Input Tokens",
57425796 "inference_geo": "global",
5743 "model": "claude-opus-4-6",
5797 "model": "claude-opus-5",
57445798 "service_tier": "standard",
57455799 "token_type": "uncached_input_tokens",
57465800 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
from line 5816
57625816 
57635817Get organization-wide activity summaries for a date range.
57645818 
5765Returns one entry per day in [starting_date, ending_date). Data is
5766typically available with a 1-day lag and may be revised by a few percent
5767over the following days: when ending_date is omitted it defaults to the
5768most recent available day + 1, so the last entry covers the most recent
5769available day. The series can be scoped to an RBAC group via
5770filter[]=rbac_group_id:<id>. Available to organizations on a Claude
5771Enterprise plan. Requires an API key with the `read:analytics` scope.
5819Returns one entry per day from `starting_date` (inclusive) to `ending_date`
5820(exclusive). Data is typically available with a 1-day lag and may be
5821revised by a few percent over the following days: when `ending_date` is
5822omitted it defaults to the most recent available day + 1, so the last
5823entry covers the most recent available day. The series can be scoped to
5824an RBAC group via `filter[]=rbac_group_id:{id}`. Available to
5825organizations on a Claude Enterprise plan. Requires an API key with the
5826`read:analytics` scope.
57725827 
57735828#### Query parameters
57745829 
from line 5841
57865841 
57875842- `filter: optional array of string`
57885843 
5789 Filters as 'dimension:value'. Only rbac_group_id is supported (e.g. filter[]=rbac_group_id:<id>); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. rbac_group_id accepts the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
5844 Filters as `dimension:value`. Only `rbac_group_id` is supported (e.g. `filter[]=rbac_group_id:{id}`); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. `rbac_group_id` accepts the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
57905845 
57915846 maxItems: 100
57925847 
from line 5879
58245879 
58255880 - `ending_at: string`
58265881 
5827 End time in UTC of aggregation period (e.g. 2026-01-16T00:00:00Z)
5882 End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-16T00:00:00Z`).
5883 
5884 format: date-time
58285885 
58295886 - `monthly_active_user_count: number`
58305887 
from line 5897
58405897 
58415898 - `starting_at: string`
58425899 
5843 Start time in UTC of aggregation period (e.g. 2026-01-15T00:00:00Z)
5900 Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-15T00:00:00Z`).
5901 
5902 format: date-time
58445903 
58455904 - `weekly_active_user_count: number`
58465905 
from line 5993
59345993 "cowork_weekly_active_user_count": 0,
59355994 "daily_active_user_count": 0,
59365995 "daily_adoption_rate": 0,
5937 "ending_at": "ending_at",
5996 "ending_at": "2019-12-27T18:11:19.117Z",
59385997 "monthly_active_user_count": 0,
59395998 "monthly_adoption_rate": 0,
59405999 "pending_invite_count": 0,
5941 "starting_at": "starting_at",
6000 "starting_at": "2019-12-27T18:11:19.117Z",
59426001 "weekly_active_user_count": 0,
59436002 "weekly_adoption_rate": 0,
59446003 "chat_daily_active_user_count": 0,
from line 6104
60456104 
60466105- `limit: optional number`
60476106 
6048 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
6107 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
60496108 
60506109 minimum: 1
60516110 
from line 6118
60596118 
60606119 Opaque cursor from a previous response's `next_page` field.
60616120 
6062- `products: optional array of string`
6063 
6064 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
6121- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
6122 
6123 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
60656124 
60666125 maxItems: 100
60676126 
6127 - `"chat"`
6128 
6129 - `"claude-tag"`
6130 
6131 - `"claude_code"`
6132 
6133 - `"claude_design"`
6134 
6135 - `"claude_in_chrome"`
6136 
6137 - `"cowork"`
6138 
6139 - `"office_agent"`
6140 
60686141- `rbac_group_ids: optional array of string`
60696142 
60706143 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 6218
61456218 
61466219 - `model: string or null`
61476220 
6148 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
6221 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
61496222 
61506223 - `output_tokens: number`
61516224 
from line 6226
61536226 
61546227 - `product: string or null`
61556228 
6156 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
6229 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
61576230 
61586231 - `rbac_group_id: string or null`
61596232 
6160 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
6233 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
61616234 
61626235 - `requests: number or null`
61636236 
from line 6308
62356308 "cache_read_input_tokens": 0,
62366309 "context_window": "0-200k",
62376310 "inference_geo": "global",
6238 "model": "claude-opus-4-6",
6311 "model": "claude-opus-5",
62396312 "output_tokens": 0,
62406313 "product": "chat",
62416314 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 6457
63846457 
63856458 Opaque cursor from a previous response's `next_page` field.
63866459 
6387- `products: optional array of string`
6388 
6389 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
6460- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
6461 
6462 Product surfaces to include. Defaults to all products.
63906463 
63916464 maxItems: 100
63926465 
6466 - `"chat"`
6467 
6468 - `"claude-tag"`
6469 
6470 - `"claude_code"`
6471 
6472 - `"claude_design"`
6473 
6474 - `"claude_in_chrome"`
6475 
6476 - `"cowork"`
6477 
6478 - `"office_agent"`
6479 
63936480- `rbac_group_ids: optional array of string`
63946481 
63956482 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 6519
64326519 
64336520 - `deleted: boolean`
64346521 
6435 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
6522 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
64366523 
64376524 - `email: string or null`
64386525 
from line 6527
64406527 
64416528 - `name: string or null`
64426529 
6443 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
6530 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
64446531 
64456532 - `type: "user_actor"`
64466533 
from line 6577
64906577 
64916578 - `model: string or null`
64926579 
6493 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
6580 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
64946581 
64956582 - `output_tokens: number`
64966583 
from line 6585
64986585 
64996586 - `product: string or null`
65006587 
6501 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
6588 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
65026589 
65036590 - `rbac_group_id: string or null`
65046591 
6505 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
6592 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
65066593 
65076594 - `requests: number or null`
65086595 
from line 6623
65366623 
65376624 - `total_tokens: number`
65386625 
6539 Total token count across all token types. This is the value the default order_by='total_tokens' sorts on.
6626 Total token count across all token types. This is the value the default `order_by` (`total_tokens`) sorts on.
65406627 
65416628 - `uncached_input_tokens: number`
65426629 
from line 6676
65896676 "context_window": "0-200k",
65906677 "ending_at": "2019-12-27T18:11:19.117Z",
65916678 "inference_geo": "global",
6592 "model": "claude-opus-4-6",
6679 "model": "claude-opus-5",
65936680 "output_tokens": 891000,
65946681 "product": "chat",
65956682 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 6785
66986785 
66996786- `limit: optional number`
67006787 
6701 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
6788 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
67026789 
67036790 minimum: 1
67046791 
from line 6799
67126799 
67136800 Opaque cursor from a previous response's `next_page` field.
67146801 
6715- `products: optional array of string`
6716 
6717 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
6802- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
6803 
6804 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
67186805 
67196806 maxItems: 100
67206807 
6808 - `"chat"`
6809 
6810 - `"claude-tag"`
6811 
6812 - `"claude_code"`
6813 
6814 - `"claude_design"`
6815 
6816 - `"claude_in_chrome"`
6817 
6818 - `"cowork"`
6819 
6820 - `"office_agent"`
6821 
67216822- `rbac_group_ids: optional array of string`
67226823 
67236824 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 6907
68066907 
68076908 - `model: string or null`
68086909 
6809 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
6910 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
68106911 
68116912 - `product: string or null`
68126913 
6813 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
6914 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
68146915 
68156916 - `rbac_group_id: string or null`
68166917 
6817 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
6918 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
68186919 
68196920 - `requests: number or null`
68206921 
from line 6994
68936994 "currency": "USD",
68946995 "inference_geo": "global",
68956996 "list_amount": "list_amount",
6896 "model": "claude-opus-4-6",
6997 "model": "claude-opus-5",
68976998 "product": "chat",
68986999 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
68997000 "requests": 0,
from line 7139
70387139 
70397140 Opaque cursor from a previous response's `next_page` field.
70407141 
7041- `products: optional array of string`
7042 
7043 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
7142- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
7143 
7144 Product surfaces to include. Defaults to all products.
70447145 
70457146 maxItems: 100
70467147 
7148 - `"chat"`
7149 
7150 - `"claude-tag"`
7151 
7152 - `"claude_code"`
7153 
7154 - `"claude_design"`
7155 
7156 - `"claude_in_chrome"`
7157 
7158 - `"cowork"`
7159 
7160 - `"office_agent"`
7161 
70477162- `rbac_group_ids: optional array of string`
70487163 
70497164 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 7201
70867201 
70877202 - `deleted: boolean`
70887203 
7089 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
7204 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
70907205 
70917206 - `email: string or null`
70927207 
from line 7209
70947209 
70957210 - `name: string or null`
70967211 
7097 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
7212 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
70987213 
70997214 - `type: "user_actor"`
71007215 
from line 7267
71527267 
71537268 - `model: string or null`
71547269 
7155 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
7270 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
71567271 
71577272 - `product: string or null`
71587273 
7159 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
7274 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
71607275 
71617276 - `rbac_group_id: string or null`
71627277 
7163 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
7278 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
71647279 
71657280 - `requests: number or null`
71667281 
from line 7301
71867301 
71877302 - `token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null`
71887303 
7189 Token type when cost_type=tokens; null otherwise.
7304 Token type when `cost_type` is `tokens`; null otherwise.
71907305 
71917306 - `"cache_creation.ephemeral_1h_input_tokens"`
71927307 
from line 7359
72447359 "ending_at": "2019-12-27T18:11:19.117Z",
72457360 "inference_geo": "global",
72467361 "list_amount": "51600.000000",
7247 "model": "claude-opus-4-6",
7362 "model": "claude-opus-5",
72487363 "product": "chat",
72497364 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
72507365 "requests": 128,
from line 7385
72707385Get per-user activity for a given day, with cursor-based pagination.
72717386 
72727387Returns activity metrics for each user in the organization, sorted by email
7273address. Use group_by[] for per-RBAC-group aggregates, or filter[] to
7388address. Use `group_by[]` for per-RBAC-group aggregates, or `filter[]` to
72747389scope results to specific members, groups, or a chat project. Available
72757390to organizations on a Claude Enterprise plan. Requires an API key with
72767391the `read:analytics` scope.
from line 7400
72857400 
72867401- `ending_date: optional string`
72877402 
7288 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
7403 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
72897404 
72907405 format: date
72917406 
72927407- `filter: optional array of string`
72937408 
7294 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with group_by[] or an rbac_group_id filter); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
7409 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with `group_by[]` or an `rbac_group_id` filter); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
72957410 
72967411 maxItems: 100
72977412 
72987413- `group_by: optional array of "rbac_group_id"`
72997414 
7300 Dimensions to break results out by (e.g. group_by[]=rbac_group_id). Supported on this endpoint: rbac_group_id. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
7415 Dimensions to break results out by (e.g. `group_by[]=rbac_group_id`). Supported on this endpoint: `rbac_group_id`. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
73017416 
73027417 maxItems: 100
73037418 
from line 7424
73097424 
73107425- `order: optional "asc" or "desc"`
73117426 
7312 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
7427 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
73137428 
73147429 - `"asc"`
73157430 
from line 7436
73217436 
73227437- `page: optional string`
73237438 
7324 Opaque cursor from a previous response's next_page field.
7439 Opaque cursor from a previous response's `next_page` field.
73257440 
73267441- `starting_date: optional string`
73277442 
7328 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7443 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
73297444 
73307445 format: date
73317446 
from line 7512
73977512 
73987513 Core Claude Code activity metrics for a single user on a given day.
73997514 
7515 - `artifacts_created_count: number`
7516 
7517 Number of artifacts created in Claude Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
7518 
74007519 - `commit_count: number`
74017520 
74027521 Number of commits made via Claude Code
from line 7576
74577576 
74587577 Number of tool actions completed in Cowork sessions
74597578 
7579 - `artifacts_created_count: number`
7580 
7581 Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
7582 
74607583 - `connectors_used_count: number`
74617584 
74627585 Total number of connector invocations in Cowork sessions
from line 7738
76157738 
76167739 - `last_activity_date: optional string or null`
76177740 
7618 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day in [starting_date, ending_date) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id` it is the last day the user was active while a member of that group, consistent with the row's other metrics. Null on grouped (`group_by[]`) rows. Omitted from the response while last-activity reporting is not enabled for this organization.
7741 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested `date` in single-day mode, and to the latest active day from `starting_date` (inclusive) to `ending_date` (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id:{id}` it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (`group_by[]`) rows it is the latest day any member of the group was active (the requested `date` in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.
7742 
7743 format: date
76197744 
76207745 - `rbac_group_id: optional string or null`
76217746 
from line 7752
76277752 
76287753 - `user: optional AnalyticsUser or null`
76297754 
7630 User identifier.
7755 A user in the organization, identified by tagged id and email address.
76317756 
76327757 - `id: string`
76337758 
from line 7762
76377762 
76387763 Email address of the user
76397764 
7640 - `type: optional "user"`
7765 - `type: "user"`
76417766 
76427767 Object type. Always `user`.
76437768 
from line 7802
76777802 },
76787803 "claude_code_metrics": {
76797804 "core_metrics": {
7805 "artifacts_created_count": 0,
76807806 "commit_count": 0,
76817807 "distinct_session_count": 0,
76827808 "lines_of_code": {
from line 7832
77067832 },
77077833 "cowork_metrics": {
77087834 "action_count": 0,
7835 "artifacts_created_count": 0,
77097836 "connectors_used_count": 0,
77107837 "dispatch_turn_count": 0,
77117838 "distinct_connectors_used_count": 0,
from line 7898
77717898 },
77727899 "web_search_count": 0,
77737900 "distinct_user_count": 0,
7774 "last_activity_date": "last_activity_date",
7901 "last_activity_date": "2019-12-27",
77757902 "rbac_group_id": "rbac_group_id",
77767903 "rbac_group_name": "rbac_group_name",
77777904 "user": {
from line 7921
77947921Get per-skill usage for a given day, with cursor-based pagination.
77957922 
77967923Returns skill usage metrics for the organization, sorted by skill name.
7797Use group_by[] to break usage out per member, per RBAC group, or per
7798product surface, and filter[] to scope results; the parameter
7924Use `group_by[]` to break usage out per member, per RBAC group, or per
7925product surface, and `filter[]` to scope results; the parameter
77997926descriptions list the supported dimensions. Available to organizations
78007927on a Claude Enterprise plan. Requires an API key with the
78017928`read:analytics` scope.
from line 7937
78107937 
78117938- `ending_date: optional string`
78127939 
7813 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
7940 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
78147941 
78157942 format: date
78167943 
78177944- `filter: optional array of string`
78187945 
7819 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: product, rbac_group_id, share_status, skill_name, user_id. Value forms: product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); share_status is one of organization, private, or public; skill_name matches case-insensitively; user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
7946 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `product`, `rbac_group_id`, `share_status`, `skill_name`, `user_id`. Value forms: `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `share_status` is one of `organization`, `private`, or `public`; `skill_name` matches case-insensitively; `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
78207947 
78217948 maxItems: 100
78227949 
78237950- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
78247951 
7825 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
7952 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
78267953 
78277954 maxItems: 100
78287955 
from line 7967
78407967 
78417968- `order: optional "asc" or "desc"`
78427969 
7843 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
7970 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
78447971 
78457972 - `"asc"`
78467973 
from line 7979
78527979 
78537980- `page: optional string`
78547981 
7855 Opaque cursor from a previous response's next_page field.
7982 Opaque cursor from a previous response's `next_page` field.
78567983 
78577984- `starting_date: optional string`
78587985 
7859 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7986 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
78607987 
78617988 format: date
78627989 
from line 8053
79268053 
79278054 - `attributed_list_price: optional string or null`
79288055 
7929 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that INVOLVED the skill, not the skill's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does NOT tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
8056 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the skill, not the skill's incremental cost. Unlike `estimated_overage_spend` this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on `chat` product rows and on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as `estimated_overage_spend` (spend reporting not enabled for this organization, `office_agent` product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
79308057 
79318058 - `currency: optional "USD" or null`
79328059 
7933 Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
8060 Currency for this row's monetary fields (`estimated_overage_spend` and `attributed_list_price`), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
79348061 
79358062 - `enable_count: optional number or null`
79368063 
7937 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).
8064 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin `install_count`). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (`starting_date`/`ending_date`).
79388065 
79398066 - `estimated_overage_spend: optional string or null`
79408067 
7941 Estimated OVERAGE spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that INVOLVED the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
8068 Estimated overage spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see `attributed_list_price` for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (`starting_date`/`ending_date`) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
79428069 
79438070 - `invocation_count: optional number or null`
79448071 
7945 Total number of times this skill was invoked on the requested day (the skill analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.
8072 Total number of times this skill was invoked on the requested day (the skill analog of plugin `invocation_count`). Unlike `distinct_user_count` — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (`starting_date`/`ending_date`) returns this sum directly.
79468073 
79478074 - `product: optional string or null`
79488075 
7949 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
8076 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
79508077 
79518078 - `rbac_group_id: optional string or null`
79528079 
from line 8083
79568083 
79578084 Resolved RBAC group display name, alongside `rbac_group_id` when name resolution is available. Null if the group has been deleted or its name could not be resolved; `rbac_group_id` remains the stable key.
79588085 
7959 - `share_status: optional string or null`
7960 
7961 Skill share status (claude.ai only): one of 'private', 'organization', or 'public'. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:<value>`.
8086 - `share_status: optional "organization" or "private" or "public" or null`
8087 
8088 Skill share status (claude.ai only): one of `private`, `organization`, or `public`. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:{value}`.
8089 
8090 - `"organization"`
8091 
8092 - `"private"`
8093 
8094 - `"public"`
79628095 
79638096 - `skill_display_name: optional string or null`
79648097 
7965 Human-readable display name for rows whose skill_name is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when skill_name is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
8098 Human-readable display name for rows whose `skill_name` is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when `skill_name` is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
79668099 
79678100 - `user_id: optional string or null`
79688101 
from line 8152
80198152 "product": "product",
80208153 "rbac_group_id": "rbac_group_id",
80218154 "rbac_group_name": "rbac_group_name",
8022 "share_status": "share_status",
8155 "share_status": "organization",
80238156 "skill_display_name": "skill_display_name",
80248157 "user_id": "user_id"
80258158 }
from line 8172
80398172Returns connector usage metrics for the organization, sorted by connector
80408173name. Connector names are normalized from their various sources — for
80418174example, "Atlassian MCP server" and "mcp-atlassian" both appear as
8042"atlassian". Use group_by[] to break usage out per member, per RBAC
8043group, or per product surface, and filter[] to scope results; the
8175"atlassian". Use `group_by[]` to break usage out per member, per RBAC
8176group, or per product surface, and `filter[]` to scope results; the
80448177parameter descriptions list the supported dimensions. Available to
80458178organizations on a Claude Enterprise plan. Requires an API key with the
80468179`read:analytics` scope.
from line 8188
80558188 
80568189- `ending_date: optional string`
80578190 
8058 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
8191 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
80598192 
80608193 format: date
80618194 
80628195- `filter: optional array of string`
80638196 
8064 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: connector_name, product, rbac_group_id, user_id. Value forms: connector_name matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose connector_name is an opaque connector id the connector's display name (connector_display_name) also matches; product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
8197 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `connector_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `connector_name` matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose `connector_name` is an opaque connector id the connector's display name (`connector_display_name`) also matches; `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
80658198 
80668199 maxItems: 100
80678200 
80688201- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
80698202 
8070 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
8203 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
80718204 
80728205 maxItems: 100
80738206 
from line 8218
80858218 
80868219- `order: optional "asc" or "desc"`
80878220 
8088 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
8221 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
80898222 
80908223 - `"asc"`
80918224 
from line 8230
80978230 
80988231- `page: optional string`
80998232 
8100 Opaque cursor from a previous response's next_page field.
8233 Opaque cursor from a previous response's `next_page` field.
81018234 
81028235- `starting_date: optional string`
81038236 
8104 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
8237 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
81058238 
81068239 format: date
81078240 
from line 8264
81318264 
81328265 - `connector_name: string`
81338266 
8134 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.
8267 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; `connector_display_name` holds the resolved name for those rows.
81358268 
81368269 - `cowork_metrics: object`
81378270 
from line 8304
81718304 
81728305 - `connector_display_name: optional string or null`
81738306 
8174 Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:<value> also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
8307 Human-readable display name for rows whose `connector_name` is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). `connector_name` remains the row's stable key for sorting and pagination, and `filter[]=connector_name:{value}` also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable `connector_name`. Null when `connector_name` is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
81758308 
81768309 - `individual_auth_distinct_user_count: optional number or null`
81778310 
8178 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
8311 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to `managed_auth_distinct_user_count`, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
81798312 
81808313 - `managed_auth_distinct_user_count: optional number or null`
81818314 
8182 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
8315 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on `user_id` and `rbac_group_id` cuts — attributed to the user the credential was provisioned for — but never on a cut that references `product` (group or filter). Date-range rollup mode (`starting_date`/`ending_date`) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
81838316 
81848317 - `product: optional string or null`
81858318 
8186 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
8319 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
81878320 
81888321 - `rbac_group_id: optional string or null`
81898322 
from line 8328
81958328 
81968329 - `read_call_count: optional number or null`
81978330 
8198 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.
8331 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of `read_call_count`, `write_call_count`, or `unclassified_call_count`, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in `unclassified_call_count`). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (`starting_date`/`ending_date`) applies both rules server-side.
81998332 
82008333 - `unclassified_call_count: optional number or null`
82018334 
8202 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
8335 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
82038336 
82048337 - `user_id: optional string or null`
82058338 
from line 8340
82078340 
82088341 - `write_call_count: optional number or null`
82098342 
8210 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
8343 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
82118344 
82128345 - `next_page: string or null`
82138346 
from line 8410
82778410Get per-project activity for a given day, with cursor-based pagination.
82788411 
82798412Returns activity metrics for each project in the organization, sorted by
8280project ID. Use group_by[] to break projects out per member or per RBAC
8281group, and filter[] to scope results; the parameter descriptions list the
8413project ID. Use `group_by[]` to break projects out per member or per RBAC
8414group, and `filter[]` to scope results; the parameter descriptions list the
82828415supported dimensions. Available to organizations on a Claude Enterprise
82838416plan. Requires an API key with the `read:analytics` scope.
82848417 
from line 8425
82928425 
82938426- `ending_date: optional string`
82948427 
8295 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
8428 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
82968429 
82978430 format: date
82988431 
82998432- `filter: optional array of string`
83008433 
8301 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
8434 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
83028435 
83038436 maxItems: 100
83048437 
83058438- `group_by: optional array of "rbac_group_id" or "user_id"`
83068439 
8307 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
8440 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
83088441 
83098442 maxItems: 100
83108443 
from line 8453
83208453 
83218454- `order: optional "asc" or "desc"`
83228455 
8323 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
8456 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
83248457 
83258458 - `"asc"`
83268459 
from line 8465
83328465 
83338466- `page: optional string`
83348467 
8335 Opaque cursor from a previous response's next_page field.
8468 Opaque cursor from a previous response's `next_page` field.
83368469 
83378470- `starting_date: optional string`
83388471 
8339 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
8472 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
83408473 
83418474 format: date
83428475 
from line 8491
83588491 
83598492 - `project_id: string`
83608493 
8361 Tagged project identifier (e.g. claude_proj_...)
8494 Tagged project identifier (e.g. `claude_proj_...`)
83628495 
83638496 - `project_name: string`
83648497 
from line 8499
83668499 
83678500 - `created_at: optional string or null`
83688501 
8369 Project creation timestamp, RFC 3339. Null if the project was deleted before attribution was recorded.
8502 Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.
8503 
8504 format: date-time
83708505 
83718506 - `created_by: optional AnalyticsUser or null`
83728507 
8373 User identifier.
8508 A user in the organization, identified by tagged id and email address.
83748509 
83758510 - `id: string`
83768511 
from line 8515
83808515 
83818516 Email address of the user
83828517 
8383 - `type: optional "user"`
8518 - `type: "user"`
83848519 
83858520 Object type. Always `user`.
83868521 
from line 8527
83928527 
83938528 - `product: optional string or null`
83948529 
8395 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
8530 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
83968531 
83978532 - `rbac_group_id: optional string or null`
83988533 
from line 8563
84288563 "message_count": 0,
84298564 "project_id": "project_id",
84308565 "project_name": "project_name",
8431 "created_at": "created_at",
8566 "created_at": "2019-12-27T18:11:19.117Z",
84328567 "created_by": {
84338568 "id": "id",
84348569 "email_address": "email_address",
from line 8593
84588593an aggregate bucket, not a plugin: it collects plugin activity, from
84598594either surface, for which the reporting client did not provide a plugin
84608595name — so an organization's own plugins can contribute both to their own
8461named rows and to this bucket. Use group_by[] to break usage out per
8596named rows and to this bucket. Use `group_by[]` to break usage out per
84628597member, per RBAC group, or per product surface (Cowork / Claude Code),
8463and filter[] to scope results; the parameter descriptions list the
8598and `filter[]` to scope results; the parameter descriptions list the
84648599supported dimensions. Requires an API key with the
84658600`read:analytics` scope. `starting_date` / `ending_date` select
8466range-rollup mode like /skills.
8601range-rollup mode like `/skills`.
84678602 
84688603#### Query parameters
84698604 
from line 8610
84758610 
84768611- `ending_date: optional string`
84778612 
8478 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
8613 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
84798614 
84808615 format: date
84818616 
84828617- `filter: optional array of string`
84838618 
8484 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: plugin_name, product, rbac_group_id, user_id. Value forms: plugin_name matches case-insensitively; product is claude_code or cowork (the only surfaces with plugin attribution); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
8619 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `plugin_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `plugin_name` matches case-insensitively; `product` is `claude_code` or `cowork` (the only surfaces with plugin attribution); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
84858620 
84868621 maxItems: 100
84878622 
84888623- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
84898624 
8490 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. On this endpoint product takes the values claude_code or cowork only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
8625 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. On this endpoint `product` takes the values `claude_code` or `cowork` only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
84918626 
84928627 maxItems: 100
84938628 
from line 8640
85058640 
85068641- `order: optional "asc" or "desc"`
85078642 
8508 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
8643 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
85098644 
85108645 - `"asc"`
85118646 
from line 8652
85178652 
85188653- `page: optional string`
85198654 
8520 Opaque cursor from a previous response's next_page field.
8655 Opaque cursor from a previous response's `next_page` field.
85218656 
85228657- `starting_date: optional string`
85238658 
8524 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
8659 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
85258660 
85268661 format: date
85278662 
from line 8702
85678702 
85688703 - `plugin_id: optional string or null`
85698704 
8570 Stable plugin identifier when available (e.g. serena@claude-plugins-official). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
8705 Stable plugin identifier when available (e.g. `serena@claude-plugins-official`). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
85718706 
85728707 - `product: optional string or null`
85738708 
8574 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
8709 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
85758710 
85768711 - `rbac_group_id: optional string or null`
85778712 
from line 8767
86328767 
86338768Get artifact-creation activity for a given day, broken out by MIME type.
86348769 
8635Returns the full (artifact_type, is_shared) cube for the organization;
8770Returns the full (`artifact_type`, `is_shared`) cube for the organization;
86368771`next_page` is null except for grouped queries, which paginate. The cube
8637can be broken out per member or per RBAC group via group_by[], and scoped
8638via filter[]. Requires an API key with the `read:analytics` scope.
8772can be broken out per product, per member, or per RBAC group via
8773`group_by[]`, and scoped via `filter[]`. Requires an API key with the
8774`read:analytics` scope.
86398775 
86408776#### Query parameters
86418777 
from line 8783
86478783 
86488784- `filter: optional array of string`
86498785 
8650 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: artifact_type, is_shared, rbac_group_id, user_id. Value forms: artifact_type is a canonical artifact MIME type (e.g. text/markdown) or 'other'; is_shared is 'true' or 'false'; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
8786 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `artifact_type`, `is_shared`, `product`, `rbac_group_id`, `user_id`. Value forms: `artifact_type` is a canonical artifact MIME type (e.g. `text/markdown`) or `other`; `is_shared` is `true` or `false`; `product` is `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
86518787 
86528788 maxItems: 100
86538789 
8654- `group_by: optional array of "rbac_group_id" or "user_id"`
8655 
8656 Dimensions to break results out by: user_id and/or rbac_group_id. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via next_page. rbac_group_id attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
8790- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
8791 
8792 Dimensions to break results out by: `product`, `user_id` and/or `rbac_group_id`. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via `next_page`. `product` takes the values `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts). `rbac_group_id` attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
86578793 
86588794 maxItems: 100
86598795 
8796 - `"product"`
8797 
86608798 - `"rbac_group_id"`
86618799 
86628800 - `"user_id"`
86638801 
86648802- `limit: optional number`
86658803 
8666 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; limit is the page size only when group_by[] multiplies the cube.
8804 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; `limit` is the page size only when `group_by[]` multiplies the cube.
86678805 
86688806 minimum: 1, maximum: 1000
86698807 
86708808- `page: optional string`
86718809 
8672 Opaque cursor from a previous response's next_page field. Only valid with group_by[] — the ungrouped cube is never paginated.
8810 Opaque cursor from a previous response's `next_page` field. Only valid with `group_by[]` — the ungrouped cube is never paginated.
86738811 
86748812#### Returns
86758813 
from line 8816
86788816 Response for GET /v1/organizations/analytics/artifacts.
86798817 
86808818 `next_page` is null on ungrouped queries — the artifact-type cube is
8681 finite and returned in full. Grouped queries (`group_by[]` on `user_id` /
8682 `rbac_group_id`) multiply the cube and paginate like the other analytics
8683 list endpoints.
8819 finite and returned in full. Grouped queries (`group_by[]` on `product` /
8820 `user_id` / `rbac_group_id`) multiply the cube and paginate like the other
8821 analytics list endpoints.
86848822 
86858823 - `data: array of object`
86868824 
86878825 - `artifact_type: string`
86888826 
8689 Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or 'other'.
8827 Canonical artifact MIME type (e.g. `text/markdown`, `application/vnd.ant.react`, `image/svg+xml`), or `other`. Claude Code and Cowork artifacts report as `text/html`.
86908828 
86918829 - `artifacts_created_count: number`
86928830 
from line 8836
86988836 
86998837 - `is_shared: boolean`
87008838 
8701 Whether the artifacts in this bucket have ever been shared.
8839 Whether the artifacts in this bucket have ever been shared (a Claude Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).
87028840 
87038841 - `published_artifacts_created_count: number`
87048842 
8705 Number of those artifacts that have been published
8843 Number of those artifacts that have been published (for Claude Code / Cowork artifacts: open to anyone with the link); never exceeds `artifacts_created_count`
87068844 
87078845 - `product: optional string or null`
87088846 
8709 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
8847 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
87108848 
87118849 - `rbac_group_id: optional string or null`
87128850 
from line 8858
87208858 
87218859 Tagged user identifier (e.g. `user_...`). Present only when the request grouped by `user_id`.
87228860 
8723 - `next_page: optional string or null`
8861 - `next_page: string or null`
87248862 
87258863 Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.
87268864 
from line 8911
87738911 
87748912- `scope: object`
87758913 
8914 Scope selecting a single member of the organization.
8915 
87768916 - `type: "user"`
87778917 
8918 Scope type. Always `user` for this scope.
8919 
87788920 default: user
87798921 
87808922 - `user_id: string`
87818923 
8924 Tagged ID of the member the spend limit applies to.
8925 
87828926- `period: optional "daily" or "monthly" or "weekly"`
87838927 
87848928 - `"daily"`
from line 8935
87918935 
87928936- `SpendLimit object`
87938937 
8938 A configured spend limit: a cap on metered spend for one scope and period.
8939 
87948940 - `id: string`
87958941 
8942 Unique tagged ID of the spend limit (`spl_...`).
8943 
87968944 - `amount: string or null`
87978945 
87988946 Limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD): "50000" is $500.00. `null` means no numeric cap is configured at this scope — see the effective report for whether a limit applies.
87998947 
88008948 - `created_at: string`
88018949 
8950 RFC 3339 datetime at which the spend limit was created.
8951 
88028952 format: date-time
88038953 
88048954 - `currency: string`
from line 8957
88078957 
88088958 - `period: "daily" or "monthly" or "weekly"`
88098959 
8960 Length of the window the limit resets over. `amount` caps spend within each period.
8961 
88108962 - `"daily"`
88118963 
88128964 - `"monthly"`
from line 8967
88158967 
88168968 - `scope: object or object or object or 2 more`
88178969 
8970 What the limit applies to. A tagged union on `type`; each variant carries the identifier for its scope.
8971 
88188972 - `User object`
88198973 
8974 Scope selecting a single member of the organization.
8975 
88208976 - `type: "user"`
88218977 
8978 Scope type. Always `user` for this scope.
8979 
88228980 default: user
88238981 
88248982 - `user_id: string`
88258983 
8984 Tagged ID of the member the spend limit applies to.
8985 
88268986 - `SeatTier object`
88278987 
88288988 - `seat_tier: string`
from line 9015
88559015 
88569016 - `type: "spend_limit"`
88579017 
9018 Object type. Always `spend_limit`.
9019 
88589020 default: spend_limit
88599021 
88609022 - `updated_at: string`
9023 
9024 RFC 3339 datetime at which the spend limit was last modified.
88619025 
88629026 format: date-time
88639027 
from line 9036
88729036 "amount": "50000",
88739037 "scope": {
88749038 "type": "user",
8875 "user_id": "user_id"
9039 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
88769040 },
88779041 "period": "monthly"
88789042 }'
from line 9053
88899053 "period": "monthly",
88909054 "scope": {
88919055 "type": "user",
8892 "user_id": "user_id"
9056 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
88939057 },
88949058 "type": "spend_limit",
88959059 "updated_at": "2019-12-27T18:11:19.117Z"
from line 9076
89129076 
89139077- `SpendLimit object`
89149078 
9079 A configured spend limit: a cap on metered spend for one scope and period.
9080 
89159081 - `id: string`
89169082 
9083 Unique tagged ID of the spend limit (`spl_...`).
9084 
89179085 - `amount: string or null`
89189086 
89199087 Limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD): "50000" is $500.00. `null` means no numeric cap is configured at this scope — see the effective report for whether a limit applies.
89209088 
89219089 - `created_at: string`
89229090 
9091 RFC 3339 datetime at which the spend limit was created.
9092 
89239093 format: date-time
89249094 
89259095 - `currency: string`
from line 9098
89289098 
89299099 - `period: "daily" or "monthly" or "weekly"`
89309100 
9101 Length of the window the limit resets over. `amount` caps spend within each period.
9102 
89319103 - `"daily"`
89329104 
89339105 - `"monthly"`
from line 9108
89369108 
89379109 - `scope: object or object or object or 2 more`
89389110 
9111 What the limit applies to. A tagged union on `type`; each variant carries the identifier for its scope.
9112 
89399113 - `User object`
89409114 
9115 Scope selecting a single member of the organization.
9116 
89419117 - `type: "user"`
89429118 
9119 Scope type. Always `user` for this scope.
9120 
89439121 default: user
89449122 
89459123 - `user_id: string`
89469124 
9125 Tagged ID of the member the spend limit applies to.
9126 
89479127 - `SeatTier object`
89489128 
89499129 - `seat_tier: string`
from line 9156
89769156 
89779157 - `type: "spend_limit"`
89789158 
9159 Object type. Always `spend_limit`.
9160 
89799161 default: spend_limit
89809162 
89819163 - `updated_at: string`
9164 
9165 RFC 3339 datetime at which the spend limit was last modified.
89829166 
89839167 format: date-time
89849168 
from line 9185
90019185 "period": "monthly",
90029186 "scope": {
90039187 "type": "user",
9004 "user_id": "user_id"
9188 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
90059189 },
90069190 "type": "spend_limit",
90079191 "updated_at": "2019-12-27T18:11:19.117Z"
from line 9248
90649248 
90659249- `limit: optional number`
90669250 
9251 Maximum number of members per page. A member's period rows never split across pages, so a page may carry more rows than this. Defaults to `20`.
9252 
90679253 default: 20, maximum: 1000, minimum: 1
90689254 
90699255- `page: optional string`
90709256 
9071- `period: optional array of string`
9257 Opaque cursor from a previous response's `next_page` field.
9258 
9259- `period: optional array of "daily" or "monthly" or "weekly"`
9260 
9261 Restrict the report to these limit periods. Omit to return one row per period each member resolves a spend limit for.
90729262 
90739263 maxItems: 3
90749264 
9265 - `"daily"`
9266 
9267 - `"monthly"`
9268 
9269 - `"weekly"`
9270 
90759271- `user_ids: optional array of string`
9272 
9273 Restrict the report to these members, by tagged user ID (`user_...`). At most 100 entries.
90769274 
90779275 maxItems: 100
90789276 
from line 9286
90889286 
90899287 - `deleted: boolean`
90909288 
9289 True only when the underlying account has been deleted.
9290 
90919291 default: false
90929292 
90939293 - `email_address: string or null`
90949294 
9295 The user's email address. Null when the account is unavailable or has been deleted.
9296 
90959297 - `name: string or null`
90969298 
9299 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9300 
90979301 - `type: "user_actor"`
90989302 
9303 Actor type. Always `user_actor`.
9304 
90999305 default: user_actor
91009306 
91019307 - `user_id: string`
91029308 
9309 Tagged ID of the user.
9310 
91039311 - `amount: string or null`
91049312 
91059313 Effective limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD). `null` means no limit applies for this row's `period` — each period resolves independently, so another period may still cap this member.
from line 9318
91109318 
91119319 - `period: "daily" or "monthly" or "weekly"`
91129320 
9321 Period this row's effective limit and spend are reported for.
9322 
91139323 - `"daily"`
91149324 
91159325 - `"monthly"`
from line 9332
91229332 
91239333 - `scope: object`
91249334 
9335 Scope selecting a single member of the organization.
9336 
91259337 - `type: "user"`
91269338 
9339 Scope type. Always `user` for this scope.
9340 
91279341 default: user
91289342 
91299343 - `user_id: string`
91309344 
9345 Tagged ID of the member the spend limit applies to.
9346 
91319347 - `source: object or object or object or 2 more`
91329348 
9349 Scope selecting a single member of the organization.
9350 
91339351 - `User object`
91349352 
9353 Scope selecting a single member of the organization.
9354 
91359355 - `type: "user"`
91369356 
9357 Scope type. Always `user` for this scope.
9358 
91379359 default: user
91389360 
91399361 - `user_id: string`
9362 
9363 Tagged ID of the member the spend limit applies to.
91409364 
91419365 - `SeatTier object`
91429366 
from line 9415
91919415 "email_address": "email_address",
91929416 "name": "name",
91939417 "type": "user_actor",
9194 "user_id": "user_id"
9418 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
91959419 },
91969420 "amount": "50000",
91979421 "currency": "USD",
from line 9423
91999423 "period_to_date_spend": "12050.5",
92009424 "scope": {
92019425 "type": "user",
9202 "user_id": "user_id"
9426 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
92039427 },
92049428 "source": {
92059429 "type": "user",
9206 "user_id": "user_id"
9430 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
92079431 },
92089432 "spend_limit_id": "spend_limit_id"
92099433 }
from line 9485
92619485 
92629486 - `deleted: boolean`
92639487 
9488 True only when the underlying account has been deleted.
9489 
92649490 default: false
92659491 
92669492 - `email_address: string or null`
92679493 
9494 The user's email address. Null when the account is unavailable or has been deleted.
9495 
92689496 - `name: string or null`
92699497 
9498 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9499 
92709500 - `type: "user_actor"`
92719501 
9502 Actor type. Always `user_actor`.
9503 
92729504 default: user_actor
92739505 
92749506 - `user_id: string`
9507 
9508 Tagged ID of the user.
92759509 
92769510 - `created_at: string`
92779511 
from line 9537
93039537 
93049538 - `deleted: boolean`
93059539 
9540 True only when the underlying account has been deleted.
9541 
93069542 default: false
93079543 
93089544 - `email_address: string or null`
93099545 
9546 The user's email address. Null when the account is unavailable or has been deleted.
9547 
93109548 - `name: string or null`
93119549 
9550 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9551 
93129552 - `type: "user_actor"`
93139553 
9554 Actor type. Always `user_actor`.
9555 
93149556 default: user_actor
93159557 
93169558 - `user_id: string`
93179559 
9560 Tagged ID of the user.
9561 
93189562 - `ScopedAPIKeyActor object`
93199563 
93209564 A scoped Admin API key acting on behalf of the organization.
from line 9571
93279571 
93289572 - `spend_summary: SpendSummary or null`
93299573 
9330 Per-member effective-limit report row (GET /spend_limits/effective).
9574 Per-member effective-limit report row (`GET /spend_limits/effective`).
93319575 
93329576 - `actor: object`
93339577 
from line 9581
93379581 
93389582 - `deleted: boolean`
93399583 
9584 True only when the underlying account has been deleted.
9585 
93409586 default: false
93419587 
93429588 - `email_address: string or null`
93439589 
9590 The user's email address. Null when the account is unavailable or has been deleted.
9591 
93449592 - `name: string or null`
93459593 
9594 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9595 
93469596 - `type: "user_actor"`
93479597 
9598 Actor type. Always `user_actor`.
9599 
93489600 default: user_actor
93499601 
93509602 - `user_id: string`
93519603 
9604 Tagged ID of the user.
9605 
93529606 - `amount: string or null`
93539607 
93549608 Effective limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD). `null` means no limit applies for this row's `period` — each period resolves independently, so another period may still cap this member.
from line 9613
93599613 
93609614 - `period: "daily" or "monthly" or "weekly"`
93619615 
9616 Period this row's effective limit and spend are reported for.
9617 
93629618 - `"daily"`
93639619 
93649620 - `"monthly"`
from line 9627
93719627 
93729628 - `scope: object`
93739629 
9630 Scope selecting a single member of the organization.
9631 
93749632 - `type: "user"`
93759633 
9634 Scope type. Always `user` for this scope.
9635 
93769636 default: user
93779637 
93789638 - `user_id: string`
93799639 
9640 Tagged ID of the member the spend limit applies to.
9641 
93809642 - `source: object or object or object or 2 more`
93819643 
9644 Scope selecting a single member of the organization.
9645 
93829646 - `User object`
93839647 
9648 Scope selecting a single member of the organization.
9649 
93849650 - `type: "user"`
93859651 
9652 Scope type. Always `user` for this scope.
9653 
93869654 default: user
93879655 
93889656 - `user_id: string`
9657 
9658 Tagged ID of the member the spend limit applies to.
93899659 
93909660 - `SeatTier object`
93919661 
from line 9723
94539723 "email_address": "email_address",
94549724 "name": "name",
94559725 "type": "user_actor",
9456 "user_id": "user_id"
9726 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
94579727 },
94589728 "created_at": "2019-12-27T18:11:19.117Z",
94599729 "period": "monthly",
from line 9733
94639733 "email_address": "email_address",
94649734 "name": "name",
94659735 "type": "user_actor",
9466 "user_id": "user_id"
9736 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
94679737 },
94689738 "spend_summary": {
94699739 "actor": {
from line 9741
94719741 "email_address": "email_address",
94729742 "name": "name",
94739743 "type": "user_actor",
9474 "user_id": "user_id"
9744 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
94759745 },
94769746 "amount": "50000",
94779747 "currency": "USD",
from line 9749
94799749 "period_to_date_spend": "12050.5",
94809750 "scope": {
94819751 "type": "user",
9482 "user_id": "user_id"
9752 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
94839753 },
94849754 "source": {
94859755 "type": "user",
9486 "user_id": "user_id"
9756 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
94879757 },
94889758 "spend_limit_id": "spend_limit_id"
94899759 },
from line 9794
95249794 
95259795 - `deleted: boolean`
95269796 
9797 True only when the underlying account has been deleted.
9798 
95279799 default: false
95289800 
95299801 - `email_address: string or null`
95309802 
9803 The user's email address. Null when the account is unavailable or has been deleted.
9804 
95319805 - `name: string or null`
95329806 
9807 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9808 
95339809 - `type: "user_actor"`
95349810 
9811 Actor type. Always `user_actor`.
9812 
95359813 default: user_actor
95369814 
95379815 - `user_id: string`
9816 
9817 Tagged ID of the user.
95389818 
95399819 - `created_at: string`
95409820 
from line 9846
95669846 
95679847 - `deleted: boolean`
95689848 
9849 True only when the underlying account has been deleted.
9850 
95699851 default: false
95709852 
95719853 - `email_address: string or null`
95729854 
9855 The user's email address. Null when the account is unavailable or has been deleted.
9856 
95739857 - `name: string or null`
95749858 
9859 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9860 
95759861 - `type: "user_actor"`
95769862 
9863 Actor type. Always `user_actor`.
9864 
95779865 default: user_actor
95789866 
95799867 - `user_id: string`
95809868 
9869 Tagged ID of the user.
9870 
95819871 - `ScopedAPIKeyActor object`
95829872 
95839873 A scoped Admin API key acting on behalf of the organization.
from line 9880
95909880 
95919881 - `spend_summary: SpendSummary or null`
95929882 
9593 Per-member effective-limit report row (GET /spend_limits/effective).
9883 Per-member effective-limit report row (`GET /spend_limits/effective`).
95949884 
95959885 - `actor: object`
95969886 
from line 9890
96009890 
96019891 - `deleted: boolean`
96029892 
9893 True only when the underlying account has been deleted.
9894 
96039895 default: false
96049896 
96059897 - `email_address: string or null`
96069898 
9899 The user's email address. Null when the account is unavailable or has been deleted.
9900 
96079901 - `name: string or null`
96089902 
9903 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
9904 
96099905 - `type: "user_actor"`
96109906 
9907 Actor type. Always `user_actor`.
9908 
96119909 default: user_actor
96129910 
96139911 - `user_id: string`
96149912 
9913 Tagged ID of the user.
9914 
96159915 - `amount: string or null`
96169916 
96179917 Effective limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD). `null` means no limit applies for this row's `period` — each period resolves independently, so another period may still cap this member.
from line 9922
96229922 
96239923 - `period: "daily" or "monthly" or "weekly"`
96249924 
9925 Period this row's effective limit and spend are reported for.
9926 
96259927 - `"daily"`
96269928 
96279929 - `"monthly"`
from line 9936
96349936 
96359937 - `scope: object`
96369938 
9939 Scope selecting a single member of the organization.
9940 
96379941 - `type: "user"`
96389942 
9943 Scope type. Always `user` for this scope.
9944 
96399945 default: user
96409946 
96419947 - `user_id: string`
96429948 
9949 Tagged ID of the member the spend limit applies to.
9950 
96439951 - `source: object or object or object or 2 more`
96449952 
9953 Scope selecting a single member of the organization.
9954 
96459955 - `User object`
96469956 
9957 Scope selecting a single member of the organization.
9958 
96479959 - `type: "user"`
96489960 
9961 Scope type. Always `user` for this scope.
9962 
96499963 default: user
96509964 
96519965 - `user_id: string`
9966 
9967 Tagged ID of the member the spend limit applies to.
96529968 
96539969 - `SeatTier object`
96549970 
from line 10028
971210028 "email_address": "email_address",
971310029 "name": "name",
971410030 "type": "user_actor",
9715 "user_id": "user_id"
10031 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
971610032 },
971710033 "created_at": "2019-12-27T18:11:19.117Z",
971810034 "period": "monthly",
from line 10038
972210038 "email_address": "email_address",
972310039 "name": "name",
972410040 "type": "user_actor",
9725 "user_id": "user_id"
10041 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
972610042 },
972710043 "spend_summary": {
972810044 "actor": {
from line 10046
973010046 "email_address": "email_address",
973110047 "name": "name",
973210048 "type": "user_actor",
9733 "user_id": "user_id"
10049 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
973410050 },
973510051 "amount": "50000",
973610052 "currency": "USD",
from line 10054
973810054 "period_to_date_spend": "12050.5",
973910055 "scope": {
974010056 "type": "user",
9741 "user_id": "user_id"
10057 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
974210058 },
974310059 "source": {
974410060 "type": "user",
9745 "user_id": "user_id"
10061 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
974610062 },
974710063 "spend_limit_id": "spend_limit_id"
974810064 },
from line 10112
979610112 
979710113 - `deleted: boolean`
979810114 
10115 True only when the underlying account has been deleted.
10116 
979910117 default: false
980010118 
980110119 - `email_address: string or null`
980210120 
10121 The user's email address. Null when the account is unavailable or has been deleted.
10122 
980310123 - `name: string or null`
980410124 
10125 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10126 
980510127 - `type: "user_actor"`
980610128 
10129 Actor type. Always `user_actor`.
10130 
980710131 default: user_actor
980810132 
980910133 - `user_id: string`
10134 
10135 Tagged ID of the user.
981010136 
981110137- `created_at: string`
981210138 
from line 10164
983810164 
983910165 - `deleted: boolean`
984010166 
10167 True only when the underlying account has been deleted.
10168 
984110169 default: false
984210170 
984310171 - `email_address: string or null`
984410172 
10173 The user's email address. Null when the account is unavailable or has been deleted.
10174 
984510175 - `name: string or null`
984610176 
10177 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10178 
984710179 - `type: "user_actor"`
984810180 
10181 Actor type. Always `user_actor`.
10182 
984910183 default: user_actor
985010184 
985110185 - `user_id: string`
985210186 
10187 Tagged ID of the user.
10188 
985310189 - `ScopedAPIKeyActor object`
985410190 
985510191 A scoped Admin API key acting on behalf of the organization.
from line 10198
986210198 
986310199- `spend_limit: SpendLimit`
986410200 
10201 A configured spend limit: a cap on metered spend for one scope and period.
10202 
986510203 - `id: string`
986610204 
10205 Unique tagged ID of the spend limit (`spl_...`).
10206 
986710207 - `amount: string or null`
986810208 
986910209 Limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD): "50000" is $500.00. `null` means no numeric cap is configured at this scope — see the effective report for whether a limit applies.
987010210 
987110211 - `created_at: string`
987210212 
10213 RFC 3339 datetime at which the spend limit was created.
10214 
987310215 format: date-time
987410216 
987510217 - `currency: string`
from line 10220
987810220 
987910221 - `period: "daily" or "monthly" or "weekly"`
988010222 
10223 Length of the window the limit resets over. `amount` caps spend within each period.
10224 
988110225 - `"daily"`
988210226 
988310227 - `"monthly"`
from line 10230
988610230 
988710231 - `scope: object or object or object or 2 more`
988810232 
10233 What the limit applies to. A tagged union on `type`; each variant carries the identifier for its scope.
10234 
988910235 - `User object`
989010236 
10237 Scope selecting a single member of the organization.
10238 
989110239 - `type: "user"`
989210240 
10241 Scope type. Always `user` for this scope.
10242 
989310243 default: user
989410244 
989510245 - `user_id: string`
989610246 
10247 Tagged ID of the member the spend limit applies to.
10248 
989710249 - `SeatTier object`
989810250 
989910251 - `seat_tier: string`
from line 10278
992610278 
992710279 - `type: "spend_limit"`
992810280 
10281 Object type. Always `spend_limit`.
10282 
992910283 default: spend_limit
993010284 
993110285 - `updated_at: string`
993210286 
10287 RFC 3339 datetime at which the spend limit was last modified.
10288 
993310289 format: date-time
993410290 
993510291- `spend_summary: SpendSummary or null`
993610292 
9937 Per-member effective-limit report row (GET /spend_limits/effective).
10293 Per-member effective-limit report row (`GET /spend_limits/effective`).
993810294 
993910295 - `actor: object`
994010296 
from line 10300
994410300 
994510301 - `deleted: boolean`
994610302 
10303 True only when the underlying account has been deleted.
10304 
994710305 default: false
994810306 
994910307 - `email_address: string or null`
995010308 
10309 The user's email address. Null when the account is unavailable or has been deleted.
10310 
995110311 - `name: string or null`
995210312 
10313 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10314 
995310315 - `type: "user_actor"`
995410316 
10317 Actor type. Always `user_actor`.
10318 
995510319 default: user_actor
995610320 
995710321 - `user_id: string`
995810322 
10323 Tagged ID of the user.
10324 
995910325 - `amount: string or null`
996010326 
996110327 Effective limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD). `null` means no limit applies for this row's `period` — each period resolves independently, so another period may still cap this member.
from line 10332
996610332 
996710333 - `period: "daily" or "monthly" or "weekly"`
996810334 
10335 Period this row's effective limit and spend are reported for.
10336 
996910337 - `"daily"`
997010338 
997110339 - `"monthly"`
from line 10346
997810346 
997910347 - `scope: object`
998010348 
10349 Scope selecting a single member of the organization.
10350 
998110351 - `type: "user"`
998210352 
10353 Scope type. Always `user` for this scope.
10354 
998310355 default: user
998410356 
998510357 - `user_id: string`
998610358 
10359 Tagged ID of the member the spend limit applies to.
10360 
998710361 - `source: object or object or object or 2 more`
998810362 
10363 Scope selecting a single member of the organization.
10364 
998910365 - `User object`
999010366 
10367 Scope selecting a single member of the organization.
10368 
999110369 - `type: "user"`
999210370 
10371 Scope type. Always `user` for this scope.
10372 
999310373 default: user
999410374 
999510375 - `user_id: string`
10376 
10377 Tagged ID of the member the spend limit applies to.
999610378 
999710379 - `SeatTier object`
999810380 
from line 10443
1006110443 "email_address": "email_address",
1006210444 "name": "name",
1006310445 "type": "user_actor",
10064 "user_id": "user_id"
10446 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1006510447 },
1006610448 "created_at": "2019-12-27T18:11:19.117Z",
1006710449 "period": "monthly",
from line 10453
1007110453 "email_address": "email_address",
1007210454 "name": "name",
1007310455 "type": "user_actor",
10074 "user_id": "user_id"
10456 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1007510457 },
1007610458 "spend_limit": {
1007710459 "id": "id",
from line 10463
1008110463 "period": "monthly",
1008210464 "scope": {
1008310465 "type": "user",
10084 "user_id": "user_id"
10466 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1008510467 },
1008610468 "type": "spend_limit",
1008710469 "updated_at": "2019-12-27T18:11:19.117Z"
from line 10474
1009210474 "email_address": "email_address",
1009310475 "name": "name",
1009410476 "type": "user_actor",
10095 "user_id": "user_id"
10477 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1009610478 },
1009710479 "amount": "50000",
1009810480 "currency": "USD",
from line 10482
1010010482 "period_to_date_spend": "12050.5",
1010110483 "scope": {
1010210484 "type": "user",
10103 "user_id": "user_id"
10485 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1010410486 },
1010510487 "source": {
1010610488 "type": "user",
10107 "user_id": "user_id"
10489 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1010810490 },
1010910491 "spend_limit_id": "spend_limit_id"
1011010492 },
from line 10528
1014610528 
1014710529 - `deleted: boolean`
1014810530 
10531 True only when the underlying account has been deleted.
10532 
1014910533 default: false
1015010534 
1015110535 - `email_address: string or null`
1015210536 
10537 The user's email address. Null when the account is unavailable or has been deleted.
10538 
1015310539 - `name: string or null`
1015410540 
10541 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10542 
1015510543 - `type: "user_actor"`
1015610544 
10545 Actor type. Always `user_actor`.
10546 
1015710547 default: user_actor
1015810548 
1015910549 - `user_id: string`
10550 
10551 Tagged ID of the user.
1016010552 
1016110553 - `created_at: string`
1016210554 
from line 10580
1018810580 
1018910581 - `deleted: boolean`
1019010582 
10583 True only when the underlying account has been deleted.
10584 
1019110585 default: false
1019210586 
1019310587 - `email_address: string or null`
1019410588 
10589 The user's email address. Null when the account is unavailable or has been deleted.
10590 
1019510591 - `name: string or null`
1019610592 
10593 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10594 
1019710595 - `type: "user_actor"`
1019810596 
10597 Actor type. Always `user_actor`.
10598 
1019910599 default: user_actor
1020010600 
1020110601 - `user_id: string`
1020210602 
10603 Tagged ID of the user.
10604 
1020310605 - `ScopedAPIKeyActor object`
1020410606 
1020510607 A scoped Admin API key acting on behalf of the organization.
from line 10614
1021210614 
1021310615 - `spend_summary: SpendSummary or null`
1021410616 
10215 Per-member effective-limit report row (GET /spend_limits/effective).
10617 Per-member effective-limit report row (`GET /spend_limits/effective`).
1021610618 
1021710619 - `actor: object`
1021810620 
from line 10624
1022210624 
1022310625 - `deleted: boolean`
1022410626 
10627 True only when the underlying account has been deleted.
10628 
1022510629 default: false
1022610630 
1022710631 - `email_address: string or null`
1022810632 
10633 The user's email address. Null when the account is unavailable or has been deleted.
10634 
1022910635 - `name: string or null`
1023010636 
10637 The user's current display name. Null when the account is unavailable, has been deleted, or has no name set.
10638 
1023110639 - `type: "user_actor"`
1023210640 
10641 Actor type. Always `user_actor`.
10642 
1023310643 default: user_actor
1023410644 
1023510645 - `user_id: string`
1023610646 
10647 Tagged ID of the user.
10648 
1023710649 - `amount: string or null`
1023810650 
1023910651 Effective limit amount as a non-negative integer decimal string in the minor unit of `currency` (cents for USD). `null` means no limit applies for this row's `period` — each period resolves independently, so another period may still cap this member.
from line 10656
1024410656 
1024510657 - `period: "daily" or "monthly" or "weekly"`
1024610658 
10659 Period this row's effective limit and spend are reported for.
10660 
1024710661 - `"daily"`
1024810662 
1024910663 - `"monthly"`
from line 10670
1025610670 
1025710671 - `scope: object`
1025810672 
10673 Scope selecting a single member of the organization.
10674 
1025910675 - `type: "user"`
1026010676 
10677 Scope type. Always `user` for this scope.
10678 
1026110679 default: user
1026210680 
1026310681 - `user_id: string`
1026410682 
10683 Tagged ID of the member the spend limit applies to.
10684 
1026510685 - `source: object or object or object or 2 more`
1026610686 
10687 Scope selecting a single member of the organization.
10688 
1026710689 - `User object`
1026810690 
10691 Scope selecting a single member of the organization.
10692 
1026910693 - `type: "user"`
1027010694 
10695 Scope type. Always `user` for this scope.
10696 
1027110697 default: user
1027210698 
1027310699 - `user_id: string`
10700 
10701 Tagged ID of the member the spend limit applies to.
1027410702 
1027510703 - `SeatTier object`
1027610704 
from line 10764
1033610764 "email_address": "email_address",
1033710765 "name": "name",
1033810766 "type": "user_actor",
10339 "user_id": "user_id"
10767 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1034010768 },
1034110769 "created_at": "2019-12-27T18:11:19.117Z",
1034210770 "period": "monthly",
from line 10774
1034610774 "email_address": "email_address",
1034710775 "name": "name",
1034810776 "type": "user_actor",
10349 "user_id": "user_id"
10777 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1035010778 },
1035110779 "spend_summary": {
1035210780 "actor": {
from line 10782
1035410782 "email_address": "email_address",
1035510783 "name": "name",
1035610784 "type": "user_actor",
10357 "user_id": "user_id"
10785 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1035810786 },
1035910787 "amount": "50000",
1036010788 "currency": "USD",
from line 10790
1036210790 "period_to_date_spend": "12050.5",
1036310791 "scope": {
1036410792 "type": "user",
10365 "user_id": "user_id"
10793 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1036610794 },
1036710795 "source": {
1036810796 "type": "user",
10369 "user_id": "user_id"
10797 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
1037010798 },
1037110799 "spend_limit_id": "spend_limit_id"
1037210800 },
from line 11610
1118211610 
1118311611- `implicit: boolean or null`
1118411612 
11185 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
11613 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
1118611614 
1118711615- `service_account_id: string`
1118811616 
from line 11716
1128811716 
1128911717 - `implicit: boolean or null`
1129011718 
11291 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role workspace_user and cannot be removed.
11719 True when this is the implicit default-workspace membership every service account has when no explicit membership exists. Implicit memberships have role `workspace_user` and cannot be removed.
1129211720 
1129311721 - `service_account_id: string`
1129411722 
1129511723 

api/admin/analytics Changed · +243 / -155 lines

from line 6
66 
77Get organization-wide activity summaries for a date range.
88 
9Returns one entry per day in [starting_date, ending_date). Data is
10typically available with a 1-day lag and may be revised by a few percent
11over the following days: when ending_date is omitted it defaults to the
12most recent available day + 1, so the last entry covers the most recent
13available day. The series can be scoped to an RBAC group via
14filter[]=rbac_group_id:<id>. Available to organizations on a Claude
15Enterprise plan. Requires an API key with the `read:analytics` scope.
9Returns one entry per day from `starting_date` (inclusive) to `ending_date`
10(exclusive). Data is typically available with a 1-day lag and may be
11revised by a few percent over the following days: when `ending_date` is
12omitted it defaults to the most recent available day + 1, so the last
13entry covers the most recent available day. The series can be scoped to
14an RBAC group via `filter[]=rbac_group_id:{id}`. Available to
15organizations on a Claude Enterprise plan. Requires an API key with the
16`read:analytics` scope.
1617 
1718### Query parameters
1819 
from line 31
3031 
3132- `filter: optional array of string`
3233 
33 Filters as 'dimension:value'. Only rbac_group_id is supported (e.g. filter[]=rbac_group_id:<id>); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. rbac_group_id accepts the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
34 Filters as `dimension:value`. Only `rbac_group_id` is supported (e.g. `filter[]=rbac_group_id:{id}`); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. `rbac_group_id` accepts the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
3435 
3536 maxItems: 100
3637 
from line 69
6869 
6970 - `ending_at: string`
7071 
71 End time in UTC of aggregation period (e.g. 2026-01-16T00:00:00Z)
72 End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-16T00:00:00Z`).
7273 
74 format: date-time
75 
7376 - `monthly_active_user_count: number`
7477 
7578 Number of users with token consumption in the 30-day rolling window
from line 87
8487 
8588 - `starting_at: string`
8689 
87 Start time in UTC of aggregation period (e.g. 2026-01-15T00:00:00Z)
90 Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-15T00:00:00Z`).
8891 
92 format: date-time
93 
8994 - `weekly_active_user_count: number`
9095 
9196 Number of users with token consumption in the 7-day rolling window
from line 183
178183 "cowork_weekly_active_user_count": 0,
179184 "daily_active_user_count": 0,
180185 "daily_adoption_rate": 0,
181 "ending_at": "ending_at",
186 "ending_at": "2019-12-27T18:11:19.117Z",
182187 "monthly_active_user_count": 0,
183188 "monthly_adoption_rate": 0,
184189 "pending_invite_count": 0,
185 "starting_at": "starting_at",
190 "starting_at": "2019-12-27T18:11:19.117Z",
186191 "weekly_active_user_count": 0,
187192 "weekly_adoption_rate": 0,
188193 "chat_daily_active_user_count": 0,
from line 247
242247 
243248 - `ending_at: string`
244249 
245 End time in UTC of aggregation period (e.g. 2026-01-16T00:00:00Z)
250 End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-16T00:00:00Z`).
246251 
252 format: date-time
253 
247254 - `monthly_active_user_count: number`
248255 
249256 Number of users with token consumption in the 30-day rolling window
from line 265
258265 
259266 - `starting_at: string`
260267 
261 Start time in UTC of aggregation period (e.g. 2026-01-15T00:00:00Z)
268 Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-15T00:00:00Z`).
262269 
270 format: date-time
271 
263272 - `weekly_active_user_count: number`
264273 
265274 Number of users with token consumption in the 7-day rolling window
from line 345
336345 
337346- `AnalyticsUser object`
338347 
339 User identifier.
348 A user in the organization, identified by tagged id and email address.
340349 
341350 - `id: string`
342351 
from line 355
346355 
347356 Email address of the user
348357 
349 - `type: optional "user"`
358 - `type: "user"`
350359 
351360 Object type. Always `user`.
352361 
from line 367
358367 
359368 - `deleted: boolean`
360369 
361 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
370 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
362371 
363372 - `email: string or null`
364373 
from line 375
366375 
367376 - `name: string or null`
368377 
369 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
378 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
370379 
371380 - `type: "user_actor"`
372381 
from line 532
523532 
524533- `limit: optional number`
525534 
526 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
535 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
527536 
528537 minimum: 1
529538 
from line 546
537546 
538547 Opaque cursor from a previous response's `next_page` field.
539548 
540- `products: optional array of string`
549- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
541550 
542 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
551 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
543552 
544553 maxItems: 100
545554 
555 - `"chat"`
556 
557 - `"claude-tag"`
558 
559 - `"claude_code"`
560 
561 - `"claude_design"`
562 
563 - `"claude_in_chrome"`
564 
565 - `"cowork"`
566 
567 - `"office_agent"`
568 
546569- `rbac_group_ids: optional array of string`
547570 
548571 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 646
623646 
624647 - `model: string or null`
625648 
626 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
649 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
627650 
628651 - `output_tokens: number`
629652 
from line 654
631654 
632655 - `product: string or null`
633656 
634 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
657 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
635658 
636659 - `rbac_group_id: string or null`
637660 
638 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
661 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
639662 
640663 - `requests: number or null`
641664 
from line 736
713736 "cache_read_input_tokens": 0,
714737 "context_window": "0-200k",
715738 "inference_geo": "global",
716 "model": "claude-opus-4-6",
739 "model": "claude-opus-5",
717740 "output_tokens": 0,
718741 "product": "chat",
719742 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 885
862885 
863886 Opaque cursor from a previous response's `next_page` field.
864887 
865- `products: optional array of string`
888- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
866889 
867 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
890 Product surfaces to include. Defaults to all products.
868891 
869892 maxItems: 100
870893 
894 - `"chat"`
895 
896 - `"claude-tag"`
897 
898 - `"claude_code"`
899 
900 - `"claude_design"`
901 
902 - `"claude_in_chrome"`
903 
904 - `"cowork"`
905 
906 - `"office_agent"`
907 
871908- `rbac_group_ids: optional array of string`
872909 
873910 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 947
910947 
911948 - `deleted: boolean`
912949 
913 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
950 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
914951 
915952 - `email: string or null`
916953 
from line 955
918955 
919956 - `name: string or null`
920957 
921 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
958 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
922959 
923960 - `type: "user_actor"`
924961 
from line 1005
9681005 
9691006 - `model: string or null`
9701007 
971 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
1008 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
9721009 
9731010 - `output_tokens: number`
9741011 
from line 1013
9761013 
9771014 - `product: string or null`
9781015 
979 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
1016 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
9801017 
9811018 - `rbac_group_id: string or null`
9821019 
983 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
1020 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
9841021 
9851022 - `requests: number or null`
9861023 
from line 1051
10141051 
10151052 - `total_tokens: number`
10161053 
1017 Total token count across all token types. This is the value the default order_by='total_tokens' sorts on.
1054 Total token count across all token types. This is the value the default `order_by` (`total_tokens`) sorts on.
10181055 
10191056 - `uncached_input_tokens: number`
10201057 
from line 1104
10671104 "context_window": "0-200k",
10681105 "ending_at": "2019-12-27T18:11:19.117Z",
10691106 "inference_geo": "global",
1070 "model": "claude-opus-4-6",
1107 "model": "claude-opus-5",
10711108 "output_tokens": 891000,
10721109 "product": "chat",
10731110 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 1213
11761213 
11771214- `limit: optional number`
11781215 
1179 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
1216 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
11801217 
11811218 minimum: 1
11821219 
from line 1227
11901227 
11911228 Opaque cursor from a previous response's `next_page` field.
11921229 
1193- `products: optional array of string`
1230- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
11941231 
1195 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
1232 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
11961233 
11971234 maxItems: 100
11981235 
1236 - `"chat"`
1237 
1238 - `"claude-tag"`
1239 
1240 - `"claude_code"`
1241 
1242 - `"claude_design"`
1243 
1244 - `"claude_in_chrome"`
1245 
1246 - `"cowork"`
1247 
1248 - `"office_agent"`
1249 
11991250- `rbac_group_ids: optional array of string`
12001251 
12011252 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 1335
12841335 
12851336 - `model: string or null`
12861337 
1287 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
1338 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
12881339 
12891340 - `product: string or null`
12901341 
1291 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
1342 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
12921343 
12931344 - `rbac_group_id: string or null`
12941345 
1295 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
1346 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
12961347 
12971348 - `requests: number or null`
12981349 
from line 1422
13711422 "currency": "USD",
13721423 "inference_geo": "global",
13731424 "list_amount": "list_amount",
1374 "model": "claude-opus-4-6",
1425 "model": "claude-opus-5",
13751426 "product": "chat",
13761427 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
13771428 "requests": 0,
from line 1567
15161567 
15171568 Opaque cursor from a previous response's `next_page` field.
15181569 
1519- `products: optional array of string`
1570- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
15201571 
1521 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
1572 Product surfaces to include. Defaults to all products.
15221573 
15231574 maxItems: 100
15241575 
1576 - `"chat"`
1577 
1578 - `"claude-tag"`
1579 
1580 - `"claude_code"`
1581 
1582 - `"claude_design"`
1583 
1584 - `"claude_in_chrome"`
1585 
1586 - `"cowork"`
1587 
1588 - `"office_agent"`
1589 
15251590- `rbac_group_ids: optional array of string`
15261591 
15271592 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 1629
15641629 
15651630 - `deleted: boolean`
15661631 
1567 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
1632 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
15681633 
15691634 - `email: string or null`
15701635 
from line 1637
15721637 
15731638 - `name: string or null`
15741639 
1575 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
1640 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
15761641 
15771642 - `type: "user_actor"`
15781643 
from line 1695
16301695 
16311696 - `model: string or null`
16321697 
1633 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
1698 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
16341699 
16351700 - `product: string or null`
16361701 
1637 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
1702 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
16381703 
16391704 - `rbac_group_id: string or null`
16401705 
1641 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
1706 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
16421707 
16431708 - `requests: number or null`
16441709 
from line 1729
16641729 
16651730 - `token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null`
16661731 
1667 Token type when cost_type=tokens; null otherwise.
1732 Token type when `cost_type` is `tokens`; null otherwise.
16681733 
16691734 - `"cache_creation.ephemeral_1h_input_tokens"`
16701735 
from line 1787
17221787 "ending_at": "2019-12-27T18:11:19.117Z",
17231788 "inference_geo": "global",
17241789 "list_amount": "51600.000000",
1725 "model": "claude-opus-4-6",
1790 "model": "claude-opus-5",
17261791 "product": "chat",
17271792 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
17281793 "requests": 128,
from line 1813
17481813Get per-user activity for a given day, with cursor-based pagination.
17491814 
17501815Returns activity metrics for each user in the organization, sorted by email
1751address. Use group_by[] for per-RBAC-group aggregates, or filter[] to
1816address. Use `group_by[]` for per-RBAC-group aggregates, or `filter[]` to
17521817scope results to specific members, groups, or a chat project. Available
17531818to organizations on a Claude Enterprise plan. Requires an API key with
17541819the `read:analytics` scope.
from line 1828
17631828 
17641829- `ending_date: optional string`
17651830 
1766 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
1831 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
17671832 
17681833 format: date
17691834 
17701835- `filter: optional array of string`
17711836 
1772 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with group_by[] or an rbac_group_id filter); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
1837 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with `group_by[]` or an `rbac_group_id` filter); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
17731838 
17741839 maxItems: 100
17751840 
17761841- `group_by: optional array of "rbac_group_id"`
17771842 
1778 Dimensions to break results out by (e.g. group_by[]=rbac_group_id). Supported on this endpoint: rbac_group_id. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
1843 Dimensions to break results out by (e.g. `group_by[]=rbac_group_id`). Supported on this endpoint: `rbac_group_id`. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
17791844 
17801845 maxItems: 100
17811846 
from line 1852
17871852 
17881853- `order: optional "asc" or "desc"`
17891854 
1790 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
1855 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
17911856 
17921857 - `"asc"`
17931858 
from line 1864
17991864 
18001865- `page: optional string`
18011866 
1802 Opaque cursor from a previous response's next_page field.
1867 Opaque cursor from a previous response's `next_page` field.
18031868 
18041869- `starting_date: optional string`
18051870 
1806 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
1871 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
18071872 
18081873 format: date
18091874 
from line 1940
18751940 
18761941 Core Claude Code activity metrics for a single user on a given day.
18771942 
1943 - `artifacts_created_count: number`
1944 
1945 Number of artifacts created in Claude Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
1946 
18781947 - `commit_count: number`
18791948 
18801949 Number of commits made via Claude Code
from line 2004
19352004 
19362005 Number of tool actions completed in Cowork sessions
19372006 
2007 - `artifacts_created_count: number`
2008 
2009 Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
2010 
19382011 - `connectors_used_count: number`
19392012 
19402013 Total number of connector invocations in Cowork sessions
from line 2166
20932166 
20942167 - `last_activity_date: optional string or null`
20952168 
2096 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day in [starting_date, ending_date) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id` it is the last day the user was active while a member of that group, consistent with the row's other metrics. Null on grouped (`group_by[]`) rows. Omitted from the response while last-activity reporting is not enabled for this organization.
2169 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested `date` in single-day mode, and to the latest active day from `starting_date` (inclusive) to `ending_date` (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id:{id}` it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (`group_by[]`) rows it is the latest day any member of the group was active (the requested `date` in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.
20972170 
2171 format: date
2172 
20982173 - `rbac_group_id: optional string or null`
20992174 
21002175 Tagged RBAC group identifier (`rbac_group_...`), matching the spend-limits API spelling. Present only when the request grouped by `rbac_group_id`.
from line 2180
21052180 
21062181 - `user: optional AnalyticsUser or null`
21072182 
2108 User identifier.
2183 A user in the organization, identified by tagged id and email address.
21092184 
21102185 - `id: string`
21112186 
from line 2190
21152190 
21162191 Email address of the user
21172192 
2118 - `type: optional "user"`
2193 - `type: "user"`
21192194 
21202195 Object type. Always `user`.
21212196 
from line 2230
21552230 },
21562231 "claude_code_metrics": {
21572232 "core_metrics": {
2233 "artifacts_created_count": 0,
21582234 "commit_count": 0,
21592235 "distinct_session_count": 0,
21602236 "lines_of_code": {
from line 2260
21842260 },
21852261 "cowork_metrics": {
21862262 "action_count": 0,
2263 "artifacts_created_count": 0,
21872264 "connectors_used_count": 0,
21882265 "dispatch_turn_count": 0,
21892266 "distinct_connectors_used_count": 0,
from line 2326
22492326 },
22502327 "web_search_count": 0,
22512328 "distinct_user_count": 0,
2252 "last_activity_date": "last_activity_date",
2329 "last_activity_date": "2019-12-27",
22532330 "rbac_group_id": "rbac_group_id",
22542331 "rbac_group_name": "rbac_group_name",
22552332 "user": {
from line 2349
22722349Get per-skill usage for a given day, with cursor-based pagination.
22732350 
22742351Returns skill usage metrics for the organization, sorted by skill name.
2275Use group_by[] to break usage out per member, per RBAC group, or per
2276product surface, and filter[] to scope results; the parameter
2352Use `group_by[]` to break usage out per member, per RBAC group, or per
2353product surface, and `filter[]` to scope results; the parameter
22772354descriptions list the supported dimensions. Available to organizations
22782355on a Claude Enterprise plan. Requires an API key with the
22792356`read:analytics` scope.
from line 2365
22882365 
22892366- `ending_date: optional string`
22902367 
2291 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
2368 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
22922369 
22932370 format: date
22942371 
22952372- `filter: optional array of string`
22962373 
2297 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: product, rbac_group_id, share_status, skill_name, user_id. Value forms: product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); share_status is one of organization, private, or public; skill_name matches case-insensitively; user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
2374 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `product`, `rbac_group_id`, `share_status`, `skill_name`, `user_id`. Value forms: `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `share_status` is one of `organization`, `private`, or `public`; `skill_name` matches case-insensitively; `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
22982375 
22992376 maxItems: 100
23002377 
23012378- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
23022379 
2303 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
2380 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
23042381 
23052382 maxItems: 100
23062383 
from line 2395
23182395 
23192396- `order: optional "asc" or "desc"`
23202397 
2321 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
2398 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
23222399 
23232400 - `"asc"`
23242401 
from line 2407
23302407 
23312408- `page: optional string`
23322409 
2333 Opaque cursor from a previous response's next_page field.
2410 Opaque cursor from a previous response's `next_page` field.
23342411 
23352412- `starting_date: optional string`
23362413 
2337 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
2414 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
23382415 
23392416 format: date
23402417 
from line 2481
24042481 
24052482 - `attributed_list_price: optional string or null`
24062483 
2407 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that INVOLVED the skill, not the skill's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does NOT tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
2484 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the skill, not the skill's incremental cost. Unlike `estimated_overage_spend` this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on `chat` product rows and on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as `estimated_overage_spend` (spend reporting not enabled for this organization, `office_agent` product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
24082485 
24092486 - `currency: optional "USD" or null`
24102487 
2411 Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
2488 Currency for this row's monetary fields (`estimated_overage_spend` and `attributed_list_price`), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
24122489 
24132490 - `enable_count: optional number or null`
24142491 
2415 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).
2492 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin `install_count`). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (`starting_date`/`ending_date`).
24162493 
24172494 - `estimated_overage_spend: optional string or null`
24182495 
2419 Estimated OVERAGE spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that INVOLVED the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
2496 Estimated overage spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see `attributed_list_price` for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (`starting_date`/`ending_date`) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
24202497 
24212498 - `invocation_count: optional number or null`
24222499 
2423 Total number of times this skill was invoked on the requested day (the skill analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.
2500 Total number of times this skill was invoked on the requested day (the skill analog of plugin `invocation_count`). Unlike `distinct_user_count` — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (`starting_date`/`ending_date`) returns this sum directly.
24242501 
24252502 - `product: optional string or null`
24262503 
2427 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
2504 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
24282505 
24292506 - `rbac_group_id: optional string or null`
24302507 
from line 2511
24342511 
24352512 Resolved RBAC group display name, alongside `rbac_group_id` when name resolution is available. Null if the group has been deleted or its name could not be resolved; `rbac_group_id` remains the stable key.
24362513 
2437 - `share_status: optional string or null`
2514 - `share_status: optional "organization" or "private" or "public" or null`
24382515 
2439 Skill share status (claude.ai only): one of 'private', 'organization', or 'public'. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:<value>`.
2516 Skill share status (claude.ai only): one of `private`, `organization`, or `public`. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:{value}`.
24402517 
2518 - `"organization"`
2519 
2520 - `"private"`
2521 
2522 - `"public"`
2523 
24412524 - `skill_display_name: optional string or null`
24422525 
2443 Human-readable display name for rows whose skill_name is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when skill_name is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
2526 Human-readable display name for rows whose `skill_name` is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when `skill_name` is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
24442527 
24452528 - `user_id: optional string or null`
24462529 
from line 2580
24972580 "product": "product",
24982581 "rbac_group_id": "rbac_group_id",
24992582 "rbac_group_name": "rbac_group_name",
2500 "share_status": "share_status",
2583 "share_status": "organization",
25012584 "skill_display_name": "skill_display_name",
25022585 "user_id": "user_id"
25032586 }
from line 2600
25172600Returns connector usage metrics for the organization, sorted by connector
25182601name. Connector names are normalized from their various sources — for
25192602example, "Atlassian MCP server" and "mcp-atlassian" both appear as
2520"atlassian". Use group_by[] to break usage out per member, per RBAC
2521group, or per product surface, and filter[] to scope results; the
2603"atlassian". Use `group_by[]` to break usage out per member, per RBAC
2604group, or per product surface, and `filter[]` to scope results; the
25222605parameter descriptions list the supported dimensions. Available to
25232606organizations on a Claude Enterprise plan. Requires an API key with the
25242607`read:analytics` scope.
from line 2616
25332616 
25342617- `ending_date: optional string`
25352618 
2536 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
2619 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
25372620 
25382621 format: date
25392622 
25402623- `filter: optional array of string`
25412624 
2542 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: connector_name, product, rbac_group_id, user_id. Value forms: connector_name matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose connector_name is an opaque connector id the connector's display name (connector_display_name) also matches; product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
2625 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `connector_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `connector_name` matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose `connector_name` is an opaque connector id the connector's display name (`connector_display_name`) also matches; `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
25432626 
25442627 maxItems: 100
25452628 
25462629- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
25472630 
2548 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
2631 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
25492632 
25502633 maxItems: 100
25512634 
from line 2646
25632646 
25642647- `order: optional "asc" or "desc"`
25652648 
2566 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
2649 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
25672650 
25682651 - `"asc"`
25692652 
from line 2658
25752658 
25762659- `page: optional string`
25772660 
2578 Opaque cursor from a previous response's next_page field.
2661 Opaque cursor from a previous response's `next_page` field.
25792662 
25802663- `starting_date: optional string`
25812664 
2582 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
2665 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
25832666 
25842667 format: date
25852668 
from line 2692
26092692 
26102693 - `connector_name: string`
26112694 
2612 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.
2695 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; `connector_display_name` holds the resolved name for those rows.
26132696 
26142697 - `cowork_metrics: object`
26152698 
from line 2732
26492732 
26502733 - `connector_display_name: optional string or null`
26512734 
2652 Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:<value> also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
2735 Human-readable display name for rows whose `connector_name` is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). `connector_name` remains the row's stable key for sorting and pagination, and `filter[]=connector_name:{value}` also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable `connector_name`. Null when `connector_name` is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
26532736 
26542737 - `individual_auth_distinct_user_count: optional number or null`
26552738 
2656 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
2739 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to `managed_auth_distinct_user_count`, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
26572740 
26582741 - `managed_auth_distinct_user_count: optional number or null`
26592742 
2660 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
2743 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on `user_id` and `rbac_group_id` cuts — attributed to the user the credential was provisioned for — but never on a cut that references `product` (group or filter). Date-range rollup mode (`starting_date`/`ending_date`) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
26612744 
26622745 - `product: optional string or null`
26632746 
2664 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
2747 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
26652748 
26662749 - `rbac_group_id: optional string or null`
26672750 
from line 2756
26732756 
26742757 - `read_call_count: optional number or null`
26752758 
2676 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.
2759 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of `read_call_count`, `write_call_count`, or `unclassified_call_count`, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in `unclassified_call_count`). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (`starting_date`/`ending_date`) applies both rules server-side.
26772760 
26782761 - `unclassified_call_count: optional number or null`
26792762 
2680 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
2763 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
26812764 
26822765 - `user_id: optional string or null`
26832766 
from line 2768
26852768 
26862769 - `write_call_count: optional number or null`
26872770 
2688 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
2771 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
26892772 
26902773 - `next_page: string or null`
26912774 
from line 2838
27552838Get per-project activity for a given day, with cursor-based pagination.
27562839 
27572840Returns activity metrics for each project in the organization, sorted by
2758project ID. Use group_by[] to break projects out per member or per RBAC
2759group, and filter[] to scope results; the parameter descriptions list the
2841project ID. Use `group_by[]` to break projects out per member or per RBAC
2842group, and `filter[]` to scope results; the parameter descriptions list the
27602843supported dimensions. Available to organizations on a Claude Enterprise
27612844plan. Requires an API key with the `read:analytics` scope.
27622845 
from line 2853
27702853 
27712854- `ending_date: optional string`
27722855 
2773 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
2856 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
27742857 
27752858 format: date
27762859 
27772860- `filter: optional array of string`
27782861 
2779 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
2862 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
27802863 
27812864 maxItems: 100
27822865 
27832866- `group_by: optional array of "rbac_group_id" or "user_id"`
27842867 
2785 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
2868 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
27862869 
27872870 maxItems: 100
27882871 
from line 2881
27982881 
27992882- `order: optional "asc" or "desc"`
28002883 
2801 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
2884 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
28022885 
28032886 - `"asc"`
28042887 
from line 2893
28102893 
28112894- `page: optional string`
28122895 
2813 Opaque cursor from a previous response's next_page field.
2896 Opaque cursor from a previous response's `next_page` field.
28142897 
28152898- `starting_date: optional string`
28162899 
2817 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
2900 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
28182901 
28192902 format: date
28202903 
from line 2919
28362919 
28372920 - `project_id: string`
28382921 
2839 Tagged project identifier (e.g. claude_proj_...)
2922 Tagged project identifier (e.g. `claude_proj_...`)
28402923 
28412924 - `project_name: string`
28422925 
from line 2927
28442927 
28452928 - `created_at: optional string or null`
28462929 
2847 Project creation timestamp, RFC 3339. Null if the project was deleted before attribution was recorded.
2930 Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.
28482931 
2932 format: date-time
2933 
28492934 - `created_by: optional AnalyticsUser or null`
28502935 
2851 User identifier.
2936 A user in the organization, identified by tagged id and email address.
28522937 
28532938 - `id: string`
28542939 
from line 2943
28582943 
28592944 Email address of the user
28602945 
2861 - `type: optional "user"`
2946 - `type: "user"`
28622947 
28632948 Object type. Always `user`.
28642949 
from line 2955
28702955 
28712956 - `product: optional string or null`
28722957 
2873 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
2958 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
28742959 
28752960 - `rbac_group_id: optional string or null`
28762961 
from line 2991
29062991 "message_count": 0,
29072992 "project_id": "project_id",
29082993 "project_name": "project_name",
2909 "created_at": "created_at",
2994 "created_at": "2019-12-27T18:11:19.117Z",
29102995 "created_by": {
29112996 "id": "id",
29122997 "email_address": "email_address",
from line 3021
29363021an aggregate bucket, not a plugin: it collects plugin activity, from
29373022either surface, for which the reporting client did not provide a plugin
29383023name — so an organization's own plugins can contribute both to their own
2939named rows and to this bucket. Use group_by[] to break usage out per
3024named rows and to this bucket. Use `group_by[]` to break usage out per
29403025member, per RBAC group, or per product surface (Cowork / Claude Code),
2941and filter[] to scope results; the parameter descriptions list the
3026and `filter[]` to scope results; the parameter descriptions list the
29423027supported dimensions. Requires an API key with the
29433028`read:analytics` scope. `starting_date` / `ending_date` select
2944range-rollup mode like /skills.
3029range-rollup mode like `/skills`.
29453030 
29463031#### Query parameters
29473032 
from line 3038
29533038 
29543039- `ending_date: optional string`
29553040 
2956 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
3041 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
29573042 
29583043 format: date
29593044 
29603045- `filter: optional array of string`
29613046 
2962 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: plugin_name, product, rbac_group_id, user_id. Value forms: plugin_name matches case-insensitively; product is claude_code or cowork (the only surfaces with plugin attribution); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3047 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `plugin_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `plugin_name` matches case-insensitively; `product` is `claude_code` or `cowork` (the only surfaces with plugin attribution); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
29633048 
29643049 maxItems: 100
29653050 
29663051- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
29673052 
2968 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. On this endpoint product takes the values claude_code or cowork only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3053 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. On this endpoint `product` takes the values `claude_code` or `cowork` only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
29693054 
29703055 maxItems: 100
29713056 
from line 3068
29833068 
29843069- `order: optional "asc" or "desc"`
29853070 
2986 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
3071 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
29873072 
29883073 - `"asc"`
29893074 
from line 3080
29953080 
29963081- `page: optional string`
29973082 
2998 Opaque cursor from a previous response's next_page field.
3083 Opaque cursor from a previous response's `next_page` field.
29993084 
30003085- `starting_date: optional string`
30013086 
3002 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
3087 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
30033088 
30043089 format: date
30053090 
from line 3130
30453130 
30463131 - `plugin_id: optional string or null`
30473132 
3048 Stable plugin identifier when available (e.g. serena@claude-plugins-official). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
3133 Stable plugin identifier when available (e.g. `serena@claude-plugins-official`). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
30493134 
30503135 - `product: optional string or null`
30513136 
3052 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
3137 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
30533138 
30543139 - `rbac_group_id: optional string or null`
30553140 
from line 3195
31103195 
31113196Get artifact-creation activity for a given day, broken out by MIME type.
31123197 
3113Returns the full (artifact_type, is_shared) cube for the organization;
3198Returns the full (`artifact_type`, `is_shared`) cube for the organization;
31143199`next_page` is null except for grouped queries, which paginate. The cube
3115can be broken out per member or per RBAC group via group_by[], and scoped
3116via filter[]. Requires an API key with the `read:analytics` scope.
3200can be broken out per product, per member, or per RBAC group via
3201`group_by[]`, and scoped via `filter[]`. Requires an API key with the
3202`read:analytics` scope.
31173203 
31183204#### Query parameters
31193205 
from line 3211
31253211 
31263212- `filter: optional array of string`
31273213 
3128 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: artifact_type, is_shared, rbac_group_id, user_id. Value forms: artifact_type is a canonical artifact MIME type (e.g. text/markdown) or 'other'; is_shared is 'true' or 'false'; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3214 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `artifact_type`, `is_shared`, `product`, `rbac_group_id`, `user_id`. Value forms: `artifact_type` is a canonical artifact MIME type (e.g. `text/markdown`) or `other`; `is_shared` is `true` or `false`; `product` is `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
31293215 
31303216 maxItems: 100
31313217 
3132- `group_by: optional array of "rbac_group_id" or "user_id"`
3218- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
31333219 
3134 Dimensions to break results out by: user_id and/or rbac_group_id. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via next_page. rbac_group_id attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
3220 Dimensions to break results out by: `product`, `user_id` and/or `rbac_group_id`. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via `next_page`. `product` takes the values `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts). `rbac_group_id` attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
31353221 
31363222 maxItems: 100
31373223 
3224 - `"product"`
3225 
31383226 - `"rbac_group_id"`
31393227 
31403228 - `"user_id"`
from line 3229
31413229 
31423230- `limit: optional number`
31433231 
3144 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; limit is the page size only when group_by[] multiplies the cube.
3232 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; `limit` is the page size only when `group_by[]` multiplies the cube.
31453233 
31463234 minimum: 1, maximum: 1000
31473235 
31483236- `page: optional string`
31493237 
3150 Opaque cursor from a previous response's next_page field. Only valid with group_by[] — the ungrouped cube is never paginated.
3238 Opaque cursor from a previous response's `next_page` field. Only valid with `group_by[]` — the ungrouped cube is never paginated.
31513239 
31523240#### Returns
31533241 
from line 3244
31563244 Response for GET /v1/organizations/analytics/artifacts.
31573245 
31583246 `next_page` is null on ungrouped queries — the artifact-type cube is
3159 finite and returned in full. Grouped queries (`group_by[]` on `user_id` /
3160 `rbac_group_id`) multiply the cube and paginate like the other analytics
3161 list endpoints.
3247 finite and returned in full. Grouped queries (`group_by[]` on `product` /
3248 `user_id` / `rbac_group_id`) multiply the cube and paginate like the other
3249 analytics list endpoints.
31623250 
31633251 - `data: array of object`
31643252 
31653253 - `artifact_type: string`
31663254 
3167 Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or 'other'.
3255 Canonical artifact MIME type (e.g. `text/markdown`, `application/vnd.ant.react`, `image/svg+xml`), or `other`. Claude Code and Cowork artifacts report as `text/html`.
31683256 
31693257 - `artifacts_created_count: number`
31703258 
from line 3264
31763264 
31773265 - `is_shared: boolean`
31783266 
3179 Whether the artifacts in this bucket have ever been shared.
3267 Whether the artifacts in this bucket have ever been shared (a Claude Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).
31803268 
31813269 - `published_artifacts_created_count: number`
31823270 
3183 Number of those artifacts that have been published
3271 Number of those artifacts that have been published (for Claude Code / Cowork artifacts: open to anyone with the link); never exceeds `artifacts_created_count`
31843272 
31853273 - `product: optional string or null`
31863274 
3187 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
3275 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
31883276 
31893277 - `rbac_group_id: optional string or null`
31903278 
from line 3286
31983286 
31993287 Tagged user identifier (e.g. `user_...`). Present only when the request grouped by `user_id`.
32003288 
3201 - `next_page: optional string or null`
3289 - `next_page: string or null`
32023290 
32033291 Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.
32043292 

api/admin/analytics/artifacts Changed · +27 / -24 lines

from line 6
66 
77Get artifact-creation activity for a given day, broken out by MIME type.
88 
9Returns the full (artifact_type, is_shared) cube for the organization;
9Returns the full (`artifact_type`, `is_shared`) cube for the organization;
1010`next_page` is null except for grouped queries, which paginate. The cube
11can be broken out per member or per RBAC group via group_by[], and scoped
12via filter[]. Requires an API key with the `read:analytics` scope.
11can be broken out per product, per member, or per RBAC group via
12`group_by[]`, and scoped via `filter[]`. Requires an API key with the
13`read:analytics` scope.
1314 
1415### Query parameters
1516 
from line 22
2122 
2223- `filter: optional array of string`
2324 
24 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: artifact_type, is_shared, rbac_group_id, user_id. Value forms: artifact_type is a canonical artifact MIME type (e.g. text/markdown) or 'other'; is_shared is 'true' or 'false'; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
25 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `artifact_type`, `is_shared`, `product`, `rbac_group_id`, `user_id`. Value forms: `artifact_type` is a canonical artifact MIME type (e.g. `text/markdown`) or `other`; `is_shared` is `true` or `false`; `product` is `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
2526 
2627 maxItems: 100
2728 
28- `group_by: optional array of "rbac_group_id" or "user_id"`
29- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
2930 
30 Dimensions to break results out by: user_id and/or rbac_group_id. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via next_page. rbac_group_id attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
31 Dimensions to break results out by: `product`, `user_id` and/or `rbac_group_id`. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via `next_page`. `product` takes the values `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts). `rbac_group_id` attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
3132 
3233 maxItems: 100
3334 
35 - `"product"`
36 
3437 - `"rbac_group_id"`
3538 
3639 - `"user_id"`
from line 40
3740 
3841- `limit: optional number`
3942 
40 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; limit is the page size only when group_by[] multiplies the cube.
43 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; `limit` is the page size only when `group_by[]` multiplies the cube.
4144 
4245 minimum: 1, maximum: 1000
4346 
4447- `page: optional string`
4548 
46 Opaque cursor from a previous response's next_page field. Only valid with group_by[] — the ungrouped cube is never paginated.
49 Opaque cursor from a previous response's `next_page` field. Only valid with `group_by[]` — the ungrouped cube is never paginated.
4750 
4851### Returns
4952 
from line 55
5255 Response for GET /v1/organizations/analytics/artifacts.
5356 
5457 `next_page` is null on ungrouped queries — the artifact-type cube is
55 finite and returned in full. Grouped queries (`group_by[]` on `user_id` /
56 `rbac_group_id`) multiply the cube and paginate like the other analytics
57 list endpoints.
58 finite and returned in full. Grouped queries (`group_by[]` on `product` /
59 `user_id` / `rbac_group_id`) multiply the cube and paginate like the other
60 analytics list endpoints.
5861 
5962 - `data: array of object`
6063 
6164 - `artifact_type: string`
6265 
63 Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or 'other'.
66 Canonical artifact MIME type (e.g. `text/markdown`, `application/vnd.ant.react`, `image/svg+xml`), or `other`. Claude Code and Cowork artifacts report as `text/html`.
6467 
6568 - `artifacts_created_count: number`
6669 
from line 75
7275 
7376 - `is_shared: boolean`
7477 
75 Whether the artifacts in this bucket have ever been shared.
78 Whether the artifacts in this bucket have ever been shared (a Claude Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).
7679 
7780 - `published_artifacts_created_count: number`
7881 
79 Number of those artifacts that have been published
82 Number of those artifacts that have been published (for Claude Code / Cowork artifacts: open to anyone with the link); never exceeds `artifacts_created_count`
8083 
8184 - `product: optional string or null`
8285 
83 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
86 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
8487 
8588 - `rbac_group_id: optional string or null`
8689 
from line 97
9497 
9598 Tagged user identifier (e.g. `user_...`). Present only when the request grouped by `user_id`.
9699 
97 - `next_page: optional string or null`
100 - `next_page: string or null`
98101 
99102 Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.
100103 
from line 139
136139 Response for GET /v1/organizations/analytics/artifacts.
137140 
138141 `next_page` is null on ungrouped queries — the artifact-type cube is
139 finite and returned in full. Grouped queries (`group_by[]` on `user_id` /
140 `rbac_group_id`) multiply the cube and paginate like the other analytics
141 list endpoints.
142 finite and returned in full. Grouped queries (`group_by[]` on `product` /
143 `user_id` / `rbac_group_id`) multiply the cube and paginate like the other
144 analytics list endpoints.
142145 
143146 - `data: array of object`
144147 
145148 - `artifact_type: string`
146149 
147 Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or 'other'.
150 Canonical artifact MIME type (e.g. `text/markdown`, `application/vnd.ant.react`, `image/svg+xml`), or `other`. Claude Code and Cowork artifacts report as `text/html`.
148151 
149152 - `artifacts_created_count: number`
150153 
from line 159
156159 
157160 - `is_shared: boolean`
158161 
159 Whether the artifacts in this bucket have ever been shared.
162 Whether the artifacts in this bucket have ever been shared (a Claude Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).
160163 
161164 - `published_artifacts_created_count: number`
162165 
163 Number of those artifacts that have been published
166 Number of those artifacts that have been published (for Claude Code / Cowork artifacts: open to anyone with the link); never exceeds `artifacts_created_count`
164167 
165168 - `product: optional string or null`
166169 
167 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
170 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
168171 
169172 - `rbac_group_id: optional string or null`
170173 
from line 181
178181 
179182 Tagged user identifier (e.g. `user_...`). Present only when the request grouped by `user_id`.
180183 
181 - `next_page: optional string or null`
184 - `next_page: string or null`
182185 
183186 Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.
184187 

api/admin/analytics/artifacts/list Changed · +19 / -16 lines

from line 4
44 
55Get artifact-creation activity for a given day, broken out by MIME type.
66 
7Returns the full (artifact_type, is_shared) cube for the organization;
7Returns the full (`artifact_type`, `is_shared`) cube for the organization;
88`next_page` is null except for grouped queries, which paginate. The cube
9can be broken out per member or per RBAC group via group_by[], and scoped
10via filter[]. Requires an API key with the `read:analytics` scope.
9can be broken out per product, per member, or per RBAC group via
10`group_by[]`, and scoped via `filter[]`. Requires an API key with the
11`read:analytics` scope.
1112 
1213## Query parameters
1314 
from line 20
1920 
2021- `filter: optional array of string`
2122 
22 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: artifact_type, is_shared, rbac_group_id, user_id. Value forms: artifact_type is a canonical artifact MIME type (e.g. text/markdown) or 'other'; is_shared is 'true' or 'false'; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
23 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `artifact_type`, `is_shared`, `product`, `rbac_group_id`, `user_id`. Value forms: `artifact_type` is a canonical artifact MIME type (e.g. `text/markdown`) or `other`; `is_shared` is `true` or `false`; `product` is `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
2324 
2425 maxItems: 100
2526 
26- `group_by: optional array of "rbac_group_id" or "user_id"`
27- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
2728 
28 Dimensions to break results out by: user_id and/or rbac_group_id. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via next_page. rbac_group_id attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
29 Dimensions to break results out by: `product`, `user_id` and/or `rbac_group_id`. The ungrouped artifact-type cube is finite and returned in full; grouped queries multiply the cube and paginate via `next_page`. `product` takes the values `chat`, `claude_code`, or `cowork` (the surfaces that create artifacts). `rbac_group_id` attributes a user to every group they held at any point during the requested UTC day, so grouped rows are not an exclusive partition. At most 100 entries.
2930 
3031 maxItems: 100
3132 
33 - `"product"`
34 
3235 - `"rbac_group_id"`
3336 
3437 - `"user_id"`
from line 38
3538 
3639- `limit: optional number`
3740 
38 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; limit is the page size only when group_by[] multiplies the cube.
41 Maximum rows to return (1-1000, default 100). The ungrouped artifact-type cube is finite and returned in full; `limit` is the page size only when `group_by[]` multiplies the cube.
3942 
4043 minimum: 1, maximum: 1000
4144 
4245- `page: optional string`
4346 
44 Opaque cursor from a previous response's next_page field. Only valid with group_by[] — the ungrouped cube is never paginated.
47 Opaque cursor from a previous response's `next_page` field. Only valid with `group_by[]` — the ungrouped cube is never paginated.
4548 
4649## Returns
4750 
from line 53
5053 Response for GET /v1/organizations/analytics/artifacts.
5154 
5255 `next_page` is null on ungrouped queries — the artifact-type cube is
53 finite and returned in full. Grouped queries (`group_by[]` on `user_id` /
54 `rbac_group_id`) multiply the cube and paginate like the other analytics
55 list endpoints.
56 finite and returned in full. Grouped queries (`group_by[]` on `product` /
57 `user_id` / `rbac_group_id`) multiply the cube and paginate like the other
58 analytics list endpoints.
5659 
5760 - `data: array of object`
5861 
5962 - `artifact_type: string`
6063 
61 Canonical artifact MIME type (e.g. text/markdown, application/vnd.ant.react, image/svg+xml), or 'other'.
64 Canonical artifact MIME type (e.g. `text/markdown`, `application/vnd.ant.react`, `image/svg+xml`), or `other`. Claude Code and Cowork artifacts report as `text/html`.
6265 
6366 - `artifacts_created_count: number`
6467 
from line 73
7073 
7174 - `is_shared: boolean`
7275 
73 Whether the artifacts in this bucket have ever been shared.
76 Whether the artifacts in this bucket have ever been shared (a Claude Code / Cowork artifact is shared once anyone beyond its creator may open it: named members, the whole organization, or anyone with the link).
7477 
7578 - `published_artifacts_created_count: number`
7679 
77 Number of those artifacts that have been published
80 Number of those artifacts that have been published (for Claude Code / Cowork artifacts: open to anyone with the link); never exceeds `artifacts_created_count`
7881 
7982 - `product: optional string or null`
8083 
81 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
84 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
8285 
8386 - `rbac_group_id: optional string or null`
8487 
from line 95
9295 
9396 Tagged user identifier (e.g. `user_...`). Present only when the request grouped by `user_id`.
9497 
95 - `next_page: optional string or null`
98 - `next_page: string or null`
9699 
97100 Cursor for the next page of a grouped query; always null for the ungrouped artifact-type cube, which is returned in full.
98101 

api/admin/analytics/chat_projects Changed · +23 / -19 lines

from line 7
77Get per-project activity for a given day, with cursor-based pagination.
88 
99Returns activity metrics for each project in the organization, sorted by
10project ID. Use group_by[] to break projects out per member or per RBAC
11group, and filter[] to scope results; the parameter descriptions list the
10project ID. Use `group_by[]` to break projects out per member or per RBAC
11group, and `filter[]` to scope results; the parameter descriptions list the
1212supported dimensions. Available to organizations on a Claude Enterprise
1313plan. Requires an API key with the `read:analytics` scope.
1414 
from line 22
2222 
2323- `ending_date: optional string`
2424 
25 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
25 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2626 
2727 format: date
2828 
2929- `filter: optional array of string`
3030 
31 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
31 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3232 
3333 maxItems: 100
3434 
3535- `group_by: optional array of "rbac_group_id" or "user_id"`
3636 
37 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
37 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3838 
3939 maxItems: 100
4040 
from line 50
5050 
5151- `order: optional "asc" or "desc"`
5252 
53 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
53 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5454 
5555 - `"asc"`
5656 
from line 62
6262 
6363- `page: optional string`
6464 
65 Opaque cursor from a previous response's next_page field.
65 Opaque cursor from a previous response's `next_page` field.
6666 
6767- `starting_date: optional string`
6868 
69 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
69 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7070 
7171 format: date
7272 
from line 88
8888 
8989 - `project_id: string`
9090 
91 Tagged project identifier (e.g. claude_proj_...)
91 Tagged project identifier (e.g. `claude_proj_...`)
9292 
9393 - `project_name: string`
9494 
from line 96
9696 
9797 - `created_at: optional string or null`
9898 
99 Project creation timestamp, RFC 3339. Null if the project was deleted before attribution was recorded.
99 Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.
100100 
101 format: date-time
102 
101103 - `created_by: optional AnalyticsUser or null`
102104 
103 User identifier.
105 A user in the organization, identified by tagged id and email address.
104106 
105107 - `id: string`
106108 
from line 112
110112 
111113 Email address of the user
112114 
113 - `type: optional "user"`
115 - `type: "user"`
114116 
115117 Object type. Always `user`.
116118 
from line 124
122124 
123125 - `product: optional string or null`
124126 
125 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
127 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
126128 
127129 - `rbac_group_id: optional string or null`
128130 
from line 160
158160 "message_count": 0,
159161 "project_id": "project_id",
160162 "project_name": "project_name",
161 "created_at": "created_at",
163 "created_at": "2019-12-27T18:11:19.117Z",
162164 "created_by": {
163165 "id": "id",
164166 "email_address": "email_address",
from line 197
195197 
196198 - `project_id: string`
197199 
198 Tagged project identifier (e.g. claude_proj_...)
200 Tagged project identifier (e.g. `claude_proj_...`)
199201 
200202 - `project_name: string`
201203 
from line 205
203205 
204206 - `created_at: optional string or null`
205207 
206 Project creation timestamp, RFC 3339. Null if the project was deleted before attribution was recorded.
208 Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.
207209 
210 format: date-time
211 
208212 - `created_by: optional AnalyticsUser or null`
209213 
210 User identifier.
214 A user in the organization, identified by tagged id and email address.
211215 
212216 - `id: string`
213217 
from line 221
217221 
218222 Email address of the user
219223 
220 - `type: optional "user"`
224 - `type: "user"`
221225 
222226 Object type. Always `user`.
223227 
from line 233
229233 
230234 - `product: optional string or null`
231235 
232 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
236 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
233237 
234238 - `rbac_group_id: optional string or null`
235239 

api/admin/analytics/chat_projects/list Changed · +16 / -14 lines

from line 5
55Get per-project activity for a given day, with cursor-based pagination.
66 
77Returns activity metrics for each project in the organization, sorted by
8project ID. Use group_by[] to break projects out per member or per RBAC
9group, and filter[] to scope results; the parameter descriptions list the
8project ID. Use `group_by[]` to break projects out per member or per RBAC
9group, and `filter[]` to scope results; the parameter descriptions list the
1010supported dimensions. Available to organizations on a Claude Enterprise
1111plan. Requires an API key with the `read:analytics` scope.
1212 
from line 20
2020 
2121- `ending_date: optional string`
2222 
23 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
23 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2424 
2525 format: date
2626 
2727- `filter: optional array of string`
2828 
29 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
29 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3030 
3131 maxItems: 100
3232 
3333- `group_by: optional array of "rbac_group_id" or "user_id"`
3434 
35 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
35 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3636 
3737 maxItems: 100
3838 
from line 48
4848 
4949- `order: optional "asc" or "desc"`
5050 
51 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
51 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5252 
5353 - `"asc"`
5454 
from line 60
6060 
6161- `page: optional string`
6262 
63 Opaque cursor from a previous response's next_page field.
63 Opaque cursor from a previous response's `next_page` field.
6464 
6565- `starting_date: optional string`
6666 
67 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
67 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
6868 
6969 format: date
7070 
from line 86
8686 
8787 - `project_id: string`
8888 
89 Tagged project identifier (e.g. claude_proj_...)
89 Tagged project identifier (e.g. `claude_proj_...`)
9090 
9191 - `project_name: string`
9292 
from line 94
9494 
9595 - `created_at: optional string or null`
9696 
97 Project creation timestamp, RFC 3339. Null if the project was deleted before attribution was recorded.
97 Project creation timestamp in RFC 3339 format. Null if the project was deleted before attribution was recorded.
9898 
99 format: date-time
100 
99101 - `created_by: optional AnalyticsUser or null`
100102 
101 User identifier.
103 A user in the organization, identified by tagged id and email address.
102104 
103105 - `id: string`
104106 
from line 110
108110 
109111 Email address of the user
110112 
111 - `type: optional "user"`
113 - `type: "user"`
112114 
113115 Object type. Always `user`.
114116 
from line 122
120122 
121123 - `product: optional string or null`
122124 
123 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
125 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
124126 
125127 - `rbac_group_id: optional string or null`
126128 
from line 158
156158 "message_count": 0,
157159 "project_id": "project_id",
158160 "project_name": "project_name",
159 "created_at": "created_at",
161 "created_at": "2019-12-27T18:11:19.117Z",
160162 "created_by": {
161163 "id": "id",
162164 "email_address": "email_address",

api/admin/analytics/connectors Changed · +24 / -24 lines

from line 9
99Returns connector usage metrics for the organization, sorted by connector
1010name. Connector names are normalized from their various sources — for
1111example, "Atlassian MCP server" and "mcp-atlassian" both appear as
12"atlassian". Use group_by[] to break usage out per member, per RBAC
13group, or per product surface, and filter[] to scope results; the
12"atlassian". Use `group_by[]` to break usage out per member, per RBAC
13group, or per product surface, and `filter[]` to scope results; the
1414parameter descriptions list the supported dimensions. Available to
1515organizations on a Claude Enterprise plan. Requires an API key with the
1616`read:analytics` scope.
from line 25
2525 
2626- `ending_date: optional string`
2727 
28 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
28 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2929 
3030 format: date
3131 
3232- `filter: optional array of string`
3333 
34 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: connector_name, product, rbac_group_id, user_id. Value forms: connector_name matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose connector_name is an opaque connector id the connector's display name (connector_display_name) also matches; product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
34 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `connector_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `connector_name` matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose `connector_name` is an opaque connector id the connector's display name (`connector_display_name`) also matches; `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3535 
3636 maxItems: 100
3737 
3838- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
3939 
40 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
40 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
4141 
4242 maxItems: 100
4343 
from line 55
5555 
5656- `order: optional "asc" or "desc"`
5757 
58 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
58 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5959 
6060 - `"asc"`
6161 
from line 67
6767 
6868- `page: optional string`
6969 
70 Opaque cursor from a previous response's next_page field.
70 Opaque cursor from a previous response's `next_page` field.
7171 
7272- `starting_date: optional string`
7373 
74 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
74 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7575 
7676 format: date
7777 
from line 101
101101 
102102 - `connector_name: string`
103103 
104 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.
104 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; `connector_display_name` holds the resolved name for those rows.
105105 
106106 - `cowork_metrics: object`
107107 
from line 141
141141 
142142 - `connector_display_name: optional string or null`
143143 
144 Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:<value> also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
144 Human-readable display name for rows whose `connector_name` is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). `connector_name` remains the row's stable key for sorting and pagination, and `filter[]=connector_name:{value}` also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable `connector_name`. Null when `connector_name` is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
145145 
146146 - `individual_auth_distinct_user_count: optional number or null`
147147 
148 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
148 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to `managed_auth_distinct_user_count`, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
149149 
150150 - `managed_auth_distinct_user_count: optional number or null`
151151 
152 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
152 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on `user_id` and `rbac_group_id` cuts — attributed to the user the credential was provisioned for — but never on a cut that references `product` (group or filter). Date-range rollup mode (`starting_date`/`ending_date`) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
153153 
154154 - `product: optional string or null`
155155 
156 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
156 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
157157 
158158 - `rbac_group_id: optional string or null`
159159 
from line 165
165165 
166166 - `read_call_count: optional number or null`
167167 
168 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.
168 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of `read_call_count`, `write_call_count`, or `unclassified_call_count`, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in `unclassified_call_count`). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (`starting_date`/`ending_date`) applies both rules server-side.
169169 
170170 - `unclassified_call_count: optional number or null`
171171 
172 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
172 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
173173 
174174 - `user_id: optional string or null`
175175 
from line 177
177177 
178178 - `write_call_count: optional number or null`
179179 
180 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
180 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
181181 
182182 - `next_page: string or null`
183183 
from line 266
266266 
267267 - `connector_name: string`
268268 
269 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.
269 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; `connector_display_name` holds the resolved name for those rows.
270270 
271271 - `cowork_metrics: object`
272272 
from line 306
306306 
307307 - `connector_display_name: optional string or null`
308308 
309 Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:<value> also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
309 Human-readable display name for rows whose `connector_name` is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). `connector_name` remains the row's stable key for sorting and pagination, and `filter[]=connector_name:{value}` also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable `connector_name`. Null when `connector_name` is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
310310 
311311 - `individual_auth_distinct_user_count: optional number or null`
312312 
313 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
313 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to `managed_auth_distinct_user_count`, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
314314 
315315 - `managed_auth_distinct_user_count: optional number or null`
316316 
317 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
317 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on `user_id` and `rbac_group_id` cuts — attributed to the user the credential was provisioned for — but never on a cut that references `product` (group or filter). Date-range rollup mode (`starting_date`/`ending_date`) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
318318 
319319 - `product: optional string or null`
320320 
321 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
321 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
322322 
323323 - `rbac_group_id: optional string or null`
324324 
from line 330
330330 
331331 - `read_call_count: optional number or null`
332332 
333 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.
333 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of `read_call_count`, `write_call_count`, or `unclassified_call_count`, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in `unclassified_call_count`). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (`starting_date`/`ending_date`) applies both rules server-side.
334334 
335335 - `unclassified_call_count: optional number or null`
336336 
337 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
337 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
338338 
339339 - `user_id: optional string or null`
340340 
from line 342
342342 
343343 - `write_call_count: optional number or null`
344344 
345 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
345 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
346346 
347347 - `next_page: string or null`
348348 

api/admin/analytics/connectors/list Changed · +16 / -16 lines

from line 7
77Returns connector usage metrics for the organization, sorted by connector
88name. Connector names are normalized from their various sources — for
99example, "Atlassian MCP server" and "mcp-atlassian" both appear as
10"atlassian". Use group_by[] to break usage out per member, per RBAC
11group, or per product surface, and filter[] to scope results; the
10"atlassian". Use `group_by[]` to break usage out per member, per RBAC
11group, or per product surface, and `filter[]` to scope results; the
1212parameter descriptions list the supported dimensions. Available to
1313organizations on a Claude Enterprise plan. Requires an API key with the
1414`read:analytics` scope.
from line 23
2323 
2424- `ending_date: optional string`
2525 
26 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
26 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2727 
2828 format: date
2929 
3030- `filter: optional array of string`
3131 
32 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: connector_name, product, rbac_group_id, user_id. Value forms: connector_name matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose connector_name is an opaque connector id the connector's display name (connector_display_name) also matches; product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
32 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `connector_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `connector_name` matches case-insensitively, a display name such as 'GitHub MCP' also matches its normalized stored form ('github'), and for rows whose `connector_name` is an opaque connector id the connector's display name (`connector_display_name`) also matches; `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3333 
3434 maxItems: 100
3535 
3636- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
3737 
38 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
38 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3939 
4040 maxItems: 100
4141 
from line 53
5353 
5454- `order: optional "asc" or "desc"`
5555 
56 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
56 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5757 
5858 - `"asc"`
5959 
from line 65
6565 
6666- `page: optional string`
6767 
68 Opaque cursor from a previous response's next_page field.
68 Opaque cursor from a previous response's `next_page` field.
6969 
7070- `starting_date: optional string`
7171 
72 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
72 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7373 
7474 format: date
7575 
from line 99
9999 
100100 - `connector_name: string`
101101 
102 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; connector_display_name holds the resolved name for those rows.
102 Name of the connector. Some rows carry an opaque connector id here instead of a readable name; `connector_display_name` holds the resolved name for those rows.
103103 
104104 - `cowork_metrics: object`
105105 
from line 139
139139 
140140 - `connector_display_name: optional string or null`
141141 
142 Human-readable display name for rows whose connector_name is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). connector_name remains the row's stable key for sorting and pagination, and filter[]=connector_name:<value> also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable connector_name. Null when connector_name is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
142 Human-readable display name for rows whose `connector_name` is an opaque connector id rather than a readable name, resolved at request time from the organization's connectors (including connectors that have since been removed). `connector_name` remains the row's stable key for sorting and pagination, and `filter[]=connector_name:{value}` also matches these rows by display name. Display names are not unique, and the same connector's claude.ai usage can appear under a separate row with a readable `connector_name`. Null when `connector_name` is already a readable name, when the id cannot be resolved to one of the organization's connectors, or when display-name resolution is not enabled for this organization.
143143 
144144 - `individual_auth_distinct_user_count: optional number or null`
145145 
146 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to managed_auth_distinct_user_count, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
146 Number of distinct users whose use of this connector on the requested day ran on their own individual credential, connected through their own consent flow. Companion bucket to `managed_auth_distinct_user_count`, which carries the measurement, attribution, and null rules. Users whose requests used no stored credential count in neither bucket.
147147 
148148 - `managed_auth_distinct_user_count: optional number or null`
149149 
150 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on user_id and rbac_group_id cuts — attributed to the user the credential was provisioned for — but never on a cut that references product (group or filter). Date-range rollup mode (starting_date/ending_date) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
150 Number of distinct users whose use of this connector on the requested day ran on Enterprise Managed Auth (an organization-managed credential provisioned through the organization's identity provider), read from the token record each request used. Null, never 0, when managed-auth reporting is not enabled for the organization, the value cannot be attributed to the row, no credentialed requests and no managed-token mint events (a managed credential being provisioned for a user's use of the connector) were observed that day, or the day predates 2026-07-01, the first day the backing data exists (forward-only data, no backfill). When credentialed requests or mint events were observed and attributed, both managed-auth fields populate, reporting 0 for a bucket with no users; the two counts are independent, not a partition — a user whose requests that day used both kinds of credential counts in both. Mint events carry user but not surface attribution, so they count as observed auth activity on `user_id` and `rbac_group_id` cuts — attributed to the user the credential was provisioned for — but never on a cut that references `product` (group or filter). Date-range rollup mode (`starting_date`/`ending_date`) computes both fields exactly over the window — distinct users with at least one qualifying day — when the whole window starts on or after 2026-07-01, with the null-versus-0 and mint-event rules applying with the window in place of the day; a range starting earlier reports every managed-auth field as null, never a partial-window value.
151151 
152152 - `product: optional string or null`
153153 
154 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
154 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
155155 
156156 - `rbac_group_id: optional string or null`
157157 
from line 163
163163 
164164 - `read_call_count: optional number or null`
165165 
166 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of read_call_count, write_call_count, or unclassified_call_count, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in unclassified_call_count). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (starting_date/ending_date) applies both rules server-side.
166 Number of connector tool calls on the requested day whose trusted read-only annotation marked them read-only. Call count, not distinct users. Every call recorded on a classified surface lands in exactly one of `read_call_count`, `write_call_count`, or `unclassified_call_count`, so the three sum to the day's classified calls. Classification is forward-only per surface: claude.ai from 2026-06-01, Claude Code from 2026-05-30, Claude in Office from 2026-05-29, Cowork from 2026-06-02 (Cowork clients predating annotation forwarding land in `unclassified_call_count`). Null, never 0, when the value cannot be stated: the read/write split is not enabled for this organization, or the day predates 2026-05-29. For a date-range total, sum the per-day values, but treat a window that extends before 2026-05-29 as null rather than summing only its covered days — date-range rollup mode (`starting_date`/`ending_date`) applies both rules server-side.
167167 
168168 - `unclassified_call_count: optional number or null`
169169 
170 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
170 Number of connector tool calls on the requested day with no trusted read-only annotation — the annotation is optional in the MCP spec and is discarded when connector access controls are active, so unclassified calls are common. This field shows how much of the day's classified activity the read/write split actually covers. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
171171 
172172 - `user_id: optional string or null`
173173 
from line 175
175175 
176176 - `write_call_count: optional number or null`
177177 
178 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see read_call_count for the per-surface data-start dates, null conditions, and date-range guidance.
178 Number of connector tool calls on the requested day whose trusted read-only annotation marked them not read-only. Call count, not distinct users. One of the three call-classification buckets; see `read_call_count` for the per-surface data-start dates, null conditions, and date-range guidance.
179179 
180180 - `next_page: string or null`
181181 

api/admin/analytics/cost Changed · +59 / -31 lines

from line 85
8585 
8686- `limit: optional number`
8787 
88 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
88 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
8989 
9090 minimum: 1
9191 
from line 99
9999 
100100 Opaque cursor from a previous response's `next_page` field.
101101 
102- `products: optional array of string`
102- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
103103 
104 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
104 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
105105 
106106 maxItems: 100
107107 
108 - `"chat"`
109 
110 - `"claude-tag"`
111 
112 - `"claude_code"`
113 
114 - `"claude_design"`
115 
116 - `"claude_in_chrome"`
117 
118 - `"cowork"`
119 
120 - `"office_agent"`
121 
108122- `rbac_group_ids: optional array of string`
109123 
110124 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 207
193207 
194208 - `model: string or null`
195209 
196 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
210 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
197211 
198212 - `product: string or null`
199213 
200 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
214 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
201215 
202216 - `rbac_group_id: string or null`
203217 
204 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
218 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
205219 
206220 - `requests: number or null`
207221 
from line 294
280294 "currency": "USD",
281295 "inference_geo": "global",
282296 "list_amount": "list_amount",
283 "model": "claude-opus-4-6",
297 "model": "claude-opus-5",
284298 "product": "chat",
285299 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
286300 "requests": 0,
from line 439
425439 
426440 Opaque cursor from a previous response's `next_page` field.
427441 
428- `products: optional array of string`
442- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
429443 
430 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
444 Product surfaces to include. Defaults to all products.
431445 
432446 maxItems: 100
433447 
448 - `"chat"`
449 
450 - `"claude-tag"`
451 
452 - `"claude_code"`
453 
454 - `"claude_design"`
455 
456 - `"claude_in_chrome"`
457 
458 - `"cowork"`
459 
460 - `"office_agent"`
461 
434462- `rbac_group_ids: optional array of string`
435463 
436464 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 501
473501 
474502 - `deleted: boolean`
475503 
476 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
504 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
477505 
478506 - `email: string or null`
479507 
from line 509
481509 
482510 - `name: string or null`
483511 
484 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
512 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
485513 
486514 - `type: "user_actor"`
487515 
from line 567
539567 
540568 - `model: string or null`
541569 
542 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
570 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
543571 
544572 - `product: string or null`
545573 
546 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
574 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
547575 
548576 - `rbac_group_id: string or null`
549577 
550 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
578 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
551579 
552580 - `requests: number or null`
553581 
from line 601
573601 
574602 - `token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null`
575603 
576 Token type when cost_type=tokens; null otherwise.
604 Token type when `cost_type` is `tokens`; null otherwise.
577605 
578606 - `"cache_creation.ephemeral_1h_input_tokens"`
579607 
from line 659
631659 "ending_at": "2019-12-27T18:11:19.117Z",
632660 "inference_geo": "global",
633661 "list_amount": "51600.000000",
634 "model": "claude-opus-4-6",
662 "model": "claude-opus-5",
635663 "product": "chat",
636664 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
637665 "requests": 128,
from line 738
710738 
711739 - `model: string or null`
712740 
713 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
741 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
714742 
715743 - `product: string or null`
716744 
717 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
745 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
718746 
719747 - `rbac_group_id: string or null`
720748 
721 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
749 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
722750 
723751 - `requests: number or null`
724752 
from line 816
788816 
789817 - `deleted: boolean`
790818 
791 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
819 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
792820 
793821 - `email: string or null`
794822 
from line 824
796824 
797825 - `name: string or null`
798826 
799 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
827 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
800828 
801829 - `type: "user_actor"`
802830 
from line 882
854882 
855883 - `model: string or null`
856884 
857 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
885 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
858886 
859887 - `product: string or null`
860888 
861 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
889 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
862890 
863891 - `rbac_group_id: string or null`
864892 
865 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
893 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
866894 
867895 - `requests: number or null`
868896 
from line 916
888916 
889917 - `token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null`
890918 
891 Token type when cost_type=tokens; null otherwise.
919 Token type when `cost_type` is `tokens`; null otherwise.
892920 
893921 - `"cache_creation.ephemeral_1h_input_tokens"`
894922 

api/admin/analytics/cost/list Changed · +24 / -10 lines

from line 83
8383 
8484- `limit: optional number`
8585 
86 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
86 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
8787 
8888 minimum: 1
8989 
from line 97
9797 
9898 Opaque cursor from a previous response's `next_page` field.
9999 
100- `products: optional array of string`
100- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
101101 
102 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
102 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
103103 
104104 maxItems: 100
105105 
106 - `"chat"`
107 
108 - `"claude-tag"`
109 
110 - `"claude_code"`
111 
112 - `"claude_design"`
113 
114 - `"claude_in_chrome"`
115 
116 - `"cowork"`
117 
118 - `"office_agent"`
119 
106120- `rbac_group_ids: optional array of string`
107121 
108122 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 205
191205 
192206 - `model: string or null`
193207 
194 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
208 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
195209 
196210 - `product: string or null`
197211 
198 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
212 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
199213 
200214 - `rbac_group_id: string or null`
201215 
202 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
216 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
203217 
204218 - `requests: number or null`
205219 
from line 292
278292 "currency": "USD",
279293 "inference_geo": "global",
280294 "list_amount": "list_amount",
281 "model": "claude-opus-4-6",
295 "model": "claude-opus-5",
282296 "product": "chat",
283297 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
284298 "requests": 0,

api/admin/analytics/cost/list_by_user Changed · +26 / -12 lines

from line 124
124124 
125125 Opaque cursor from a previous response's `next_page` field.
126126 
127- `products: optional array of string`
127- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
128128 
129 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
129 Product surfaces to include. Defaults to all products.
130130 
131131 maxItems: 100
132132 
133 - `"chat"`
134 
135 - `"claude-tag"`
136 
137 - `"claude_code"`
138 
139 - `"claude_design"`
140 
141 - `"claude_in_chrome"`
142 
143 - `"cowork"`
144 
145 - `"office_agent"`
146 
133147- `rbac_group_ids: optional array of string`
134148 
135149 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 186
172186 
173187 - `deleted: boolean`
174188 
175 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
189 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
176190 
177191 - `email: string or null`
178192 
from line 194
180194 
181195 - `name: string or null`
182196 
183 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
197 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
184198 
185199 - `type: "user_actor"`
186200 
from line 252
238252 
239253 - `model: string or null`
240254 
241 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
255 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
242256 
243257 - `product: string or null`
244258 
245 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
259 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
246260 
247261 - `rbac_group_id: string or null`
248262 
249 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
263 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
250264 
251265 - `requests: number or null`
252266 
from line 286
272286 
273287 - `token_type: "cache_creation.ephemeral_1h_input_tokens" or "cache_creation.ephemeral_5m_input_tokens" or "cache_read_input_tokens" or 2 more or null`
274288 
275 Token type when cost_type=tokens; null otherwise.
289 Token type when `cost_type` is `tokens`; null otherwise.
276290 
277291 - `"cache_creation.ephemeral_1h_input_tokens"`
278292 
from line 344
330344 "ending_at": "2019-12-27T18:11:19.117Z",
331345 "inference_geo": "global",
332346 "list_amount": "51600.000000",
333 "model": "claude-opus-4-6",
347 "model": "claude-opus-5",
334348 "product": "chat",
335349 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
336350 "requests": 128,

api/admin/analytics/plugins Changed · +13 / -13 lines

from line 11
1111an aggregate bucket, not a plugin: it collects plugin activity, from
1212either surface, for which the reporting client did not provide a plugin
1313name — so an organization's own plugins can contribute both to their own
14named rows and to this bucket. Use group_by[] to break usage out per
14named rows and to this bucket. Use `group_by[]` to break usage out per
1515member, per RBAC group, or per product surface (Cowork / Claude Code),
16and filter[] to scope results; the parameter descriptions list the
16and `filter[]` to scope results; the parameter descriptions list the
1717supported dimensions. Requires an API key with the
1818`read:analytics` scope. `starting_date` / `ending_date` select
19range-rollup mode like /skills.
19range-rollup mode like `/skills`.
2020 
2121### Query parameters
2222 
from line 28
2828 
2929- `ending_date: optional string`
3030 
31 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
31 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
3232 
3333 format: date
3434 
3535- `filter: optional array of string`
3636 
37 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: plugin_name, product, rbac_group_id, user_id. Value forms: plugin_name matches case-insensitively; product is claude_code or cowork (the only surfaces with plugin attribution); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
37 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `plugin_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `plugin_name` matches case-insensitively; `product` is `claude_code` or `cowork` (the only surfaces with plugin attribution); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3838 
3939 maxItems: 100
4040 
4141- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
4242 
43 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. On this endpoint product takes the values claude_code or cowork only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
43 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. On this endpoint `product` takes the values `claude_code` or `cowork` only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
4444 
4545 maxItems: 100
4646 
from line 58
5858 
5959- `order: optional "asc" or "desc"`
6060 
61 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
61 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
6262 
6363 - `"asc"`
6464 
from line 70
7070 
7171- `page: optional string`
7272 
73 Opaque cursor from a previous response's next_page field.
73 Opaque cursor from a previous response's `next_page` field.
7474 
7575- `starting_date: optional string`
7676 
77 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
77 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7878 
7979 format: date
8080 
from line 120
120120 
121121 - `plugin_id: optional string or null`
122122 
123 Stable plugin identifier when available (e.g. serena@claude-plugins-official). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
123 Stable plugin identifier when available (e.g. `serena@claude-plugins-official`). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
124124 
125125 - `product: optional string or null`
126126 
127 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
127 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
128128 
129129 - `rbac_group_id: optional string or null`
130130 
from line 221
221221 
222222 - `plugin_id: optional string or null`
223223 
224 Stable plugin identifier when available (e.g. serena@claude-plugins-official). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
224 Stable plugin identifier when available (e.g. `serena@claude-plugins-official`). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
225225 
226226 - `product: optional string or null`
227227 
228 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
228 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
229229 
230230 - `rbac_group_id: optional string or null`
231231 

api/admin/analytics/plugins/list Changed · +11 / -11 lines

from line 9
99an aggregate bucket, not a plugin: it collects plugin activity, from
1010either surface, for which the reporting client did not provide a plugin
1111name — so an organization's own plugins can contribute both to their own
12named rows and to this bucket. Use group_by[] to break usage out per
12named rows and to this bucket. Use `group_by[]` to break usage out per
1313member, per RBAC group, or per product surface (Cowork / Claude Code),
14and filter[] to scope results; the parameter descriptions list the
14and `filter[]` to scope results; the parameter descriptions list the
1515supported dimensions. Requires an API key with the
1616`read:analytics` scope. `starting_date` / `ending_date` select
17range-rollup mode like /skills.
17range-rollup mode like `/skills`.
1818 
1919## Query parameters
2020 
from line 26
2626 
2727- `ending_date: optional string`
2828 
29 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
29 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
3030 
3131 format: date
3232 
3333- `filter: optional array of string`
3434 
35 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: plugin_name, product, rbac_group_id, user_id. Value forms: plugin_name matches case-insensitively; product is claude_code or cowork (the only surfaces with plugin attribution); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
35 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `plugin_name`, `product`, `rbac_group_id`, `user_id`. Value forms: `plugin_name` matches case-insensitively; `product` is `claude_code` or `cowork` (the only surfaces with plugin attribution); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3636 
3737 maxItems: 100
3838 
3939- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
4040 
41 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. On this endpoint product takes the values claude_code or cowork only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
41 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. On this endpoint `product` takes the values `claude_code` or `cowork` only (the surfaces with plugin attribution). Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
4242 
4343 maxItems: 100
4444 
from line 56
5656 
5757- `order: optional "asc" or "desc"`
5858 
59 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
59 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
6060 
6161 - `"asc"`
6262 
from line 68
6868 
6969- `page: optional string`
7070 
71 Opaque cursor from a previous response's next_page field.
71 Opaque cursor from a previous response's `next_page` field.
7272 
7373- `starting_date: optional string`
7474 
75 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
75 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7676 
7777 format: date
7878 
from line 118
118118 
119119 - `plugin_id: optional string or null`
120120 
121 Stable plugin identifier when available (e.g. serena@claude-plugins-official). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
121 Stable plugin identifier when available (e.g. `serena@claude-plugins-official`). Null for third-party Claude Code plugins (redacted at the source) and Cowork slash commands that carry only a hashed id.
122122 
123123 - `product: optional string or null`
124124 
125 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
125 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
126126 
127127 - `rbac_group_id: optional string or null`
128128 

api/admin/analytics/retrieve_summaries Changed · +17 / -12 lines

from line 4
44 
55Get organization-wide activity summaries for a date range.
66 
7Returns one entry per day in [starting_date, ending_date). Data is
8typically available with a 1-day lag and may be revised by a few percent
9over the following days: when ending_date is omitted it defaults to the
10most recent available day + 1, so the last entry covers the most recent
11available day. The series can be scoped to an RBAC group via
12filter[]=rbac_group_id:<id>. Available to organizations on a Claude
13Enterprise plan. Requires an API key with the `read:analytics` scope.
7Returns one entry per day from `starting_date` (inclusive) to `ending_date`
8(exclusive). Data is typically available with a 1-day lag and may be
9revised by a few percent over the following days: when `ending_date` is
10omitted it defaults to the most recent available day + 1, so the last
11entry covers the most recent available day. The series can be scoped to
12an RBAC group via `filter[]=rbac_group_id:{id}`. Available to
13organizations on a Claude Enterprise plan. Requires an API key with the
14`read:analytics` scope.
1415 
1516## Query parameters
1617 
from line 29
2829 
2930- `filter: optional array of string`
3031 
31 Filters as 'dimension:value'. Only rbac_group_id is supported (e.g. filter[]=rbac_group_id:<id>); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. rbac_group_id accepts the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
32 Filters as `dimension:value`. Only `rbac_group_id` is supported (e.g. `filter[]=rbac_group_id:{id}`); repeat the param to OR across groups. Scopes the whole day series to members of the matching group(s), re-aggregated from member-level activity — org-wide seat/invite fields and the adoption rates derived from them are null on scoped rows. `rbac_group_id` accepts the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each UTC day (time-of-usage attribution). At most 100 entries.
3233 
3334 maxItems: 100
3435 
from line 67
6667 
6768 - `ending_at: string`
6869 
69 End time in UTC of aggregation period (e.g. 2026-01-16T00:00:00Z)
70 End of the aggregation period (exclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-16T00:00:00Z`).
7071 
72 format: date-time
73 
7174 - `monthly_active_user_count: number`
7275 
7376 Number of users with token consumption in the 30-day rolling window
from line 85
8285 
8386 - `starting_at: string`
8487 
85 Start time in UTC of aggregation period (e.g. 2026-01-15T00:00:00Z)
88 Start of the aggregation period (inclusive), UTC midnight in RFC 3339 format (e.g. `2026-01-15T00:00:00Z`).
8689 
90 format: date-time
91 
8792 - `weekly_active_user_count: number`
8893 
8994 Number of users with token consumption in the 7-day rolling window
from line 181
176181 "cowork_weekly_active_user_count": 0,
177182 "daily_active_user_count": 0,
178183 "daily_adoption_rate": 0,
179 "ending_at": "ending_at",
184 "ending_at": "2019-12-27T18:11:19.117Z",
180185 "monthly_active_user_count": 0,
181186 "monthly_adoption_rate": 0,
182187 "pending_invite_count": 0,
183 "starting_at": "starting_at",
188 "starting_at": "2019-12-27T18:11:19.117Z",
184189 "weekly_active_user_count": 0,
185190 "weekly_adoption_rate": 0,
186191 "chat_daily_active_user_count": 0,

api/admin/analytics/skills Changed · +41 / -29 lines

from line 7
77Get per-skill usage for a given day, with cursor-based pagination.
88 
99Returns skill usage metrics for the organization, sorted by skill name.
10Use group_by[] to break usage out per member, per RBAC group, or per
11product surface, and filter[] to scope results; the parameter
10Use `group_by[]` to break usage out per member, per RBAC group, or per
11product surface, and `filter[]` to scope results; the parameter
1212descriptions list the supported dimensions. Available to organizations
1313on a Claude Enterprise plan. Requires an API key with the
1414`read:analytics` scope.
from line 23
2323 
2424- `ending_date: optional string`
2525 
26 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
26 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2727 
2828 format: date
2929 
3030- `filter: optional array of string`
3131 
32 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: product, rbac_group_id, share_status, skill_name, user_id. Value forms: product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); share_status is one of organization, private, or public; skill_name matches case-insensitively; user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
32 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `product`, `rbac_group_id`, `share_status`, `skill_name`, `user_id`. Value forms: `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `share_status` is one of `organization`, `private`, or `public`; `skill_name` matches case-insensitively; `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3333 
3434 maxItems: 100
3535 
3636- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
3737 
38 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
38 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3939 
4040 maxItems: 100
4141 
from line 53
5353 
5454- `order: optional "asc" or "desc"`
5555 
56 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
56 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5757 
5858 - `"asc"`
5959 
from line 65
6565 
6666- `page: optional string`
6767 
68 Opaque cursor from a previous response's next_page field.
68 Opaque cursor from a previous response's `next_page` field.
6969 
7070- `starting_date: optional string`
7171 
72 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
72 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7373 
7474 format: date
7575 
from line 139
139139 
140140 - `attributed_list_price: optional string or null`
141141 
142 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that INVOLVED the skill, not the skill's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does NOT tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
142 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the skill, not the skill's incremental cost. Unlike `estimated_overage_spend` this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on `chat` product rows and on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as `estimated_overage_spend` (spend reporting not enabled for this organization, `office_agent` product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
143143 
144144 - `currency: optional "USD" or null`
145145 
146 Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
146 Currency for this row's monetary fields (`estimated_overage_spend` and `attributed_list_price`), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
147147 
148148 - `enable_count: optional number or null`
149149 
150 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).
150 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin `install_count`). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (`starting_date`/`ending_date`).
151151 
152152 - `estimated_overage_spend: optional string or null`
153153 
154 Estimated OVERAGE spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that INVOLVED the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
154 Estimated overage spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see `attributed_list_price` for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (`starting_date`/`ending_date`) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
155155 
156156 - `invocation_count: optional number or null`
157157 
158 Total number of times this skill was invoked on the requested day (the skill analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.
158 Total number of times this skill was invoked on the requested day (the skill analog of plugin `invocation_count`). Unlike `distinct_user_count` — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (`starting_date`/`ending_date`) returns this sum directly.
159159 
160160 - `product: optional string or null`
161161 
162 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
162 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
163163 
164164 - `rbac_group_id: optional string or null`
165165 
from line 169
169169 
170170 Resolved RBAC group display name, alongside `rbac_group_id` when name resolution is available. Null if the group has been deleted or its name could not be resolved; `rbac_group_id` remains the stable key.
171171 
172 - `share_status: optional string or null`
172 - `share_status: optional "organization" or "private" or "public" or null`
173173 
174 Skill share status (claude.ai only): one of 'private', 'organization', or 'public'. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:<value>`.
174 Skill share status (claude.ai only): one of `private`, `organization`, or `public`. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:{value}`.
175175 
176 - `"organization"`
177 
178 - `"private"`
179 
180 - `"public"`
181 
176182 - `skill_display_name: optional string or null`
177183 
178 Human-readable display name for rows whose skill_name is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when skill_name is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
184 Human-readable display name for rows whose `skill_name` is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when `skill_name` is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
179185 
180186 - `user_id: optional string or null`
181187 
from line 238
232238 "product": "product",
233239 "rbac_group_id": "rbac_group_id",
234240 "rbac_group_name": "rbac_group_name",
235 "share_status": "share_status",
241 "share_status": "organization",
236242 "skill_display_name": "skill_display_name",
237243 "user_id": "user_id"
238244 }
from line 315
309315 
310316 - `attributed_list_price: optional string or null`
311317 
312 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that INVOLVED the skill, not the skill's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does NOT tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
318 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the skill, not the skill's incremental cost. Unlike `estimated_overage_spend` this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on `chat` product rows and on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as `estimated_overage_spend` (spend reporting not enabled for this organization, `office_agent` product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
313319 
314320 - `currency: optional "USD" or null`
315321 
316 Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
322 Currency for this row's monetary fields (`estimated_overage_spend` and `attributed_list_price`), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
317323 
318324 - `enable_count: optional number or null`
319325 
320 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).
326 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin `install_count`). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (`starting_date`/`ending_date`).
321327 
322328 - `estimated_overage_spend: optional string or null`
323329 
324 Estimated OVERAGE spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that INVOLVED the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
330 Estimated overage spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see `attributed_list_price` for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (`starting_date`/`ending_date`) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
325331 
326332 - `invocation_count: optional number or null`
327333 
328 Total number of times this skill was invoked on the requested day (the skill analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.
334 Total number of times this skill was invoked on the requested day (the skill analog of plugin `invocation_count`). Unlike `distinct_user_count` — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (`starting_date`/`ending_date`) returns this sum directly.
329335 
330336 - `product: optional string or null`
331337 
332 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
338 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
333339 
334340 - `rbac_group_id: optional string or null`
335341 
from line 345
339345 
340346 Resolved RBAC group display name, alongside `rbac_group_id` when name resolution is available. Null if the group has been deleted or its name could not be resolved; `rbac_group_id` remains the stable key.
341347 
342 - `share_status: optional string or null`
348 - `share_status: optional "organization" or "private" or "public" or null`
343349 
344 Skill share status (claude.ai only): one of 'private', 'organization', or 'public'. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:<value>`.
350 Skill share status (claude.ai only): one of `private`, `organization`, or `public`. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:{value}`.
345351 
352 - `"organization"`
353 
354 - `"private"`
355 
356 - `"public"`
357 
346358 - `skill_display_name: optional string or null`
347359 
348 Human-readable display name for rows whose skill_name is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when skill_name is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
360 Human-readable display name for rows whose `skill_name` is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when `skill_name` is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
349361 
350362 - `user_id: optional string or null`
351363 

api/admin/analytics/skills/list Changed · +25 / -19 lines

from line 5
55Get per-skill usage for a given day, with cursor-based pagination.
66 
77Returns skill usage metrics for the organization, sorted by skill name.
8Use group_by[] to break usage out per member, per RBAC group, or per
9product surface, and filter[] to scope results; the parameter
8Use `group_by[]` to break usage out per member, per RBAC group, or per
9product surface, and `filter[]` to scope results; the parameter
1010descriptions list the supported dimensions. Available to organizations
1111on a Claude Enterprise plan. Requires an API key with the
1212`read:analytics` scope.
from line 21
2121 
2222- `ending_date: optional string`
2323 
24 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
24 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2525 
2626 format: date
2727 
2828- `filter: optional array of string`
2929 
30 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: product, rbac_group_id, share_status, skill_name, user_id. Value forms: product is one of chat, claude_code, cowork, or office_agent; rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); share_status is one of organization, private, or public; skill_name matches case-insensitively; user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
30 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `product`, `rbac_group_id`, `share_status`, `skill_name`, `user_id`. Value forms: `product` is one of `chat`, `claude_code`, `cowork`, or `office_agent`; `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `share_status` is one of `organization`, `private`, or `public`; `skill_name` matches case-insensitively; `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3131 
3232 maxItems: 100
3333 
3434- `group_by: optional array of "product" or "rbac_group_id" or "user_id"`
3535 
36 Dimensions to break results out by (e.g. group_by[]=user_id). Supported on this endpoint: product, rbac_group_id, user_id. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
36 Dimensions to break results out by (e.g. `group_by[]=user_id`). Supported on this endpoint: `product`, `rbac_group_id`, `user_id`. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3737 
3838 maxItems: 100
3939 
from line 51
5151 
5252- `order: optional "asc" or "desc"`
5353 
54 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
54 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5555 
5656 - `"asc"`
5757 
from line 63
6363 
6464- `page: optional string`
6565 
66 Opaque cursor from a previous response's next_page field.
66 Opaque cursor from a previous response's `next_page` field.
6767 
6868- `starting_date: optional string`
6969 
70 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
70 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
7171 
7272 format: date
7373 
from line 137
137137 
138138 - `attributed_list_price: optional string or null`
139139 
140 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that INVOLVED the skill, not the skill's incremental cost. Unlike estimated_overage_spend this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does NOT tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on chat product rows and on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as estimated_overage_spend (spend reporting not enabled for this organization, office_agent product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
140 List-price (rate-card) value of the member requests attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD), from Claude Code, Cowork, and Office Agent request-level attribution — the value of requests that involved the skill, not the skill's incremental cost. Unlike `estimated_overage_spend` this reflects usage value regardless of how it was funded — seat-covered usage counts — but it is undiscounted and does not tie to billed spend or the organization's spend reporting. claude.ai chat usage carries no request-level attribution and contributes nothing: the field is null on `chat` product rows and on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start), and on ungrouped rows it covers the Claude Code + Cowork + Office Agent share only (null when no attributable usage exists). Also null under the same conditions as `estimated_overage_spend` (spend reporting not enabled for this organization, `office_agent` product cuts before the 2026-06-18 data-start). "0" means attributable usage existed but none was attributed to this skill. Addable across days: date-range rollup mode returns the window's sum. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
141141 
142142 - `currency: optional "USD" or null`
143143 
144 Currency for this row's monetary fields (estimated_overage_spend and attributed_list_price), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
144 Currency for this row's monetary fields (`estimated_overage_spend` and `attributed_list_price`), as an uppercase ISO-4217 code. Always "USD" when either amount is populated; null whenever both amounts are null.
145145 
146146 - `enable_count: optional number or null`
147147 
148 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin install_count). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (starting_date/ending_date).
148 Distinct accounts that enabled this skill on the requested day (claude.ai only — the skill analog of plugin `install_count`). The count is org-wide: null when enable reporting is not enabled for this organization, or when the request scopes to `user_id` / `rbac_group_id` / `product` via `group_by[]` or `filter[]` (an org-wide count would be misleading on per-cut rows). A distinct count, not an event count: summing across days double-counts members who enable the skill on more than one day, so it is also null in date-range rollup mode (`starting_date`/`ending_date`).
149149 
150150 - `estimated_overage_spend: optional string or null`
151151 
152 Estimated OVERAGE spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see attributed_list_price for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that INVOLVED the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on office_agent product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (starting_date/ending_date) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
152 Estimated overage spend attributed to this skill, as a decimal string in the minor unit of `currency` (cents for USD; "1250" is $12.50, fractional cents possible) — an allocation of each member's daily post-discount, pre-credit metered overage spend (the same cost basis as the organization's spend reporting and the Cost & Usage API, so per-skill figures are directly comparable; spend with no skill attribution — including any member-day without skill invocations — is not represented, so skill rows sum to at most those totals) across the skills the member used. Overage only: usage covered by included seat allowances bills nothing and allocates $0 here — see `attributed_list_price` for the funding-independent usage-value companion. Claude Code, Cowork, and Office Agent spend use request-level skill attribution; claude.ai chat spend is approximated proportionally to skill-invoking messages. An estimate, not a billing number — and the cost of the requests/messages that involved the skill, not the skill's incremental cost (the same request would still have cost something without the skill active). "0" means no overage spend was attributed; null when spend reporting is not enabled for this organization, on `office_agent` product cuts dated before 2026-06-18 (the Office Agent attribution data-start). Addable across days: date-range rollup mode (`starting_date`/`ending_date`) returns the window's sum. With `group_by[]=user_id` each row carries the user's own attributed spend. On `group_by[]` and `filter[]` shapes both amounts can total below the ungrouped value for the same skill over the same date or range: spend attributed to a member–skill pair with no counted usage on that day is excluded from those cuts.
153153 
154154 - `invocation_count: optional number or null`
155155 
156 Total number of times this skill was invoked on the requested day (the skill analog of plugin invocation_count). Unlike distinct_user_count — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (starting_date/ending_date) returns this sum directly.
156 Total number of times this skill was invoked on the requested day (the skill analog of plugin `invocation_count`). Unlike `distinct_user_count` — which answers '\# of users' — this is the true '# of uses'. A skill counts as used only when it is explicitly activated — the model (or the user, via the skill's slash command) invokes it, reading its instructions into context as part of that activation. Skills that are merely installed or listed as available, or whose content reaches the context without an activation (preloaded, hook-injected, or read as a plain file), are not counted. Null when invocation reporting is not enabled for this organization. Sum across a date range for total uses in the window — date-range rollup mode (`starting_date`/`ending_date`) returns this sum directly.
157157 
158158 - `product: optional string or null`
159159 
160 Product that produced this row's activity: one of chat, claude_code, cowork, or office_agent (the canonical Cost & Usage product naming; an office_agent row's per-surface breakdown is in its office_metrics). On /plugins only cowork and claude_code occur (the only surfaces with plugin attribution); /artifacts and /apps/chat/projects do not support the product dimension (a product `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by product.
160 Product that produced this row's activity: one of `chat`, `claude_code`, `cowork`, or `office_agent` (the canonical Cost & Usage product naming; an `office_agent` row's per-surface breakdown is in its `office_metrics`). On `/plugins` only `cowork` and `claude_code` occur (the only surfaces with plugin attribution); on `/artifacts` only `chat`, `claude_code`, and `cowork` occur (the surfaces that create artifacts); `/apps/chat/projects` does not support the product dimension (a `product` entry in `group_by[]` or `filter[]` there is rejected). Present only when the request grouped by `product`.
161161 
162162 - `rbac_group_id: optional string or null`
163163 
from line 167
167167 
168168 Resolved RBAC group display name, alongside `rbac_group_id` when name resolution is available. Null if the group has been deleted or its name could not be resolved; `rbac_group_id` remains the stable key.
169169 
170 - `share_status: optional string or null`
170 - `share_status: optional "organization" or "private" or "public" or null`
171171 
172 Skill share status (claude.ai only): one of 'private', 'organization', or 'public'. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:<value>`.
172 Skill share status (claude.ai only): one of `private`, `organization`, or `public`. Null for skills used only in Claude Code or Office (no per-skill share-status concept) and when share-status reporting is not yet available for the organization. Filterable via `filter[]=share_status:{value}`.
173173 
174 - `"organization"`
175 
176 - `"private"`
177 
178 - `"public"`
179 
174180 - `skill_display_name: optional string or null`
175181 
176 Human-readable display name for rows whose skill_name is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when skill_name is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
182 Human-readable display name for rows whose `skill_name` is an opaque skill id (user/organization skill types — user-defined names are withheld from the analytics pipeline). Only organization-shared skills resolve; the literal 'unknown' bucket row also gets a fixed 'Unknown skill' label. Null for private (user-defined) skills — their names are not disclosed to analytics-key holders — and null when `skill_name` is already a display name, when the skill was deleted, or when display-name resolution is not enabled for this organization.
177183 
178184 - `user_id: optional string or null`
179185 
from line 236
230236 "product": "product",
231237 "rbac_group_id": "rbac_group_id",
232238 "rbac_group_name": "rbac_group_name",
233 "share_status": "share_status",
239 "share_status": "organization",
234240 "skill_display_name": "skill_display_name",
235241 "user_id": "user_id"
236242 }

api/admin/analytics/usage Changed · +59 / -31 lines

from line 81
8181 
8282- `limit: optional number`
8383 
84 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
84 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
8585 
8686 minimum: 1
8787 
from line 95
9595 
9696 Opaque cursor from a previous response's `next_page` field.
9797 
98- `products: optional array of string`
98- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
9999 
100 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
100 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
101101 
102102 maxItems: 100
103103 
104 - `"chat"`
105 
106 - `"claude-tag"`
107 
108 - `"claude_code"`
109 
110 - `"claude_design"`
111 
112 - `"claude_in_chrome"`
113 
114 - `"cowork"`
115 
116 - `"office_agent"`
117 
104118- `rbac_group_ids: optional array of string`
105119 
106120 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 195
181195 
182196 - `model: string or null`
183197 
184 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
198 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
185199 
186200 - `output_tokens: number`
187201 
from line 203
189203 
190204 - `product: string or null`
191205 
192 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
206 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
193207 
194208 - `rbac_group_id: string or null`
195209 
196 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
210 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
197211 
198212 - `requests: number or null`
199213 
from line 285
271285 "cache_read_input_tokens": 0,
272286 "context_window": "0-200k",
273287 "inference_geo": "global",
274 "model": "claude-opus-4-6",
288 "model": "claude-opus-5",
275289 "output_tokens": 0,
276290 "product": "chat",
277291 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 434
420434 
421435 Opaque cursor from a previous response's `next_page` field.
422436 
423- `products: optional array of string`
437- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
424438 
425 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
439 Product surfaces to include. Defaults to all products.
426440 
427441 maxItems: 100
428442 
443 - `"chat"`
444 
445 - `"claude-tag"`
446 
447 - `"claude_code"`
448 
449 - `"claude_design"`
450 
451 - `"claude_in_chrome"`
452 
453 - `"cowork"`
454 
455 - `"office_agent"`
456 
429457- `rbac_group_ids: optional array of string`
430458 
431459 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 496
468496 
469497 - `deleted: boolean`
470498 
471 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
499 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
472500 
473501 - `email: string or null`
474502 
from line 504
476504 
477505 - `name: string or null`
478506 
479 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
507 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
480508 
481509 - `type: "user_actor"`
482510 
from line 554
526554 
527555 - `model: string or null`
528556 
529 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
557 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
530558 
531559 - `output_tokens: number`
532560 
from line 562
534562 
535563 - `product: string or null`
536564 
537 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
565 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
538566 
539567 - `rbac_group_id: string or null`
540568 
541 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
569 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
542570 
543571 - `requests: number or null`
544572 
from line 600
572600 
573601 - `total_tokens: number`
574602 
575 Total token count across all token types. This is the value the default order_by='total_tokens' sorts on.
603 Total token count across all token types. This is the value the default `order_by` (`total_tokens`) sorts on.
576604 
577605 - `uncached_input_tokens: number`
578606 
from line 653
625653 "context_window": "0-200k",
626654 "ending_at": "2019-12-27T18:11:19.117Z",
627655 "inference_geo": "global",
628 "model": "claude-opus-4-6",
656 "model": "claude-opus-5",
629657 "output_tokens": 891000,
630658 "product": "chat",
631659 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",
from line 729
701729 
702730 - `model: string or null`
703731 
704 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
732 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
705733 
706734 - `output_tokens: number`
707735 
from line 737
709737 
710738 - `product: string or null`
711739 
712 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
740 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
713741 
714742 - `rbac_group_id: string or null`
715743 
716 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
744 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
717745 
718746 - `requests: number or null`
719747 
from line 809
781809 
782810 - `deleted: boolean`
783811 
784 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
812 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
785813 
786814 - `email: string or null`
787815 
from line 817
789817 
790818 - `name: string or null`
791819 
792 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
820 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
793821 
794822 - `type: "user_actor"`
795823 
from line 867
839867 
840868 - `model: string or null`
841869 
842 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
870 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
843871 
844872 - `output_tokens: number`
845873 
from line 875
847875 
848876 - `product: string or null`
849877 
850 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
878 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
851879 
852880 - `rbac_group_id: string or null`
853881 
854 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
882 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
855883 
856884 - `requests: number or null`
857885 
from line 913
885913 
886914 - `total_tokens: number`
887915 
888 Total token count across all token types. This is the value the default order_by='total_tokens' sorts on.
916 Total token count across all token types. This is the value the default `order_by` (`total_tokens`) sorts on.
889917 
890918 - `uncached_input_tokens: number`
891919 

api/admin/analytics/usage/list Changed · +24 / -10 lines

from line 79
7979 
8080- `limit: optional number`
8181 
82 Maximum number of time buckets per page. Defaults and caps vary by bucket_width (1d: default 7, max 31; 1h: default 24, max 168; 1m: default 60, max 256).
82 Maximum number of time buckets per page. Defaults and caps vary by `bucket_width` (`1d`: default 7, max 31; `1h`: default 24, max 168; `1m`: default 60, max 256).
8383 
8484 minimum: 1
8585 
from line 93
9393 
9494 Opaque cursor from a previous response's `next_page` field.
9595 
96- `products: optional array of string`
96- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
9797 
98 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
98 Product surfaces to include. Defaults to all products. Use `group_by[]=product` to break out per-product values.
9999 
100100 maxItems: 100
101101 
102 - `"chat"`
103 
104 - `"claude-tag"`
105 
106 - `"claude_code"`
107 
108 - `"claude_design"`
109 
110 - `"claude_in_chrome"`
111 
112 - `"cowork"`
113 
114 - `"office_agent"`
115 
102116- `rbac_group_ids: optional array of string`
103117 
104118 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 193
179193 
180194 - `model: string or null`
181195 
182 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
196 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
183197 
184198 - `output_tokens: number`
185199 
from line 201
187201 
188202 - `product: string or null`
189203 
190 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
204 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
191205 
192206 - `rbac_group_id: string or null`
193207 
194 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
208 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
195209 
196210 - `requests: number or null`
197211 
from line 283
269283 "cache_read_input_tokens": 0,
270284 "context_window": "0-200k",
271285 "inference_geo": "global",
272 "model": "claude-opus-4-6",
286 "model": "claude-opus-5",
273287 "output_tokens": 0,
274288 "product": "chat",
275289 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",

api/admin/analytics/usage/list_by_user Changed · +26 / -12 lines

from line 124
124124 
125125 Opaque cursor from a previous response's `next_page` field.
126126 
127- `products: optional array of string`
127- `products: optional array of "chat" or "claude-tag" or "claude_code" or 4 more`
128128 
129 Product surfaces to include. Defaults to all products. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it.
129 Product surfaces to include. Defaults to all products.
130130 
131131 maxItems: 100
132132 
133 - `"chat"`
134 
135 - `"claude-tag"`
136 
137 - `"claude_code"`
138 
139 - `"claude_design"`
140 
141 - `"claude_in_chrome"`
142 
143 - `"cowork"`
144 
145 - `"office_agent"`
146 
133147- `rbac_group_ids: optional array of string`
134148 
135149 Filter to usage attributed to specific RBAC groups. Accepts tagged RBAC group IDs (`rbac_group_...`) or bare group UUIDs. A row matches when the user belonged to any of the listed groups on the (UTC) day the usage occurred; usage with no group attribution never matches.
from line 186
172186 
173187 - `deleted: boolean`
174188 
175 True when the user is no longer a member of the organization or its associated organizations: either their membership was removed (for example, deprovisioned via your identity provider) or the account itself has been deleted. The flag reflects organization membership, not account status. `name` and `email` stay populated for removed members; `name` is `"Deleted User"` and `email` null when the account has been deleted. The `user_id` is still populated for reconciliation.
189 True when the account has been deleted, or when the user is no longer a member of the organization or its associated organizations (for example, their membership was removed or they were deprovisioned via your identity provider). `email` stays populated for removed users and is null when the account has been deleted. `name` follows the rules described on that field. The `user_id` is still populated for reconciliation.
176190 
177191 - `email: string or null`
178192 
from line 194
180194 
181195 - `name: string or null`
182196 
183 The user's current name, including for users who are no longer members of the organization or its associated organizations. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
197 The user's full name. Null when the user has not set a name. Returns `"Deleted User"` when the account itself has been deleted, or when the user is no longer a member of the organization or its associated organizations and the organization has chosen to hide the names of removed users. Otherwise, the name stays populated for removed users. Rows for system-minted service accounts render the service name (for example, `"Claude Security"` for usage by Anthropic's security-patching service) or null.
184198 
185199 - `type: "user_actor"`
186200 
from line 244
230244 
231245 - `model: string or null`
232246 
233 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-4-6`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
247 Model that produced the usage or cost, as a model name in the form the `models[]` filter accepts (for example, `claude-opus-5`). Null unless `model` is in `group_by[]`; it can also be null on grouped rows whose usage or cost is not attributed to a specific model, such as code execution.
234248 
235249 - `output_tokens: number`
236250 
from line 252
238252 
239253 - `product: string or null`
240254 
241 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include "chat", "claude_code", "cowork", "office_agent", "claude_in_chrome", "claude_design", and "claude-in-slack". "claude-in-slack" (with hyphens) is Claude Tag, the Claude product in Slack. A similarly spelled legacy value (underscores instead of hyphens) identifies the retiring v1 Slack chat bot and appears only for organizations that used it. Some unattributed usage is reported as "other".
255 Product surface that produced the usage or cost. Null unless product is in `group_by[]`; it can also be null on grouped rows whose usage cannot be attributed to a known surface. Values include `chat`, `claude_code`, `cowork`, `office_agent`, `claude_in_chrome`, `claude_design`, and `claude-tag`. `claude-tag` is Claude Tag, the Claude product in Slack. Some unattributed usage is reported as "other".
242256 
243257 - `rbac_group_id: string or null`
244258 
245 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has ONE id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query with no group_by.
259 RBAC group (team) the usage is attributed to, in the public tagged `rbac_group_...` spelling — the same spelling the activity resources use for this key, so the same team has one id across resources and it round-trips as an `rbac_group_ids[]` filter value. Populated only when `rbac_group_id` is in `group_by[]`. Any-membership semantics: a user in several groups contributes their full usage to each of those groups' rows, so the named-group rows overlap and their sum can exceed the org total. A null value is the single unassigned row: users in no group on that (UTC) day. For the true org total, run the same query without `group_by[]`.
246260 
247261 - `requests: number or null`
248262 
from line 290
276290 
277291 - `total_tokens: number`
278292 
279 Total token count across all token types. This is the value the default order_by='total_tokens' sorts on.
293 Total token count across all token types. This is the value the default `order_by` (`total_tokens`) sorts on.
280294 
281295 - `uncached_input_tokens: number`
282296 
from line 343
329343 "context_window": "0-200k",
330344 "ending_at": "2019-12-27T18:11:19.117Z",
331345 "inference_geo": "global",
332 "model": "claude-opus-4-6",
346 "model": "claude-opus-5",
333347 "output_tokens": 891000,
334348 "product": "chat",
335349 "rbac_group_id": "rbac_group_012rppKaSVsmTo6NqRDXQXNF",

api/admin/analytics/users Changed · +36 / -14 lines

from line 7
77Get per-user activity for a given day, with cursor-based pagination.
88 
99Returns activity metrics for each user in the organization, sorted by email
10address. Use group_by[] for per-RBAC-group aggregates, or filter[] to
10address. Use `group_by[]` for per-RBAC-group aggregates, or `filter[]` to
1111scope results to specific members, groups, or a chat project. Available
1212to organizations on a Claude Enterprise plan. Requires an API key with
1313the `read:analytics` scope.
from line 22
2222 
2323- `ending_date: optional string`
2424 
25 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
25 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2626 
2727 format: date
2828 
2929- `filter: optional array of string`
3030 
31 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with group_by[] or an rbac_group_id filter); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
31 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with `group_by[]` or an `rbac_group_id` filter); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3232 
3333 maxItems: 100
3434 
3535- `group_by: optional array of "rbac_group_id"`
3636 
37 Dimensions to break results out by (e.g. group_by[]=rbac_group_id). Supported on this endpoint: rbac_group_id. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
37 Dimensions to break results out by (e.g. `group_by[]=rbac_group_id`). Supported on this endpoint: `rbac_group_id`. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3838 
3939 maxItems: 100
4040 
from line 46
4646 
4747- `order: optional "asc" or "desc"`
4848 
49 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
49 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
5050 
5151 - `"asc"`
5252 
from line 58
5858 
5959- `page: optional string`
6060 
61 Opaque cursor from a previous response's next_page field.
61 Opaque cursor from a previous response's `next_page` field.
6262 
6363- `starting_date: optional string`
6464 
65 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
65 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
6666 
6767 format: date
6868 
from line 134
134134 
135135 Core Claude Code activity metrics for a single user on a given day.
136136 
137 - `artifacts_created_count: number`
138 
139 Number of artifacts created in Claude Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
140 
137141 - `commit_count: number`
138142 
139143 Number of commits made via Claude Code
from line 198
194198 
195199 Number of tool actions completed in Cowork sessions
196200 
201 - `artifacts_created_count: number`
202 
203 Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
204 
197205 - `connectors_used_count: number`
198206 
199207 Total number of connector invocations in Cowork sessions
from line 360
352360 
353361 - `last_activity_date: optional string or null`
354362 
355 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day in [starting_date, ending_date) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id` it is the last day the user was active while a member of that group, consistent with the row's other metrics. Null on grouped (`group_by[]`) rows. Omitted from the response while last-activity reporting is not enabled for this organization.
363 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested `date` in single-day mode, and to the latest active day from `starting_date` (inclusive) to `ending_date` (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id:{id}` it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (`group_by[]`) rows it is the latest day any member of the group was active (the requested `date` in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.
356364 
365 format: date
366 
357367 - `rbac_group_id: optional string or null`
358368 
359369 Tagged RBAC group identifier (`rbac_group_...`), matching the spend-limits API spelling. Present only when the request grouped by `rbac_group_id`.
from line 374
364374 
365375 - `user: optional AnalyticsUser or null`
366376 
367 User identifier.
377 A user in the organization, identified by tagged id and email address.
368378 
369379 - `id: string`
370380 
from line 384
374384 
375385 Email address of the user
376386 
377 - `type: optional "user"`
387 - `type: "user"`
378388 
379389 Object type. Always `user`.
380390 
from line 424
414424 },
415425 "claude_code_metrics": {
416426 "core_metrics": {
427 "artifacts_created_count": 0,
417428 "commit_count": 0,
418429 "distinct_session_count": 0,
419430 "lines_of_code": {
from line 454
443454 },
444455 "cowork_metrics": {
445456 "action_count": 0,
457 "artifacts_created_count": 0,
446458 "connectors_used_count": 0,
447459 "dispatch_turn_count": 0,
448460 "distinct_connectors_used_count": 0,
from line 520
508520 },
509521 "web_search_count": 0,
510522 "distinct_user_count": 0,
511 "last_activity_date": "last_activity_date",
523 "last_activity_date": "2019-12-27",
512524 "rbac_group_id": "rbac_group_id",
513525 "rbac_group_name": "rbac_group_name",
514526 "user": {
from line 604
592604 
593605 Core Claude Code activity metrics for a single user on a given day.
594606 
607 - `artifacts_created_count: number`
608 
609 Number of artifacts created in Claude Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
610 
595611 - `commit_count: number`
596612 
597613 Number of commits made via Claude Code
from line 668
652668 
653669 Number of tool actions completed in Cowork sessions
654670 
671 - `artifacts_created_count: number`
672 
673 Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
674 
655675 - `connectors_used_count: number`
656676 
657677 Total number of connector invocations in Cowork sessions
from line 830
810830 
811831 - `last_activity_date: optional string or null`
812832 
813 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day in [starting_date, ending_date) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id` it is the last day the user was active while a member of that group, consistent with the row's other metrics. Null on grouped (`group_by[]`) rows. Omitted from the response while last-activity reporting is not enabled for this organization.
833 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested `date` in single-day mode, and to the latest active day from `starting_date` (inclusive) to `ending_date` (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id:{id}` it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (`group_by[]`) rows it is the latest day any member of the group was active (the requested `date` in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.
814834 
835 format: date
836 
815837 - `rbac_group_id: optional string or null`
816838 
817839 Tagged RBAC group identifier (`rbac_group_...`), matching the spend-limits API spelling. Present only when the request grouped by `rbac_group_id`.
from line 844
822844 
823845 - `user: optional AnalyticsUser or null`
824846 
825 User identifier.
847 A user in the organization, identified by tagged id and email address.
826848 
827849 - `id: string`
828850 
from line 854
832854 
833855 Email address of the user
834856 
835 - `type: optional "user"`
857 - `type: "user"`
836858 
837859 Object type. Always `user`.
838860 

api/admin/analytics/users/list Changed · +23 / -11 lines

from line 5
55Get per-user activity for a given day, with cursor-based pagination.
66 
77Returns activity metrics for each user in the organization, sorted by email
8address. Use group_by[] for per-RBAC-group aggregates, or filter[] to
8address. Use `group_by[]` for per-RBAC-group aggregates, or `filter[]` to
99scope results to specific members, groups, or a chat project. Available
1010to organizations on a Claude Enterprise plan. Requires an API key with
1111the `read:analytics` scope.
from line 20
2020 
2121- `ending_date: optional string`
2222 
23 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with starting_date. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after starting_date.
23 UTC date in YYYY-MM-DD format. End of the date range (exclusive); only valid with `starting_date`. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day), so this can be at most today — which is also the default when omitted, resolved once when the first page is served and reused for the rest of the pagination sequence. At most 366 days after `starting_date`.
2424 
2525 format: date
2626 
2727- `filter: optional array of string`
2828 
29 Filters as 'dimension:value', e.g. filter[]=rbac_group_id:<id>. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: project_id, rbac_group_id, user_id. Value forms: project_id takes a tagged project id (claude_proj_...) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with group_by[] or an rbac_group_id filter); rbac_group_id takes the tagged id (rbac_group_..., as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); user_id takes a tagged user id (user_...), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
29 Filters as `dimension:value`, e.g. `filter[]=rbac_group_id:{id}`. Repeat the param for OR within a dimension and across dimensions for AND. Supported dimensions on this endpoint: `project_id`, `rbac_group_id`, `user_id`. Value forms: `project_id` takes a tagged project id (`claude_proj_...`) and scopes each member's row to their claude.ai chat activity within that project (it cannot be combined with `group_by[]` or an `rbac_group_id` filter); `rbac_group_id` takes the tagged id (`rbac_group_...`, as emitted in responses and by the spend-limits API) or a bare group UUID, and matches users who held the group at any point during each covered UTC day (time-of-usage attribution); `user_id` takes a tagged user id (`user_...`), as emitted in responses. An unsupported dimension returns 400. At most 100 entries.
3030 
3131 maxItems: 100
3232 
3333- `group_by: optional array of "rbac_group_id"`
3434 
35 Dimensions to break results out by (e.g. group_by[]=rbac_group_id). Supported on this endpoint: rbac_group_id. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via next_page; an unsupported dimension returns 400. rbac_group_id attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
35 Dimensions to break results out by (e.g. `group_by[]=rbac_group_id`). Supported on this endpoint: `rbac_group_id`. Rows are already per-member, so the one supported grouping aggregates them per RBAC group instead. Grouped rows carry the requested dimension values as additional fields and paginate like ungrouped responses via `next_page`; an unsupported dimension returns 400. `rbac_group_id` attributes a user to every group they held at any point during each covered UTC day, so grouped rows are not an exclusive partition and can sum above org-level totals. At most 100 entries.
3636 
3737 maxItems: 100
3838 
from line 44
4444 
4545- `order: optional "asc" or "desc"`
4646 
47 Sort direction: 'asc' or 'desc'. Defaults to 'asc' for the endpoint's sort column and to 'desc' when order_by names a metric (a top-N ranking). Applies to order_by, or to the endpoint's default sort field when order_by is omitted.
47 Sort direction: `asc` or `desc`. Defaults to `asc` for the endpoint's sort column and to `desc` when `order_by` names a metric (a top-N ranking). Applies to `order_by`, or to the endpoint's default sort field when `order_by` is omitted.
4848 
4949 - `"asc"`
5050 
from line 56
5656 
5757- `page: optional string`
5858 
59 Opaque cursor from a previous response's next_page field.
59 Opaque cursor from a previous response's `next_page` field.
6060 
6161- `starting_date: optional string`
6262 
63 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either date or starting_date, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
63 UTC date in YYYY-MM-DD format. Start of a date range (inclusive). Enables rollup mode: one row per entity aggregated over the whole range — addable counters are summed across days, and a distinct count is never summed where summing could double-count (a field's range value is recomputed exactly over the window, approximate via HLL with typical error under 2%, null, or — for the creation-event counts, whose per-day values cannot overlap — a per-day sum that is itself exact; each field's own description says which). Use either `date` or `starting_date`, not both. Data is typically available with a 1-day lag (varies by query; the error for a too-recent date names the latest available day) and may be revised by a few percent over the following days. No earlier than 2026-01-01.
6464 
6565 format: date
6666 
from line 132
132132 
133133 Core Claude Code activity metrics for a single user on a given day.
134134 
135 - `artifacts_created_count: number`
136 
137 Number of artifacts created in Claude Code sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
138 
135139 - `commit_count: number`
136140 
137141 Number of commits made via Claude Code
from line 196
192196 
193197 Number of tool actions completed in Cowork sessions
194198 
199 - `artifacts_created_count: number`
200 
201 Number of artifacts created in Cowork sessions: an artifact counts once, on the day a session first saves it. Counted from 2026-08-17; 0 on earlier days. Exact in date-range mode: a creation belongs to exactly one day, so the per-day counts never overlap and their sum over the window is the exact count of distinct creations in it.
202 
195203 - `connectors_used_count: number`
196204 
197205 Total number of connector invocations in Cowork sessions
from line 358
350358 
351359 - `last_activity_date: optional string or null`
352360 
353 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested date in single-day mode, and to the latest active day in [starting_date, ending_date) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id` it is the last day the user was active while a member of that group, consistent with the row's other metrics. Null on grouped (`group_by[]`) rows. Omitted from the response while last-activity reporting is not enabled for this organization.
361 Most recent UTC day (YYYY-MM-DD) on which the user had any counted activity, within the requested window: equal to the requested `date` in single-day mode, and to the latest active day from `starting_date` (inclusive) to `ending_date` (exclusive) in date-range rollup mode — never a day earlier than the window start. On filtered requests (`filter[]`) only days matching the filter count: with `filter[]=rbac_group_id:{id}` it is the last day the user was active while a member of that group, consistent with the row's other metrics. On grouped (`group_by[]`) rows it is the latest day any member of the group was active (the requested `date` in single-day mode). Omitted from the response while last-activity reporting is not enabled for this organization.
354362 
363 format: date
364 
355365 - `rbac_group_id: optional string or null`
356366 
357367 Tagged RBAC group identifier (`rbac_group_...`), matching the spend-limits API spelling. Present only when the request grouped by `rbac_group_id`.
from line 372
362372 
363373 - `user: optional AnalyticsUser or null`
364374 
365 User identifier.
375 A user in the organization, identified by tagged id and email address.
366376 
367377 - `id: string`
368378 
from line 382
372382 
373383 Email address of the user
374384 
375 - `type: optional "user"`
385 - `type: "user"`
376386 
377387 Object type. Always `user`.
378388 
from line 422
412422 },
413423 "claude_code_metrics": {
414424 "core_metrics": {
425 "artifacts_created_count": 0,
415426 "commit_count": 0,
416427 "distinct_session_count": 0,
417428 "lines_of_code": {
from line 452
441452 },
442453 "cowork_metrics": {
443454 "action_count": 0,
455 "artifacts_created_count": 0,
444456 "connectors_used_count": 0,
445457 "dispatch_turn_count": 0,
446458 "distinct_connectors_used_count": 0,
from line 518
506518 },
507519 "web_search_count": 0,
508520 "distinct_user_count": 0,
509 "last_activity_date": "last_activity_date",
521 "last_activity_date": "2019-12-27",
510522 "rbac_group_id": "rbac_group_id",
511523 "rbac_group_name": "rbac_group_name",
512524 "user": {

api/admin/api_keys Changed · +195 / -57 lines

from line 36
3636 
3737 ID of the actor that created the object.
3838 
39 - `type: string`
39 - `type: "service_account" or "user"`
4040 
4141 Type of the actor that created the object.
4242 
43 - `"service_account"`
44 
45 - `"user"`
46 
4347 - `expires_at: string or null`
4448 
4549 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 58
5458 
5559 Partially redacted hint for the API key.
5660 
57 - `principal: object or null`
61 - `principal: object or object or null`
5862 
59 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
63 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
6064 
61 - `id: string`
65 - `UserActor object`
6266 
63 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
67 - `type: "user_actor"`
6468 
65 - `type: "service_account" or "user"`
69 Principal type. Always `"user_actor"` for a User.
6670 
67 Type of the principal the API key acts as.
71 default: user_actor
6872 
69 - `"service_account"`
73 - `user_id: string`
7074 
71 - `"user"`
75 ID of the User the API key acts as.
7276 
77 - `ServiceAccountActor object`
78 
79 - `service_account_id: string`
80 
81 ID of the Service Account the API key acts as.
82 
83 - `type: "service_account_actor"`
84 
85 Principal type. Always `"service_account_actor"` for a Service Account.
86 
87 default: service_account_actor
88 
89 - `scope: object or object`
90 
91 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
92 
93 - `Organization object`
94 
95 - `type: "organization"`
96 
97 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
98 
99 default: organization
100 
101 - `Workspace object`
102 
103 - `type: "workspace"`
104 
105 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
106 
107 default: workspace
108 
109 - `workspace_id: string`
110 
111 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
112 
73113 - `status: "active" or "archived" or "expired" or "inactive"`
74114 
75115 Status of the API key.
from line 132
92132 
93133 - `workspace_id: string or null`
94134 
95 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
135 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
96136 
137 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
138 
97139### Example
98140 
99141```bash
from line 158
116158 "name": "Developer Key",
117159 "partial_key_hint": "sk-ant-api03-R2D...igAA",
118160 "principal": {
119 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
120 "type": "user"
161 "type": "user_actor",
162 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
121163 },
164 "scope": {
165 "type": "workspace",
166 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
167 },
122168 "status": "active",
123169 "type": "api_key",
124170 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
from line 239
193239 
194240 ID of the actor that created the object.
195241 
196 - `type: string`
242 - `type: "service_account" or "user"`
197243 
198244 Type of the actor that created the object.
199245 
246 - `"service_account"`
247 
248 - `"user"`
249 
200250 - `expires_at: string or null`
201251 
202252 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 261
211261 
212262 Partially redacted hint for the API key.
213263 
214 - `principal: object or null`
264 - `principal: object or object or null`
215265 
216 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
266 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
217267 
218 - `id: string`
268 - `UserActor object`
219269 
220 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
270 - `type: "user_actor"`
221271 
222 - `type: "service_account" or "user"`
272 Principal type. Always `"user_actor"` for a User.
223273 
224 Type of the principal the API key acts as.
274 default: user_actor
225275 
226 - `"service_account"`
276 - `user_id: string`
227277 
228 - `"user"`
278 ID of the User the API key acts as.
229279 
280 - `ServiceAccountActor object`
281 
282 - `service_account_id: string`
283 
284 ID of the Service Account the API key acts as.
285 
286 - `type: "service_account_actor"`
287 
288 Principal type. Always `"service_account_actor"` for a Service Account.
289 
290 default: service_account_actor
291 
292 - `scope: object or object`
293 
294 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
295 
296 - `Organization object`
297 
298 - `type: "organization"`
299 
300 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
301 
302 default: organization
303 
304 - `Workspace object`
305 
306 - `type: "workspace"`
307 
308 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
309 
310 default: workspace
311 
312 - `workspace_id: string`
313 
314 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
315 
230316 - `status: "active" or "archived" or "expired" or "inactive"`
231317 
232318 Status of the API key.
from line 335
249335 
250336 - `workspace_id: string or null`
251337 
252 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
338 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
253339 
340 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
341 
254342- `first_id: string or null`
255343 
256344 First ID in the `data` list. Can be used as the `before_id` for the previous page.
from line 375
287375 "name": "Developer Key",
288376 "partial_key_hint": "sk-ant-api03-R2D...igAA",
289377 "principal": {
290 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
291 "type": "user"
378 "type": "user_actor",
379 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
292380 },
381 "scope": {
382 "type": "workspace",
383 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
384 },
293385 "status": "active",
294386 "type": "api_key",
295387 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
from line 447
355447 
356448 ID of the actor that created the object.
357449 
358 - `type: string`
450 - `type: "service_account" or "user"`
359451 
360452 Type of the actor that created the object.
361453 
454 - `"service_account"`
455 
456 - `"user"`
457 
362458 - `expires_at: string or null`
363459 
364460 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 469
373469 
374470 Partially redacted hint for the API key.
375471 
376 - `principal: object or null`
472 - `principal: object or object or null`
377473 
378 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
474 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
379475 
380 - `id: string`
476 - `UserActor object`
381477 
382 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
478 - `type: "user_actor"`
383479 
384 - `type: "service_account" or "user"`
480 Principal type. Always `"user_actor"` for a User.
385481 
386 Type of the principal the API key acts as.
482 default: user_actor
387483 
388 - `"service_account"`
484 - `user_id: string`
389485 
390 - `"user"`
486 ID of the User the API key acts as.
391487 
488 - `ServiceAccountActor object`
489 
490 - `service_account_id: string`
491 
492 ID of the Service Account the API key acts as.
493 
494 - `type: "service_account_actor"`
495 
496 Principal type. Always `"service_account_actor"` for a Service Account.
497 
498 default: service_account_actor
499 
500 - `scope: object or object`
501 
502 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
503 
504 - `Organization object`
505 
506 - `type: "organization"`
507 
508 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
509 
510 default: organization
511 
512 - `Workspace object`
513 
514 - `type: "workspace"`
515 
516 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
517 
518 default: workspace
519 
520 - `workspace_id: string`
521 
522 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
523 
392524 - `status: "active" or "archived" or "expired" or "inactive"`
393525 
394526 Status of the API key.
from line 543
411543 
412544 - `workspace_id: string or null`
413545 
414 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
546 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
415547 
548 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
549 
416550### Example
417551 
418552```bash
from line 571
437571 "name": "Developer Key",
438572 "partial_key_hint": "sk-ant-api03-R2D...igAA",
439573 "principal": {
440 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
441 "type": "user"
574 "type": "user_actor",
575 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
576 },
577 "scope": {
578 "type": "workspace",
579 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
442580 },
443581 "status": "active",
444582 "type": "api_key",

api/admin/api_keys/list Changed · +65 / -19 lines

from line 66
6666 
6767 ID of the actor that created the object.
6868 
69 - `type: string`
69 - `type: "service_account" or "user"`
7070 
7171 Type of the actor that created the object.
7272 
73 - `"service_account"`
74 
75 - `"user"`
76 
7377 - `expires_at: string or null`
7478 
7579 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 88
8488 
8589 Partially redacted hint for the API key.
8690 
87 - `principal: object or null`
91 - `principal: object or object or null`
8892 
89 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
93 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
9094 
91 - `id: string`
95 - `UserActor object`
9296 
93 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
97 - `type: "user_actor"`
9498 
95 - `type: "service_account" or "user"`
99 Principal type. Always `"user_actor"` for a User.
96100 
97 Type of the principal the API key acts as.
101 default: user_actor
98102 
99 - `"service_account"`
103 - `user_id: string`
100104 
101 - `"user"`
105 ID of the User the API key acts as.
102106 
107 - `ServiceAccountActor object`
108 
109 - `service_account_id: string`
110 
111 ID of the Service Account the API key acts as.
112 
113 - `type: "service_account_actor"`
114 
115 Principal type. Always `"service_account_actor"` for a Service Account.
116 
117 default: service_account_actor
118 
119 - `scope: object or object`
120 
121 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
122 
123 - `Organization object`
124 
125 - `type: "organization"`
126 
127 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
128 
129 default: organization
130 
131 - `Workspace object`
132 
133 - `type: "workspace"`
134 
135 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
136 
137 default: workspace
138 
139 - `workspace_id: string`
140 
141 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
142 
103143 - `status: "active" or "archived" or "expired" or "inactive"`
104144 
105145 Status of the API key.
from line 162
122162 
123163 - `workspace_id: string or null`
124164 
125 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
165 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
126166 
167 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
168 
127169- `first_id: string or null`
128170 
129171 First ID in the `data` list. Can be used as the `before_id` for the previous page.
from line 202
160202 "name": "Developer Key",
161203 "partial_key_hint": "sk-ant-api03-R2D...igAA",
162204 "principal": {
163 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
164 "type": "user"
205 "type": "user_actor",
206 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
207 },
208 "scope": {
209 "type": "workspace",
210 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
165211 },
166212 "status": "active",
167213 "type": "api_key",

api/admin/api_keys/retrieve Changed · +58 / -12 lines

from line 34
3434 
3535 ID of the actor that created the object.
3636 
37 - `type: string`
37 - `type: "service_account" or "user"`
3838 
3939 Type of the actor that created the object.
4040 
41 - `"service_account"`
42 
43 - `"user"`
44 
4145 - `expires_at: string or null`
4246 
4347 RFC 3339 datetime string indicating when the API Key expires, or `null` if it never expires.
from line 56
5256 
5357 Partially redacted hint for the API key.
5458 
55 - `principal: object or null`
59 - `principal: object or object or null`
5660 
57 The ID and type of the principal the API key acts as, or `null` if the key is not bound to a principal.
61 The principal the API key acts as (a User or a Service Account), or `null` if the API key is not bound to a principal.
5862 
59 - `id: string`
63 - `UserActor object`
6064 
61 ID of the principal the API key acts as: a User ID (`user_...`) when the type is `user`, or a Service Account ID (`svac_...`) when the type is `service_account`.
65 - `type: "user_actor"`
6266 
63 - `type: "service_account" or "user"`
67 Principal type. Always `"user_actor"` for a User.
6468 
65 Type of the principal the API key acts as.
69 default: user_actor
6670 
67 - `"service_account"`
71 - `user_id: string`
6872 
69 - `"user"`
73 ID of the User the API key acts as.
7074 
75 - `ServiceAccountActor object`
76 
77 - `service_account_id: string`
78 
79 ID of the Service Account the API key acts as.
80 
81 - `type: "service_account_actor"`
82 
83 Principal type. Always `"service_account_actor"` for a Service Account.
84 
85 default: service_account_actor
86 
87 - `scope: object or object`
88 
89 Where the API key belongs: its Workspace (`{"type": "workspace", "workspace_id": "wrkspc_..."}`, with the Workspace's real ID even when it is the organization's default Workspace), or the organization (`{"type": "organization"}`) for a principal-bound API key that has no Workspace.
90 
91 - `Organization object`
92 
93 - `type: "organization"`
94 
95 Scope type. Always `"organization"`: the API key has no Workspace. Only a principal-bound API key can have this scope.
96 
97 default: organization
98 
99 - `Workspace object`
100 
101 - `type: "workspace"`
102 
103 Scope type. Always `"workspace"`: the API key belongs to one Workspace.
104 
105 default: workspace
106 
107 - `workspace_id: string`
108 
109 ID of the Workspace the API key belongs to. Unlike the deprecated top-level `workspace_id`, this is the Workspace's real ID even for the organization's default Workspace.
110 
71111 - `status: "active" or "archived" or "expired" or "inactive"`
72112 
73113 Status of the API key.
from line 130
90130 
91131 - `workspace_id: string or null`
92132 
93 ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace.
133 **Deprecated**: Use `scope` instead. `workspace_id` is `null` both for an API key in the default Workspace and for a principal-bound API key that has no Workspace.
94134 
135 Deprecated: use `scope` instead. ID of the Workspace associated with the API key, or `null` if the API key belongs to the default Workspace. Also `null` for a principal-bound API key that has no Workspace; `scope` tells the two apart.
136 
95137## Example
96138 
97139```bash
from line 156
114156 "name": "Developer Key",
115157 "partial_key_hint": "sk-ant-api03-R2D...igAA",
116158 "principal": {
117 "id": "user_01WCz1FkmYMm4gnmykNKUu3Q",
118 "type": "user"
159 "type": "user_actor",
160 "user_id": "user_01WCz1FkmYMm4gnmykNKUu3Q"
161 },
162 "scope": {
163 "type": "workspace",
164 "workspace_id": "wrkspc_01JwQvzr7rXLA5AGx3HKfFUJ"
119165 },
120166 "status": "active",
121167 "type": "api_key",
Feedback