One read of Claude Developer Platform
53 pages moved out of 688 read.
api/admin/external_keys Changed · +9 / -9 lines
format: date-time -### External Key List Response +### External Key Retrieve Response -- `ExternalKeyListResponse object` +- `ExternalKeyRetrieveResponse object` CMEK external key config belonging to the caller's organization.
format: date-time -### External Key Retrieve Response +### External Key Update Response -- `ExternalKeyRetrieveResponse object` +- `ExternalKeyUpdateResponse object` CMEK external key config belonging to the caller's organization.
format: date-time -### External Key Update Response +### External Key List Response -- `ExternalKeyUpdateResponse object` +- `ExternalKeyListResponse object` CMEK external key config belonging to the caller's organization.
api/admin/federation_rules/workspaces Changed · +36 / -36 lines
## Domain types -### Workspace List Response +### Workspace Create Response -- `WorkspaceListResponse object` +- `WorkspaceCreateResponse object` - `created_at: string`
Workspace display name. Populated when listing; null in the enable response. -### Workspace Create Response +### Workspace List Response -- `WorkspaceCreateResponse object` +- `WorkspaceListResponse object` - `created_at: string`
api/admin/mcp_tunnels Changed · +38 / -38 lines
ID of the Workspace this Tunnel belongs to, or `null` for the default Workspace. Immutable after creation. -### MCP Tunnel Reveal Token Response - -- `MCPTunnelRevealTokenResponse object` - - - `id: string` - - Stable identifier for the current token value. Changes when the token is - rotated. - - - `tunnel_token: string` - - The tunnel's connection token. - - - `type: "tunnel_token"` - - Object type. Always `tunnel_token` for Tunnel Tokens. - - default: tunnel_token - -### MCP Tunnel Rotate Token Response - -- `MCPTunnelRotateTokenResponse object` - - - `id: string` - - Stable identifier for the current token value. Changes when the token is - rotated. - - - `tunnel_token: string` - - The tunnel's connection token. - - - `type: "tunnel_token"` - - Object type. Always `tunnel_token` for Tunnel Tokens. - - default: tunnel_token - ### MCP Tunnel Archive Response - `MCPTunnelArchiveResponse object`
ID of the Workspace this Tunnel belongs to, or `null` for the default Workspace. Immutable after creation. + +### MCP Tunnel Reveal Token Response + +- `MCPTunnelRevealTokenResponse object` + + - `id: string` + + Stable identifier for the current token value. Changes when the token is + rotated. + + - `tunnel_token: string` + + The tunnel's connection token. + + - `type: "tunnel_token"` + + Object type. Always `tunnel_token` for Tunnel Tokens. + + default: tunnel_token + +### MCP Tunnel Rotate Token Response + +- `MCPTunnelRotateTokenResponse object` + + - `id: string` + + Stable identifier for the current token value. Changes when the token is + rotated. + + - `tunnel_token: string` + + The tunnel's connection token. + + - `type: "tunnel_token"` + + Object type. Always `tunnel_token` for Tunnel Tokens. + + default: tunnel_token ## MCP Tunnels › Tunnel Certificates
models/overview Changed · +2 / -2 lines
## Compare models -If you're unsure which model to use, start with [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview) for complex agentic coding and enterprise work; for the highest available capability, use [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview). All current models support text and image input, text output, multilingual capabilities, vision, and tool use; each model’s page lists the platforms it is available on. +If you're unsure which model to use, start with [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview) for complex agentic coding and enterprise work; for the highest available capability, use [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview). All current models support text and image input, text output, multilingual capabilities, vision, and tool use; each model's page lists the platforms it is available on. | Feature | Claude Fable 5 | Claude Opus 5 | Claude Sonnet 5 | Claude Haiku 4.5 | | :-------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | :------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------- |
* **Performance:** Top-tier results in reasoning, coding, multilingual tasks, long-context handling, honesty, and image processing. See [Prompting best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices) for general and model-specific prompting guidance. * **Engaging responses:** Claude models are ideal for applications that require rich, human-like interactions. If you prefer more concise responses, adjust your prompts to guide the model toward the desired output length. Refer to the [prompt engineering guides](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering) for details. -* **Output quality:** When migrating from a previous model generation, you may notice larger improvements in overall performance. If you're on Claude Opus 4.8 or earlier, see [Migrating to Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-4-8-to-claude-opus-5). +* **Output quality:** When migrating from a previous model generation, you may notice larger improvements in overall performance. If you're on Claude Opus 4.8 or earlier, see [Migrating to Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/migration-guide). ## Get started with Claude
about-claude/models/optimizing-for-cost-and-intelligence Changed · +32 / -8 lines
#### Defer unused tool definitions #### Keep data files out of the prompt #### Manage the context lifecycle
When a workload moves from prototype to production, cost becomes a first-class design constraint. The most capable model can be too expensive at scale, and the least expensive model can fall short on quality. Managing cost well means understanding how each cost lever affects output quality, because some levers trade against quality and some don't. The Claude Platform gives you direct control over that tradeoff. You choose the model, the effort level, and the architecture for each request, which lets you place a workload almost anywhere on the cost-to-intelligence frontier. +Cost and intelligence are usually pictured as a frontier where one buys the other. The first group of levers on this page moves a workload toward that frontier by cutting cost without touching quality; only the second group moves along it: + + + The levers come in two kinds: * **Free wins** cut spend without touching quality: prompt caching, token hygiene, a prompt audit against the model you are running, [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing) at 50% off for work that can wait up to 24 hours, and [workspace spend limits](https://platform.claude.com/docs/en/api/rate-limits#setting-lower-limits-for-workspaces) as the backstop.
Turn 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. +**What good looks like.** Over a full day of real traffic, agent loops read a median 84% of their input from the cache, and the top 10% of harnesses, coding or not, read 94% or more[17](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs). Deep in a task, a well-built loop pays full price on under 1% of its input. Below about 80%, look for something breaking the cache (see [What breaks the cache](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#what-breaks-the-cache)). + Across 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: 
To decide, count the gaps between consecutive requests in a conversation: * 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. -* 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. +* Turns arrive seconds apart: stay on the 5-minute default. When nothing paused, it cost 15% less than the 1-hour setting on Claude Sonnet 5 and 11% less on Claude Opus 5. * 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). -Anthropic 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: +Anthropic measured the 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, the 1-hour cache became the cheaper setting once about 1 turn in 30 followed a pause, so the 1-in-20 rule leaves a margin, and the gap widens quickly past the crossover because every paused turn on the 5-minute setting re-writes the whole prefix. 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: 
#### What breaks the cache -Four 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. +Several 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. +The cache is a byte-exact prefix match over the request in order (tools, then system prompt, then messages), so a change anywhere invalidates everything after it. Changing [`effort`](https://platform.claude.com/docs/en/build-with-claude/effort) or the thinking configuration between requests invalidates the cache from that point onward, and on some models the tools and system prompt ahead of it as well; any edit to the system prompt invalidates the cache from that point onward; setting or changing an output format invalidates the cache for the whole conversation; adding, removing, or reordering a tool definition invalidates all of it. The [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#what-invalidates-the-cache) page lists these cases, apart from the output format, which [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs#prompt-modification-and-token-costs) covers. On Claude Opus 5 (and Claude Fable 5, Claude Mythos 5, and Claude Opus 4.8), change instructions with a [mid-conversation system message](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages), a `{"role": "system"}` message appended to `messages`, instead of editing the top-level `system` field: the cached prefix stays intact. The same page covers mid-conversation tool changes, in beta on those models. Otherwise, make such changes only where you would re-cache anyway, such as at a [compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) boundary, and on the first request after the compaction rather than the one that triggers it. + +Anthropic measured this on the triage agent's long sessions[18](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs). An effort change and an added tool made mid-session rewrote 39,000 and 60,000 cached tokens, and those sessions cost $0.95 per session. The same two changes on the first request after compaction cost $0.75, and on the request that triggered the compaction $0.92, because the compaction's summarization pass then re-processed the 81,000-token context at the cache-write price: that summarization pass cost $0.21, against $0.04 when the same changes came one request later, with accuracy within run-to-run noise in every arm: + + + +Changing a [task budget](https://platform.claude.com/docs/en/build-with-claude/task-budgets) partway through invalidates any cached prefix that contains the budget value, 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 every cache-invalidating change 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. + ### Trim input and context tokens Most agent requests carry tokens that never influence the answer. Trimming them costs nothing in output quality, although not every lever here saved money when measured. Two places to look:
* **Input trimming.** [Dynamic filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#dynamic-filtering) in the web fetch tool keeps boilerplate out of fetched pages, [image resizing](https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size) right-sizes vision inputs, and [tool search with deferred loading](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) loads tool definitions only when needed (measured later in this section). [Programmatic tool calling](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling) lets Claude run several tool calls from code so only the filtered result enters the context; its documentation reports 24% fewer input tokens on agentic search benchmarks, with a higher score. [Manage tool context](https://platform.claude.com/docs/en/agents-and-tools/tool-use/manage-tool-context) compares tool search, programmatic tool calling, prompt caching, and context editing. * **Context lifecycle.** [Context editing](https://platform.claude.com/docs/en/build-with-claude/context-editing) clears stale tool results, and [automatic compaction](https://platform.claude.com/docs/en/build-with-claude/compaction) with its threshold stops long loops from carrying their whole history forward. -Defer tool definitions you are not using. Every tool definition attached to a request is input on every turn, and a few MCP servers add up to hundreds of them. Anthropic ran the triage agent with its own two tools plus a catalog of real tool definitions from public MCP servers, for a total of up to 502 tools, loading all of them or marking the extras `defer_loading` behind [tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool): +The levers interact with the cache and each other, so judge them by net effect, and use [cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) to confirm your cached prefix survives each change. Anthropic measured them on an issue-triage agent working through 20 real bug reports with screenshots from a public repository, and on a longer variant of the same job with 2.6 times the tokens. With caching on, input trimming (image resizing and tool search) took a further 26% off the short run and 21% off the long one. +#### Defer unused tool definitions + +Every tool definition attached to a request is input on every turn, and a few MCP servers add up to hundreds of them. Anthropic ran the triage agent with its own two tools plus a catalog of real tool definitions from public MCP servers, for a total of up to 502 tools, loading all of them or marking the extras `defer_loading` behind [tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool): +  With every definition loaded, the run cost rose from $0.55 to $1.02, tracking the schema tokens on each request. With tool search, it stayed at $0.56 at every catalog size, 45% less at 502 tools. Accuracy was 15 to 18 of 20 in every cell either way, and the model never called a wrong tool, so at this scale the catalog costs money, not correctness. The same holds for tools that come through the [MCP connector](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector): with a public GitHub MCP server attached, deferring its toolset (`default_config: {defer_loading: true}`) cut the run 20% at the same accuracy. -Keep data files out of the prompt. When the model has to compute over a table, upload it with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and let the model query it with [code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) instead of pasting it in. Anthropic asked 25 aggregate questions[15](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) (sums, filtered counts, group-bys, and a date filter) over a 1,862-row public CSV, with the answers computed by pandas: +#### Keep data files out of the prompt +When the model has to compute over a table, upload it with the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) and let the model query it with [code execution](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool) instead of pasting it in. Anthropic asked 25 aggregate questions[15](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence#refs) (sums, filtered counts, group-bys, and a date filter) over a 1,862-row public CSV, with the answers computed by pandas: +  Pasted into the prompt, the table is about 91,000 input tokens on every request, and Claude Sonnet 5 answered 6 of 25 questions correctly at $5.01 per run. Uploaded, with code execution, it answered 25 of 25 at $0.40. Claude Opus 5 showed the same pattern (6 of 25 at $13.45 against 25 of 25 at $1.91). -The levers interact with the cache and each other, so judge them by net effect, and use [cache diagnostics](https://platform.claude.com/docs/en/build-with-claude/cache-diagnostics) to confirm your cached prefix survives each change. Anthropic measured them on an issue-triage agent working through 20 real bug reports with screenshots from a public repository, and on a longer variant of the same job with 2.6 times the tokens. With caching on, input trimming (image resizing and tool search) took a further 26% off the short run and 21% off the long one. The context levers are where the two runs diverge: +#### Manage the context lifecycle +The context levers are where the two runs diverge: +  The context levers only pay on a session long enough to need them. On the 20-issue run, context editing cost 74% more, and compaction and the prune changed nothing. On the long run, context editing changed nothing, compaction saved 32%, and the prune saved 39%. The prune is a few lines you write yourself: at each task boundary, replace large stale tool results with a one-line extract. It caches well because the edits sit at the tail of the conversation, where the next task adds new content anyway: 89% cache reads on the first request after a boundary and 81% on the requests between boundaries. Run-wide, the prune and context editing cache equally well. The prune is cheaper because context editing rewrites content mid-task that the prune deletes (about two thirds of the gap) and because it keeps the context about half the size (the other third). If you use context editing, [clear in a few large batches](https://platform.claude.com/docs/en/build-with-claude/context-editing#context-editing-and-prompt-caching). The prune, adapted from the harness:
## Benchmarks referenced -All 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. +Except where a reference says otherwise, 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. 1. **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. 2. **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.
11. **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. 12. **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. 13. **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. -14. **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. +14. **Support-desk prompt-audit evaluation:** An Anthropic-constructed set of 44 support tickets with deterministic grading, run in early August 2026 and reported on August 8, 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. 15. **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. 16. **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. +17. **Cache-read share in production:** Aggregated first-party Claude API usage for the 14 days ending August 23, 2026, direct API product only, Anthropic-internal organizations excluded, no organization identified. An organization-day counts as an agent loop when its requests carry tool definitions and tool results, its prompts hold 9 or more prior tool calls on average, caching was used, and it made at least 10 such requests (the API has no conversation identifier, so this stands in for conversation length): 303,003 organization-days across 106,487 organizations, median cache-read share 84.2% of all input tokens, upper quartile 91.7%. Use-case labels (the organization's declared use case, or otherwise its classified one) cover 74% of those organization-days and 99% of their tokens; coding organizations supply 87% of agentic input tokens and read a median 88.5% (90.9% at 25 or more prior tool calls), upper quartile 93.4%, with about 72% of coding organization-days at 80% or more; support, research, and data agents read 84% to 85%. The top decile of organization-days reads 95.9% or more for coding and 94.2% to 94.8% for support, research, data, and other agents. The request-level split at 25 or more prior tool calls comes from a six-hour sample: coding 92% read, 7% write, under 1% uncached. Unlabeled organizations, mostly small, read a median 11%. Organization-days with no tool definitions read a median 34.6%. An independent query over the same window that reconstructs conversations of 10 or more requests, rather than scoring organization-days, puts the median at 90.2%; the difference is scope, not data. +18. **Compaction timing measurement:** The triage agent's long variant 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 24, 2026, on Claude Sonnet 5 with the 5-minute cache, cost from the usage fields at list prices, five sessions per arm: a no-change arm at the default effort throughout ($0.81 per session), and two arms that start at low effort and make the same two cache-breaking changes, a switch to the default effort and one added tool, either mid-session at requests 12 and 17 ($0.95) or together on the first request after the first compaction ($0.75). A fourth arm of six sessions, run August 25, 2026, made the same two changes on the request that triggered the first compaction ($0.92 per session): that request's summarization pass wrote the 81,000-token context to the cache instead of reading it, so that pass cost $0.21 against $0.04 for the same pass in the boundary arm. Sessions first compacted at request 21 to 25 (16 of the 21 sessions at request 22), once the prompt passed the 80,000-token compaction trigger, and two no-change sessions compacted a second time near the end. The boundary arm's lower total than the no-change arm reflects its low-effort requests before the change and those second compactions rather than caching: the two arms' re-write costs differ by under a cent. The mid-session arm paid $0.23 per session in cache re-writes; the difference between the mid-session and boundary arms was $0.20 with a 95% confidence interval of $0.11 to $0.29. One mid-session session ran cheap ($0.82) after its model mis-called the search tool following compaction and got empty results; it is included, and without it the arm averages $0.98. Accuracy averaged 14.2 of 20 labels in each August 24 arm and 14.7 in the August 25 arm; cache reads were 91% of prompt tokens with no changes, 85% mid-session, 91% at the boundary, and 86% with the changes on the triggering request. ## Next steps
models/opus-5/overview Changed · +1 / -1 lines
## Overview -Claude Opus 5 is a step-change improvement over Claude Opus 4.8, with the largest gains in deep reasoning, agentic and long-horizon tasks, and test-time compute scaling. This page summarizes everything new in Claude Opus 5, including thinking on by default, mid-conversation tool changes, and a breaking change to when thinking can be disabled. +Claude Opus 5 is a step-change improvement over Claude Opus 4.8, with the largest gains in deep reasoning, agentic and long-horizon tasks, and test-time compute scaling. This page summarizes everything new in Claude Opus 5, including mid-conversation tool changes and two breaking changes for code running on Claude Opus 4.8: thinking is on by default, and thinking can be disabled only at effort `high` or below. [What's new in Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/whats-new-opus-5)
api/beta/messages/create Changed · +1 / -1 lines
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
api/beta/messages/batches/results Changed · +1 / -1 lines
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
api/admin/workspaces/service_accounts Changed · +46 / -46 lines
- `"workspace_user"` -### Service Account List Response +### Service Account Update Response -- `ServiceAccountListResponse object` +- `ServiceAccountUpdateResponse object` - `created_by_actor_id: string or null`
- `"workspace_user"` -### Service Account Update Response +### Service Account List Response -- `ServiceAccountUpdateResponse object` +- `ServiceAccountListResponse object` - `created_by_actor_id: string or null`
api/beta Changed · +434 / -376 lines
### Parse Unverified
This page is larger than the 256 KiB this site keeps, so one side of the diff below stops where the stored text does.
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
If you include `tools` in your API request, the model may return `tool_use` content blocks that represent the model's use of those tools. You can then run those tools using the tool input generated by the model and then optionally return results back to the model using `tool_result` content blocks. - There are two types of tools: **client tools** and **server tools**. The behavior described below applies to client tools. For [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), see their individual documentation as each has its own behavior (e.g., the [we + There are two types of tools: **client tools** and **server tools**. The behavior described below applies to client tools. For [server tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools), see their individual documentation as each has its own behavior (e.g.
api/beta/files Changed · +44 / -28 lines
format: binary +- `expires_in_seconds: optional number` + + Seconds from upload until the file expires and its bytes become permanently unavailable. Must be between 3600 (one hour) and 7776000 (ninety days). + + minimum: 3600, maximum: 7776000 + ### Returns - `BetaFileMetadata object`
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
curl https://api.anthropic.com/v1/files \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F 'file=@/path/to/file' ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
### Query parameters -- `after_id: optional string` +- `ids: optional array of string` - ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately after this object. + Restrict the result set to Files whose `id` is in this list. At most 100 entries (after de-duplication). Mutually exclusive with `page` and `limit`. When supplied, the response is always a single page (`next_page` is null). IDs that do not resolve to a visible File — including deleted Files — are silently omitted. -- `before_id: optional string` - - ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately before this object. - - `limit: optional number` Number of items to return per page.
default: 20, maximum: 1000, minimum: 1 +- `page: optional string` + + Opaque page cursor returned in a prior list response's `next_page`. Prefixed `page_`. + - `scope_id: optional string` Filter by scope ID. Only returns files associated with the specified scope (e.g., a session ID).
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
The type of scope (e.g., `"session"`). -- `first_id: optional string or null` +- `next_page: optional string or null` - ID of the first file in this page of results. + Opaque cursor for the next page. Supply as `?page=` to fetch the next page; null when there are no more results. -- `has_more: optional boolean` - - Whether there are more results available. - - default: false - -- `last_id: optional string or null` - - ID of the last file in this page of results. - ### Example ```bash curl https://api.anthropic.com/v1/files \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
} } ], - "first_id": "file_011CNha8iCJcU1wXNR6q4V8w", - "has_more": true, - "last_id": "file_013Zva2CMHLNnXjNJJKqJ2EF" + "next_page": "next_page" } ```
```bash curl https://api.anthropic.com/v1/files/$FILE_ID/content \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
```bash curl https://api.anthropic.com/v1/files/$FILE_ID \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
curl https://api.anthropic.com/v1/files/$FILE_ID \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
Whether the file can be downloaded. default: false + + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time - `scope: optional BetaFileScope or null`
api/beta/files/list Changed · +18 / -24 lines
## Query parameters -- `after_id: optional string` +- `ids: optional array of string` - ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately after this object. + Restrict the result set to Files whose `id` is in this list. At most 100 entries (after de-duplication). Mutually exclusive with `page` and `limit`. When supplied, the response is always a single page (`next_page` is null). IDs that do not resolve to a visible File — including deleted Files — are silently omitted. -- `before_id: optional string` - - ID of the object to use as a cursor for pagination. When provided, returns the page of results immediately before this object. - - `limit: optional number` Number of items to return per page.
default: 20, maximum: 1000, minimum: 1 +- `page: optional string` + + Opaque page cursor returned in a prior list response's `next_page`. Prefixed `page_`. + - `scope_id: optional string` Filter by scope ID. Only returns files associated with the specified scope (e.g., a session ID).
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
The type of scope (e.g., `"session"`). -- `first_id: optional string or null` +- `next_page: optional string or null` - ID of the first file in this page of results. + Opaque cursor for the next page. Supply as `?page=` to fetch the next page; null when there are no more results. -- `has_more: optional boolean` - - Whether there are more results available. - - default: false - -- `last_id: optional string or null` - - ID of the last file in this page of results. - ## Example ```bash curl https://api.anthropic.com/v1/files \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
} } ], - "first_id": "file_011CNha8iCJcU1wXNR6q4V8w", - "has_more": true, - "last_id": "file_013Zva2CMHLNnXjNJJKqJ2EF" + "next_page": "next_page" } ```
api/beta/files/retrieve_metadata Changed · +7 / -1 lines
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
```bash curl https://api.anthropic.com/v1/files/$FILE_ID \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
api/beta/files/upload Changed · +13 / -1 lines
format: binary +- `expires_in_seconds: optional number` + + Seconds from upload until the file expires and its bytes become permanently unavailable. Must be between 3600 (one hour) and 7776000 (ninety days). + + minimum: 3600, maximum: 7776000 + ## Returns - `BetaFileMetadata object`
default: false + - `expires_at: optional string or null` + + RFC 3339 datetime string representing when the file will expire and become unavailable for download. Null if the file does not expire. For files uploaded with `expires_in_seconds`, this is the upload time plus that value. + + format: date-time + - `scope: optional BetaFileScope or null` The scope of this file, indicating the context in which it was created (e.g., a session).
curl https://api.anthropic.com/v1/files \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F 'file=@/path/to/file' ```
"size_bytes": 102400, "type": "file", "downloadable": false, + "expires_at": "2025-05-15T18:37:24.100435Z", "scope": { "id": "id", "type": "session"
api/beta/messages Changed · +33 / -33 lines
### Beta Container Skill ### Beta Skill
This page is larger than the 256 KiB this site keeps, so one side of the diff below stops where the stored text does.
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
- `enabled: optional boolean or null` - Whether this member is offered to the model. Default is per member, per the + Whether this member is offered to the model. Default is per member
api/beta/messages/batches Changed · +4 / -4 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.
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
format: date-time - - `skills: array of BetaSkill or null` + - `skills: array of BetaContainerSkill or null` Skills loaded in the container
- `"reasoning_extraction"` - The request asks the model to reproduce its internal reasoning in the response text. To get reasoning in a structured form instead, use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking). - - - + The request asks the model to reproduce its internal reasoning in the response text. To get reasoning in a structured form instead, use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking
api/beta/organization Changed · +10 / -10 lines
override. Groups without overrides inherit the organization limits and are not listed; use `GET /v1/organizations/rate_limits` to see those. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. #### Path parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. #### Example
or an API-surface category such as the Files API or Message Batches) and contains the set of limiter values that apply to it. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. #### Query parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. #### Example
api/beta/organization/rate_limits Changed · +5 / -5 lines
or an API-surface category such as the Files API or Message Batches) and contains the set of limiter values that apply to it. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. ### Query parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. ### Example
api/beta/organization/rate_limits/list Changed · +5 / -5 lines
or an API-surface category such as the Files API or Message Batches) and contains the set of limiter values that apply to it. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. ## Query parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. ## Example
api/beta/organization/workspaces Changed · +5 / -5 lines
override. Groups without overrides inherit the organization limits and are not listed; use `GET /v1/organizations/rate_limits` to see those. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. #### Path parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. #### Example
api/beta/organization/workspaces/rate_limits Changed · +5 / -5 lines
override. Groups without overrides inherit the organization limits and are not listed; use `GET /v1/organizations/rate_limits` to see those. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. ### Path parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. ### Example
api/beta/organization/workspaces/rate_limits/list Changed · +5 / -5 lines
override. Groups without overrides inherit the organization limits and are not listed; use `GET /v1/organizations/rate_limits` to see those. -This endpoint currently returns every matching entry in a single page -regardless of `limit`; follow `next_page` so that clients keep working -when pagination is enabled. +When `limit` is omitted, every matching entry is returned in a single +page; when `limit` truncates the result, follow `next_page` to fetch +the remaining entries. ## Path parameters
Maximum number of items to return per page. Ranges from `1` to `1000`. - Accepted for request-shape compatibility and currently ignored: every entry is returned in a single page. + When omitted, every remaining entry is returned in a single page and `next_page` is `null`. maximum: 1000, minimum: 1
- `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Opaque cursor for the next page of results, or `null` when no entries remain beyond this response. ## Example
api/beta/skills Changed · +572 / -581 lines
### Beta Deleted Skill ### Beta Skill ### Beta Skill Source ### Skill Create Response ### Skill List Response ### Skill Retrieve Response ### Skill Delete Response
The two sides of this change are too far apart to line up, so this is the differ's own diff of it.
All files must be in the same top-level directory and must include a SKILL.md file at the root of that directory. -- `display_title: optional string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. +- `display_name: optional string or null` + + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. ### Returns -- `id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - -- `created_at: string` - - ISO 8601 timestamp of when the skill was created. - -- `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - -- `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - -- `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - -- `type: string` - - Object type. - - For Skills, this is always `"skill"`. - - default: skill - -- `updated_at: string` - - ISO 8601 timestamp of when the skill was last updated. +- `BetaSkill object` + + - `id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + + - `created_at: string` + + ISO 8601 timestamp of when the skill was created. + + format: date-time + + - `display_name: string` + + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. + + - `latest_version_id: string` + + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. + + - `source: BetaSkillSource` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` + + Object type. + + For Skills, this is always `"skill"`. + + default: skill + + - `updated_at: string` + + ISO 8601 timestamp of when the skill was last updated. + + format: date-time ### Example
curl https://api.anthropic.com/v1/skills \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F files='["Example data"]' ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ```
Number of results to return per page. - Maximum value is 100. Defaults to 20. - - default: 20 + Ranges from `1` to `1000`. Defaults to `20`. + + default: 20, minimum: 1, maximum: 1000 - `page: optional string`
### Returns -- `data: array of object` +- `data: array of BetaSkill` List of skills.
ISO 8601 timestamp of when the skill was created. - - `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - - - `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - - - `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - - - `type: string` + format: date-time + + - `display_name: string` + + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. + + - `latest_version_id: string` + + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. + + - `source: BetaSkillSource` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` Object type.
ISO 8601 timestamp of when the skill was last updated. -- `has_more: boolean` - - Whether there are more results available. - - If `true`, there are additional results that can be fetched using the `next_page` token. + format: date-time - `next_page: string or null`
```bash curl https://api.anthropic.com/v1/skills \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ], - "has_more": true, - "next_page": "page_MjAyNS0wNS0xNFQwMDowMDowMFo=" + "next_page": "next_page" } ```
### Returns -- `id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - -- `created_at: string` - - ISO 8601 timestamp of when the skill was created. - -- `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - -- `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - -- `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - -- `type: string` - - Object type. - - For Skills, this is always `"skill"`. - - default: skill - -- `updated_at: string` - - ISO 8601 timestamp of when the skill was last updated. +- `BetaSkill object` + + - `id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + + - `created_at: string` + + ISO 8601 timestamp of when the skill was created. + + format: date-time + + - `display_name: string` + + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. + + - `latest_version_id: string` + + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. + + - `source: BetaSkillSource` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` + + Object type. + + For Skills, this is always `"skill"`. + + default: skill + + - `updated_at: string` + + ISO 8601 timestamp of when the skill was last updated. + + format: date-time ### Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ```
### Returns -- `id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - -- `type: string` - - Deleted object type. - - For Skills, this is always `"skill_deleted"`. - - default: skill_deleted +- `BetaDeletedSkill object` + + - `id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + + - `type: "skill_deleted"` + + Deleted object type. + + For Skills, this is always `"skill_deleted"`. + + default: skill_deleted ### Example
curl https://api.anthropic.com/v1/skills/$SKILL_ID \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { "id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type" + "type": "skill_deleted" } ``` ## Domain types -### Skill Create Response - -- `SkillCreateResponse object` +### Beta Deleted Skill + +- `BetaDeletedSkill object` - `id: string`
The format and length of IDs may change over time. + - `type: "skill_deleted"` + + Deleted object type. + + For Skills, this is always `"skill_deleted"`. + + default: skill_deleted + +### Beta Skill + +- `BetaSkill object` + + - `id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + - `created_at: string` ISO 8601 timestamp of when the skill was created. - - `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - - - `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - - - `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - - - `type: string` + format: date-time + + - `display_name: string` + + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. + + - `latest_version_id: string` + + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. + + - `source: BetaSkillSource` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` Object type.
ISO 8601 timestamp of when the skill was last updated. -### Skill List Response - -- `SkillListResponse object` + format: date-time + +### Beta Skill Source + +- `BetaSkillSource object` + + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` + + Where the Skill comes from. + + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + +## Skills › Versions + +### Create Skill Version + +**POST** `/v1/skills/{skill_id}/versions` + +Create Skill Version + +#### Path parameters + +- `skill_id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + +#### Headers + +- `"anthropic-beta": optional array of AnthropicBeta` + + Optional header to specify the beta version(s) you want to use. + + - `string` + + - `"message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 38 more` + + - `"message-batches-2024-09-24"` + + - `"prompt-caching-2024-07-31"` + + - `"computer-use-2024-10-22"` + + - `"computer-use-2025-01-24"` + + - `"pdfs-2024-09-25"` + + - `"token-counting-2024-11-01"` + + - `"token-efficient-tools-2025-02-19"` + + - `"output-128k-2025-02-19"` + + - `"files-api-2025-04-14"` + + - `"mcp-client-2025-04-04"` + + - `"mcp-client-2025-11-20"` + + - `"dev-full-thinking-2025-05-14"` + + - `"interleaved-thinking-2025-05-14"` + + - `"code-execution-2025-05-22"` + + - `"extended-cache-ttl-2025-04-11"` + + - `"context-1m-2025-08-07"` + + - `"context-management-2025-06-27"` + + - `"model-context-window-exceeded-2025-08-26"` + + - `"skills-2025-10-02"` + + - `"fast-mode-2026-02-01"` + + - `"output-300k-2026-03-24"` + + - `"user-profiles-2026-03-24"` + + - `"user-profiles-2026-08-18"` + + - `"advisor-tool-2026-03-01"` + + - `"managed-agents-2026-04-01"` + + - `"cache-diagnosis-2026-04-07"` + + - `"dreaming-2026-04-21"` + + - `"thinking-token-count-2026-05-13"` + + - `"server-side-fallback-2026-06-01"` + + - `"server-side-fallback-2026-07-01"` + + - `"fallback-credit-2026-06-01"` + + - `"fallback-credit-2026-07-01"` + + - `"agent-memory-2026-07-22"` + + - `"mid-conversation-tool-changes-2026-07-01"` + + - `"compact-2026-01-12"` + + - `"computer-use-2025-11-24"` + + - `"mcp-tunnels-2026-06-22"` + + - `"structured-outputs-2025-11-13"` + + - `"task-budgets-2026-03-13"` + + - `"thinking-display-updates-2026-08-18"` + + - `"ce-user-management-2026-07-13"` + +#### Body parameters (form-data) + +- `files: array of string` + + Files to upload for the skill. + + All files must be in the same top-level directory and must include a SKILL.md file at the root of that directory. + +#### Returns + +- `BetaSkillVersion object` - `id: string` + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. + + - `created_at: string` + + ISO 8601 timestamp of when the skill was created. + + format: date-time + + - `description: string` + + Description of the skill version. + + This is extracted from the SKILL.md file in the skill upload. + + - `name: string` + + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. + + - `skill_id: string` + Unique identifier for the skill. The format and length of IDs may change over time. - - `created_at: string` - - ISO 8601 timestamp of when the skill was created. - - - `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - - - `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - - - `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - - - `type: string` + - `type: "skill_version"` Object type. - For Skills, this is always `"skill"`. - - default: skill - - - `updated_at: string` - - ISO 8601 timestamp of when the skill was last updated. - -### Skill Retrieve Response - -- `SkillRetrieveResponse object` - - - `id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - - - `created_at: string` - - ISO 8601 timestamp of when the skill was created. - - - `display_title: string or null` - - Display title for the skill. - - This is a human-readable label that is not included in the prompt sent to the model. - - - `latest_version: string or null` - - The latest version identifier for the skill. - - This represents the most recent version of the skill that has been created. - - - `source: string` - - Source of the skill. - - This may be one of the following values: - - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic - - - `type: string` - - Object type. - - For Skills, this is always `"skill"`. - - default: skill - - - `updated_at: string` - - ISO 8601 timestamp of when the skill was last updated. - -### Skill Delete Response - -- `SkillDeleteResponse object` - - - `id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - - - `type: string` - - Deleted object type. - - For Skills, this is always `"skill_deleted"`. - - default: skill_deleted - -## Skills › Versions - -### Create Skill Version - -**POST** `/v1/skills/{skill_id}/versions` - -Create Skill Version - -#### Path parameters - -- `skill_id: string` - - Unique identifier for the skill. - - The format and length of IDs may change over time. - -#### Headers - -- `"anthropic-beta": optional array of AnthropicBeta` - - Optional header to specify the beta version(s) you want to use. - - - `string` - - - `"message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 38 more` - - - `"message-batches-2024-09-24"` - - - `"prompt-caching-2024-07-31"` - - - `"computer-use-2024-10-22"` - - - `"computer-use-2025-01-24"` - - - `"pdfs-2024-09-25"` - - - `"token-counting-2024-11-01"` - - - `"token-efficient-tools-2025-02-19"` - - - `"output-128k-2025-02-19"` - - - `"files-api-2025-04-14"` - - - `"mcp-client-2025-04-04"` - - - `"mcp-client-2025-11-20"` - - - `"dev-full-thinking-2025-05-14"` - - - `"interleaved-thinking-2025-05-14"` - - - `"code-execution-2025-05-22"` - - - `"extended-cache-ttl-2025-04-11"` - - - `"context-1m-2025-08-07"` - - - `"context-management-2025-06-27"` - - - `"model-context-window-exceeded-2025-08-26"` - - - `"skills-2025-10-02"` - - - `"fast-mode-2026-02-01"` - - - `"output-300k-2026-03-24"` - - - `"user-profiles-2026-03-24"` - - - `"user-profiles-2026-08-18"` - - - `"advisor-tool-2026-03-01"` - - - `"managed-agents-2026-04-01"` - - - `"cache-diagnosis-2026-04-07"` - - - `"dreaming-2026-04-21"` - - - `"thinking-token-count-2026-05-13"` - - - `"server-side-fallback-2026-06-01"` - - - `"server-side-fallback-2026-07-01"` - - - `"fallback-credit-2026-06-01"` - - - `"fallback-credit-2026-07-01"` - - - `"agent-memory-2026-07-22"` - - - `"mid-conversation-tool-changes-2026-07-01"` - - - `"compact-2026-01-12"` - - - `"computer-use-2025-11-24"` - - - `"mcp-tunnels-2026-06-22"` - - - `"structured-outputs-2025-11-13"` - - - `"task-budgets-2026-03-13"` - - - `"thinking-display-updates-2026-08-18"` - - - `"ce-user-management-2026-07-13"` - -#### Body parameters (form-data) - -- `files: array of string` - - Files to upload for the skill. - - All files must be in the same top-level directory and must include a SKILL.md file at the root of that directory. - -#### Returns - -- `id: string` - - Unique identifier for the skill version. - - The format and length of IDs may change over time. - -- `created_at: string` - - ISO 8601 timestamp of when the skill version was created. - -- `description: string` - - Description of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - -- `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - -- `name: string` - - Human-readable name of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - -- `skill_id: string` - - Identifier for the skill that this version belongs to. - -- `type: string` - - Object type. - - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + For Skill Versions, this is always `"skill_version"`. + + default: skill_version #### Example
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F files='["Example data"]' ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
- `limit: optional number` - Number of items to return per page. - - Defaults to `20`. Ranges from `1` to `1000`. + Number of results to return per page. + + Ranges from `1` to `1000`. Defaults to `20`. + + default: 20, minimum: 1, maximum: 1000 - `page: optional string`
#### Returns -- `data: array of object` - - List of skill versions. +- `data: array of BetaSkillVersion` + + List of skills. - `id: string` - Unique identifier for the skill version. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. + + - `created_at: string` + + ISO 8601 timestamp of when the skill was created. + + format: date-time + + - `description: string` + + Description of the skill version. + + This is extracted from the SKILL.md file in the skill upload. + + - `name: string` + + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. + + - `skill_id: string` + + Unique identifier for the skill. The format and length of IDs may change over time. - - `created_at: string` - - ISO 8601 timestamp of when the skill version was created. - - - `description: string` - - Description of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - - `name: string` - - Human-readable name of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - - - `skill_id: string` - - Identifier for the skill that this version belongs to. - - - `type: string` + - `type: "skill_version"` Object type.
default: skill_version - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -- `has_more: boolean` - - Indicates if there are more results in the requested page direction. - - `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Token for fetching the next page of results. + + If `null`, there are no more results available. Pass this value to the `page` parameter in the next request to get the next page. #### Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "data": [ { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ], - "has_more": true, - "next_page": "page_MjAyNS0wNS0xNFQwMDowMDowMFo=" + "next_page": "next_page" } ```
- `version: string` - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Identifies the skill version by its version ID. + + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). #### Headers
```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION/content \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
- `version: string` - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Identifies the skill version: a version ID, or the literal `latest` for the skill's most recent version. + + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). #### Headers
#### Returns -- `id: string` - - Unique identifier for the skill version. - - The format and length of IDs may change over time. - -- `created_at: string` - - ISO 8601 timestamp of when the skill version was created. - -- `description: string` - - Description of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - -- `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - -- `name: string` - - Human-readable name of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - -- `skill_id: string` - - Identifier for the skill that this version belongs to. - -- `type: string` - - Object type. - - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). +- `BetaSkillVersion object` + + - `id: string` + + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. + + - `created_at: string` + + ISO 8601 timestamp of when the skill was created. + + format: date-time + + - `description: string` + + Description of the skill version. + + This is extracted from the SKILL.md file in the skill upload. + + - `name: string` + + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. + + - `skill_id: string` + + Unique identifier for the skill. + + The format and length of IDs may change over time. + + - `type: "skill_version"` + + Object type. + + For Skill Versions, this is always `"skill_version"`. + + default: skill_version #### Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
- `version: string` - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Identifies the skill version by its version ID. + + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). #### Headers
#### Returns -- `id: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -- `type: string` - - Deleted object type. - - For Skill Versions, this is always `"skill_version_deleted"`. - - default: skill_version_deleted +- `BetaDeletedSkillVersion object` + + - `id: string` + + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. + + - `type: "skill_version_deleted"` + + Deleted object type. + + For Skill Versions, this is always `"skill_version_deleted"`. + + default: skill_version_deleted #### Example
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "1759178010641129", - "type": "type" + "id": "id", + "type": "skill_version_deleted" } ```
api/beta/skills/create Changed · +78 / -52 lines
All files must be in the same top-level directory and must include a SKILL.md file at the root of that directory. -- `display_title: optional string or null` +- `display_name: optional string or null` - Display title for the skill. + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. - This is a human-readable label that is not included in the prompt sent to the model. - ## Returns -- `id: string` +- `BetaSkill object` - Unique identifier for the skill. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for the skill. -- `created_at: string` + The format and length of IDs may change over time. - ISO 8601 timestamp of when the skill was created. + - `created_at: string` -- `display_title: string or null` + ISO 8601 timestamp of when the skill was created. - Display title for the skill. + format: date-time - This is a human-readable label that is not included in the prompt sent to the model. + - `display_name: string` -- `latest_version: string or null` + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. - The latest version identifier for the skill. + - `latest_version_id: string` - This represents the most recent version of the skill that has been created. + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. -- `source: string` + - `source: BetaSkillSource` - Source of the skill. + Where the Skill comes from. - This may be one of the following values: + Possible values: - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin -- `type: string` + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` - Object type. + Where the Skill comes from. - For Skills, this is always `"skill"`. + Possible values: - default: skill + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin -- `updated_at: string` + - `"custom"` - ISO 8601 timestamp of when the skill was last updated. + - `"anthropic"` + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` + + Object type. + + For Skills, this is always `"skill"`. + + default: skill + + - `updated_at: string` + + ISO 8601 timestamp of when the skill was last updated. + + format: date-time + ## Example ```bash
curl https://api.anthropic.com/v1/skills \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F files='["Example data"]' ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ```
api/beta/skills/delete Changed · +10 / -9 lines
## Returns -- `id: string` +- `BetaDeletedSkill object` - Unique identifier for the skill. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for the skill. -- `type: string` + The format and length of IDs may change over time. - Deleted object type. + - `type: "skill_deleted"` - For Skills, this is always `"skill_deleted"`. + Deleted object type. - default: skill_deleted + For Skills, this is always `"skill_deleted"`. + default: skill_deleted + ## Example ```bash
curl https://api.anthropic.com/v1/skills/$SKILL_ID \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { "id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type" + "type": "skill_deleted" } ```
api/beta/skills/list Changed · +55 / -38 lines
Number of results to return per page. - Maximum value is 100. Defaults to 20. + Ranges from `1` to `1000`. Defaults to `20`. - default: 20 + default: 20, minimum: 1, maximum: 1000 - `page: optional string`
## Returns -- `data: array of object` +- `data: array of BetaSkill` List of skills.
ISO 8601 timestamp of when the skill was created. - - `display_title: string or null` + format: date-time - Display title for the skill. + - `display_name: string` - This is a human-readable label that is not included in the prompt sent to the model. + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. - - `latest_version: string or null` + - `latest_version_id: string` - The latest version identifier for the skill. + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. - This represents the most recent version of the skill that has been created. + - `source: BetaSkillSource` - - `source: string` + Where the Skill comes from. - Source of the skill. + Possible values: - This may be one of the following values: + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` - - `type: string` + Where the Skill comes from. + Possible values: + + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin + + - `"custom"` + + - `"anthropic"` + + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` + Object type. For Skills, this is always `"skill"`.
ISO 8601 timestamp of when the skill was last updated. -- `has_more: boolean` + format: date-time - Whether there are more results available. - - If `true`, there are additional results that can be fetched using the `next_page` token. - - `next_page: string or null` Token for fetching the next page of results.
```bash curl https://api.anthropic.com/v1/skills \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ], - "has_more": true, - "next_page": "page_MjAyNS0wNS0xNFQwMDowMDowMFo=" + "next_page": "next_page" } ```
api/beta/skills/retrieve Changed · +53 / -27 lines
## Returns -- `id: string` +- `BetaSkill object` - Unique identifier for the skill. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for the skill. -- `created_at: string` + The format and length of IDs may change over time. - ISO 8601 timestamp of when the skill was created. + - `created_at: string` -- `display_title: string or null` + ISO 8601 timestamp of when the skill was created. - Display title for the skill. + format: date-time - This is a human-readable label that is not included in the prompt sent to the model. + - `display_name: string` -- `latest_version: string or null` + Human-readable, single-line label for the Skill. Maximum 255 characters. + Always set: derived from the SKILL.md frontmatter `name` when omitted at + creation. Not unique. - The latest version identifier for the skill. + - `latest_version_id: string` - This represents the most recent version of the skill that has been created. + ID of the newest Skill Version — what `latest` references resolve to. Always set: a Skill holds at least one version. -- `source: string` + - `source: BetaSkillSource` - Source of the skill. + Where the Skill comes from. - This may be one of the following values: + Possible values: - * `"custom"`: the skill was created by a user - * `"anthropic"`: the skill was created by Anthropic + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin -- `type: string` + - `type: "custom" or "anthropic" or "anthropic_example" or "plugin"` - Object type. + Where the Skill comes from. - For Skills, this is always `"skill"`. + Possible values: - default: skill + * `"custom"`: authored by the platform user; private to their workspace + * `"anthropic"`: published by Anthropic; shared and read-only + * `"anthropic_example"`: Anthropic-published sample Skill + * `"plugin"`: resolved from an installed plugin -- `updated_at: string` + - `"custom"` - ISO 8601 timestamp of when the skill was last updated. + - `"anthropic"` + - `"anthropic_example"` + + - `"plugin"` + + - `type: "skill"` + + Object type. + + For Skills, this is always `"skill"`. + + default: skill + + - `updated_at: string` + + ISO 8601 timestamp of when the skill was last updated. + + format: date-time + ## Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "id": "skill_01JAbcdefghijklmnopqrstuvw", "created_at": "2024-10-30T23:58:27.427722Z", - "display_title": "My Custom Skill", - "latest_version": "1759178010641129", - "source": "custom", - "type": "type", + "display_name": "display_name", + "latest_version_id": "latest_version_id", + "source": { + "type": "custom" + }, + "type": "skill", "updated_at": "2024-10-30T23:58:27.427722Z" } ```
api/beta/skills/versions Changed · +199 / -339 lines
### Beta Deleted Skill Version ### Beta Skill Version ### Version Create Response ### Version List Response ### Version Retrieve Response ### Version Delete Response
### Returns -- `id: string` +- `BetaSkillVersion object` - Unique identifier for the skill version. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `created_at: string` + - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. -- `description: string` + format: date-time - Description of the skill version. + - `description: string` - This is extracted from the SKILL.md file in the skill upload. + Description of the skill version. -- `directory: string` + This is extracted from the SKILL.md file in the skill upload. - Directory name of the skill version. + - `name: string` - This is the top-level directory name that was extracted from the uploaded files. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. -- `name: string` + - `skill_id: string` - Human-readable name of the skill version. + Unique identifier for the skill. - This is extracted from the SKILL.md file in the skill upload. + The format and length of IDs may change over time. -- `skill_id: string` + - `type: "skill_version"` - Identifier for the skill that this version belongs to. + Object type. -- `type: string` + For Skill Versions, this is always `"skill_version"`. - Object type. + default: skill_version - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - ### Example ```bash
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F files='["Example data"]' ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
- `limit: optional number` - Number of items to return per page. + Number of results to return per page. - Defaults to `20`. Ranges from `1` to `1000`. + Ranges from `1` to `1000`. Defaults to `20`. + default: 20, minimum: 1, maximum: 1000 + - `page: optional string` Optionally set to the `next_page` token from the previous response.
### Returns -- `data: array of object` +- `data: array of BetaSkillVersion` - List of skill versions. + List of skills. - `id: string` - Unique identifier for the skill version. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. - The format and length of IDs may change over time. - - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. + format: date-time + - `description: string` Description of the skill version.
This is extracted from the SKILL.md file in the skill upload. - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - `name: string` - Human-readable name of the skill version. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. - This is extracted from the SKILL.md file in the skill upload. - - `skill_id: string` - Identifier for the skill that this version belongs to. + Unique identifier for the skill. - - `type: string` + The format and length of IDs may change over time. + - `type: "skill_version"` + Object type. For Skill Versions, this is always `"skill_version"`.
default: skill_version - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -- `has_more: boolean` - - Indicates if there are more results in the requested page direction. - - `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Token for fetching the next page of results. + If `null`, there are no more results available. Pass this value to the `page` parameter in the next request to get the next page. + ### Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "data": [ { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ], - "has_more": true, - "next_page": "page_MjAyNS0wNS0xNFQwMDowMDowMFo=" + "next_page": "next_page" } ```
- `version: string` - Version identifier for the skill. + Identifies the skill version by its version ID. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ### Headers
```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION/content \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
- `version: string` - Version identifier for the skill. + Identifies the skill version: a version ID, or the literal `latest` for the skill's most recent version. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ### Headers
### Returns -- `id: string` +- `BetaSkillVersion object` - Unique identifier for the skill version. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `created_at: string` + - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. -- `description: string` + format: date-time - Description of the skill version. + - `description: string` - This is extracted from the SKILL.md file in the skill upload. + Description of the skill version. -- `directory: string` + This is extracted from the SKILL.md file in the skill upload. - Directory name of the skill version. + - `name: string` - This is the top-level directory name that was extracted from the uploaded files. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. -- `name: string` + - `skill_id: string` - Human-readable name of the skill version. + Unique identifier for the skill. - This is extracted from the SKILL.md file in the skill upload. + The format and length of IDs may change over time. -- `skill_id: string` + - `type: "skill_version"` - Identifier for the skill that this version belongs to. + Object type. -- `type: string` + For Skill Versions, this is always `"skill_version"`. - Object type. + default: skill_version - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - ### Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
- `version: string` - Version identifier for the skill. + Identifies the skill version by its version ID. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ### Headers
### Returns -- `id: string` +- `BetaDeletedSkillVersion object` - Version identifier for the skill. + - `id: string` - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `type: string` + - `type: "skill_version_deleted"` - Deleted object type. + Deleted object type. - For Skill Versions, this is always `"skill_version_deleted"`. + For Skill Versions, this is always `"skill_version_deleted"`. - default: skill_version_deleted + default: skill_version_deleted ### Example
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "1759178010641129", - "type": "type" + "id": "id", + "type": "skill_version_deleted" } ``` ## Domain types -### Version Create Response +### Beta Deleted Skill Version -- `VersionCreateResponse object` +- `BetaDeletedSkillVersion object` - `id: string` - Unique identifier for the skill version. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. - The format and length of IDs may change over time. + - `type: "skill_version_deleted"` - - `created_at: string` + Deleted object type. - ISO 8601 timestamp of when the skill version was created. + For Skill Versions, this is always `"skill_version_deleted"`. - - `description: string` + default: skill_version_deleted - Description of the skill version. +### Beta Skill Version - This is extracted from the SKILL.md file in the skill upload. +- `BetaSkillVersion object` - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - - `name: string` - - Human-readable name of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - - - `skill_id: string` - - Identifier for the skill that this version belongs to. - - - `type: string` - - Object type. - - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -### Version List Response - -- `VersionListResponse object` - - `id: string` - Unique identifier for the skill version. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. - The format and length of IDs may change over time. - - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. + format: date-time + - `description: string` Description of the skill version.
This is extracted from the SKILL.md file in the skill upload. - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - `name: string` - Human-readable name of the skill version. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. - This is extracted from the SKILL.md file in the skill upload. - - `skill_id: string` - Identifier for the skill that this version belongs to. + Unique identifier for the skill. - - `type: string` - - Object type. - - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -### Version Retrieve Response - -- `VersionRetrieveResponse object` - - - `id: string` - - Unique identifier for the skill version. - The format and length of IDs may change over time. - - `created_at: string` + - `type: "skill_version"` - ISO 8601 timestamp of when the skill version was created. - - - `description: string` - - Description of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - - `name: string` - - Human-readable name of the skill version. - - This is extracted from the SKILL.md file in the skill upload. - - - `skill_id: string` - - Identifier for the skill that this version belongs to. - - - `type: string` - Object type. For Skill Versions, this is always `"skill_version"`. default: skill_version - - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -### Version Delete Response - -- `VersionDeleteResponse object` - - - `id: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - - - `type: string` - - Deleted object type. - - For Skill Versions, this is always `"skill_version_deleted"`. - - default: skill_version_deleted
api/beta/skills/versions/create Changed · +26 / -35 lines
## Returns -- `id: string` +- `BetaSkillVersion object` - Unique identifier for the skill version. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `created_at: string` + - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. -- `description: string` + format: date-time - Description of the skill version. + - `description: string` - This is extracted from the SKILL.md file in the skill upload. + Description of the skill version. -- `directory: string` + This is extracted from the SKILL.md file in the skill upload. - Directory name of the skill version. + - `name: string` - This is the top-level directory name that was extracted from the uploaded files. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. -- `name: string` + - `skill_id: string` - Human-readable name of the skill version. + Unique identifier for the skill. - This is extracted from the SKILL.md file in the skill upload. + The format and length of IDs may change over time. -- `skill_id: string` + - `type: "skill_version"` - Identifier for the skill that this version belongs to. + Object type. -- `type: string` + For Skill Versions, this is always `"skill_version"`. - Object type. + default: skill_version - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - ## Example ```bash
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'Content-Type: multipart/form-data' \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" \ -F files='["Example data"]' ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
api/beta/skills/versions/delete Changed · +12 / -12 lines
- `version: string` - Version identifier for the skill. + Identifies the skill version by its version ID. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ## Headers
## Returns -- `id: string` +- `BetaDeletedSkillVersion object` - Version identifier for the skill. + - `id: string` - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `type: string` + - `type: "skill_version_deleted"` - Deleted object type. + Deleted object type. - For Skill Versions, this is always `"skill_version_deleted"`. + For Skill Versions, this is always `"skill_version_deleted"`. - default: skill_version_deleted + default: skill_version_deleted ## Example
curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "1759178010641129", - "type": "type" + "id": "id", + "type": "skill_version_deleted" } ```
api/beta/skills/versions/download Changed · +2 / -3 lines
- `version: string` - Version identifier for the skill. + Identifies the skill version by its version ID. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ## Headers
```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION/content \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
api/beta/skills/versions/list Changed · +27 / -39 lines
- `limit: optional number` - Number of items to return per page. + Number of results to return per page. - Defaults to `20`. Ranges from `1` to `1000`. + Ranges from `1` to `1000`. Defaults to `20`. + default: 20, minimum: 1, maximum: 1000 + - `page: optional string` Optionally set to the `next_page` token from the previous response.
## Returns -- `data: array of object` +- `data: array of BetaSkillVersion` - List of skill versions. + List of skills. - `id: string` - Unique identifier for the skill version. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. - The format and length of IDs may change over time. - - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. + format: date-time + - `description: string` Description of the skill version.
This is extracted from the SKILL.md file in the skill upload. - - `directory: string` - - Directory name of the skill version. - - This is the top-level directory name that was extracted from the uploaded files. - - `name: string` - Human-readable name of the skill version. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. - This is extracted from the SKILL.md file in the skill upload. - - `skill_id: string` - Identifier for the skill that this version belongs to. + Unique identifier for the skill. - - `type: string` + The format and length of IDs may change over time. + - `type: "skill_version"` + Object type. For Skill Versions, this is always `"skill_version"`.
default: skill_version - - `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - -- `has_more: boolean` - - Indicates if there are more results in the requested page direction. - - `next_page: string or null` - Token to provide in as `page` in the subsequent request to retrieve the next page of data. + Token for fetching the next page of results. + If `null`, there are no more results available. Pass this value to the `page` parameter in the next request to get the next page. + ## Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
{ "data": [ { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ], - "has_more": true, - "next_page": "page_MjAyNS0wNS0xNFQwMDowMDowMFo=" + "next_page": "next_page" } ```
api/beta/skills/versions/retrieve Changed · +28 / -37 lines
- `version: string` - Version identifier for the skill. + Identifies the skill version: a version ID, or the literal `latest` for the skill's most recent version. - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). + Requests carrying the `skills-2025-10-02` beta header address versions by their Unix epoch timestamp instead (e.g., "1759178010641129"). ## Headers
## Returns -- `id: string` +- `BetaSkillVersion object` - Unique identifier for the skill version. + - `id: string` - The format and length of IDs may change over time. + Unique identifier for this Skill Version. The id addresses the version in + paths and pins it in references. -- `created_at: string` + - `created_at: string` - ISO 8601 timestamp of when the skill version was created. + ISO 8601 timestamp of when the skill was created. -- `description: string` + format: date-time - Description of the skill version. + - `description: string` - This is extracted from the SKILL.md file in the skill upload. + Description of the skill version. -- `directory: string` + This is extracted from the SKILL.md file in the skill upload. - Directory name of the skill version. + - `name: string` - This is the top-level directory name that was extracted from the uploaded files. + The Skill's immutable kebab-case slug, set at creation from the first + upload's SKILL.md frontmatter `name` (or its enclosing directory). Every + later upload must resolve to the same value. Also the top-level directory + of the Skill's mounted files and the base name of a downloaded archive. -- `name: string` + - `skill_id: string` - Human-readable name of the skill version. + Unique identifier for the skill. - This is extracted from the SKILL.md file in the skill upload. + The format and length of IDs may change over time. -- `skill_id: string` + - `type: "skill_version"` - Identifier for the skill that this version belongs to. + Object type. -- `type: string` + For Skill Versions, this is always `"skill_version"`. - Object type. + default: skill_version - For Skill Versions, this is always `"skill_version"`. - - default: skill_version - -- `version: string` - - Version identifier for the skill. - - Each version is identified by a Unix epoch timestamp (e.g., "1759178010641129"). - ## Example ```bash curl https://api.anthropic.com/v1/skills/$SKILL_ID/versions/$VERSION \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: skills-2025-10-02' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
```json { - "id": "skillver_01JAbcdefghijklmnopqrstuvw", + "id": "id", "created_at": "2024-10-30T23:58:27.427722Z", - "description": "A custom skill for doing something useful", - "directory": "my-skill", - "name": "my-skill", + "description": "description", + "name": "name", "skill_id": "skill_01JAbcdefghijklmnopqrstuvw", - "type": "type", - "version": "1759178010641129" + "type": "skill_version" } ```
api/beta/webhooks Changed · +9 / -576 lines
## Parse Unverified ### Unwrap Webhook Event
The two sides of this change are too far apart to line up, so this is the differ's own diff of it.
## Unwrap +Verifies the webhook signature from the `webhook-id`, `webhook-timestamp` and `webhook-signature` +headers using your webhook signing key, then parses the payload into an event. Fails if the +signature is missing or invalid. + +## Parse Unverified + +Parses a webhook payload into an event without verifying its signature. Prefer `unwrap()` unless +you have already verified the signature yourself. + ## Domain types ### Beta Webhook Agent Archived Event Data
- `type: "vault.deleted"` - `workspace_id: string` - -### Unwrap Webhook Event - -- `UnwrapWebhookEvent object` - - - `id: string` - - Unique event identifier for idempotency. - - - `created_at: string` - - RFC 3339 timestamp when the event occurred. - - format: date-time - - - `data: BetaWebhookEventData` - - - `BetaWebhookSessionCreatedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.created"` - - - `workspace_id: string` - - - `BetaWebhookSessionPendingEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.pending"` - - - `workspace_id: string` - - - `BetaWebhookSessionRunningEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.running"` - - - `workspace_id: string` - - - `BetaWebhookSessionIdledEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.idled"` - - - `workspace_id: string` - - - `BetaWebhookSessionRequiresActionEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.requires_action"` - - - `workspace_id: string` - - - `BetaWebhookSessionArchivedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.archived"` - - - `workspace_id: string` - - - `BetaWebhookSessionDeletedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.deleted"` - - - `workspace_id: string` - - - `BetaWebhookSessionStatusRescheduledEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.status_rescheduled"` - - - `workspace_id: string` - - - `BetaWebhookSessionStatusRunStartedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.status_run_started"` - - - `workspace_id: string` - - - `BetaWebhookSessionStatusIdledEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.status_idled"` - - - `workspace_id: string` - - - `BetaWebhookSessionStatusTerminatedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.status_terminated"` - - - `workspace_id: string` - - - `BetaWebhookSessionThreadCreatedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `session_thread_id: string` - - ID of the session thread this event refers to. - - - `type: "session.thread_created"` - - - `workspace_id: string` - - - `BetaWebhookSessionThreadIdledEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `session_thread_id: string` - - ID of the session thread this event refers to. - - - `type: "session.thread_idled"` - - - `workspace_id: string` - - - `BetaWebhookSessionThreadTerminatedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `session_thread_id: string` - - ID of the session thread this event refers to. - - - `type: "session.thread_terminated"` - - - `workspace_id: string` - - - `BetaWebhookSessionOutcomeEvaluationEndedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.outcome_evaluation_ended"` - - - `workspace_id: string` - - - `BetaWebhookVaultCreatedEventData object` - - - `id: string` - - ID of the vault that triggered the event. - - - `organization_id: string` - - - `type: "vault.created"` - - - `workspace_id: string` - - - `BetaWebhookVaultArchivedEventData object` - - - `id: string` - - ID of the vault that triggered the event. - - - `organization_id: string` - - - `type: "vault.archived"` - - - `workspace_id: string` - - - `BetaWebhookVaultDeletedEventData object` - - - `id: string` - - ID of the vault that triggered the event. - - - `organization_id: string` - - - `type: "vault.deleted"` - - - `workspace_id: string` - - - `BetaWebhookVaultCredentialCreatedEventData object` - - - `id: string` - - ID of the vault credential that triggered the event. - - - `organization_id: string` - - - `type: "vault_credential.created"` - - - `vault_id: string` - - ID of the vault that owns this credential. - - - `workspace_id: string` - - - `BetaWebhookVaultCredentialArchivedEventData object` - - - `id: string` - - ID of the vault credential that triggered the event. - - - `organization_id: string` - - - `type: "vault_credential.archived"` - - - `vault_id: string` - - ID of the vault that owns this credential. - - - `workspace_id: string` - - - `BetaWebhookVaultCredentialDeletedEventData object` - - - `id: string` - - ID of the vault credential that triggered the event. - - - `organization_id: string` - - - `type: "vault_credential.deleted"` - - - `vault_id: string` - - ID of the vault that owns this credential. - - - `workspace_id: string` - - - `BetaWebhookVaultCredentialRefreshFailedEventData object` - - - `id: string` - - ID of the vault credential that triggered the event. - - - `organization_id: string` - - - `type: "vault_credential.refresh_failed"` - - - `vault_id: string` - - ID of the vault that owns this credential. - - - `workspace_id: string` - - - `BetaWebhookSessionUpdatedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.updated"` - - - `workspace_id: string` - - - `BetaWebhookAgentCreatedEventData object` - - - `id: string` - - ID of the agent that triggered the event. - - - `organization_id: string` - - - `type: "agent.created"` - - - `workspace_id: string` - - - `BetaWebhookAgentArchivedEventData object` - - - `id: string` - - ID of the agent that triggered the event. - - - `organization_id: string` - - - `type: "agent.archived"` - - - `workspace_id: string` - - - `BetaWebhookAgentDeletedEventData object` - - - `id: string` - - ID of the agent that triggered the event. - - - `organization_id: string` - - - `type: "agent.deleted"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentPausedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.paused"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentRunFailedEventData object` - - - `id: string` - - ID of the deployment run that triggered the event. - - - `organization_id: string` - - - `type: "deployment_run.failed"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentCreatedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.created"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentUpdatedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.updated"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentUnpausedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.unpaused"` - - - `workspace_id: string` - - - `BetaWebhookAgentUpdatedEventData object` - - - `id: string` - - ID of the agent that triggered the event. - - - `organization_id: string` - - - `type: "agent.updated"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentArchivedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.archived"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentRunStartedEventData object` - - - `id: string` - - ID of the deployment run that triggered the event. - - - `organization_id: string` - - - `type: "deployment_run.started"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentDeletedEventData object` - - - `id: string` - - ID of the deployment that triggered the event. - - - `organization_id: string` - - - `type: "deployment.deleted"` - - - `workspace_id: string` - - - `BetaWebhookDeploymentRunSucceededEventData object` - - - `id: string` - - ID of the deployment run that triggered the event. - - - `organization_id: string` - - - `type: "deployment_run.succeeded"` - - - `workspace_id: string` - - - `BetaWebhookEnvironmentCreatedEventData object` - - - `id: string` - - ID of the environment that triggered the event. - - - `organization_id: string` - - - `type: "environment.created"` - - - `workspace_id: string` - - - `BetaWebhookEnvironmentUpdatedEventData object` - - - `id: string` - - ID of the environment that triggered the event. - - - `organization_id: string` - - - `type: "environment.updated"` - - - `workspace_id: string` - - - `BetaWebhookEnvironmentArchivedEventData object` - - - `id: string` - - ID of the environment that triggered the event. - - - `organization_id: string` - - - `type: "environment.archived"` - - - `workspace_id: string` - - - `BetaWebhookEnvironmentDeletedEventData object` - - - `id: string` - - ID of the environment that triggered the event. - - - `organization_id: string` - - - `type: "environment.deleted"` - - - `workspace_id: string` - - - `BetaWebhookMemoryStoreCreatedEventData object` - - - `id: string` - - ID of the memory store that triggered the event. - - - `organization_id: string` - - - `type: "memory_store.created"` - - - `workspace_id: string` - - - `BetaWebhookMemoryStoreArchivedEventData object` - - - `id: string` - - ID of the memory store that triggered the event. - - - `organization_id: string` - - - `type: "memory_store.archived"` - - - `workspace_id: string` - - - `BetaWebhookMemoryStoreDeletedEventData object` - - - `id: string` - - ID of the memory store that triggered the event. - - - `organization_id: string` - - - `type: "memory_store.deleted"` - - - `workspace_id: string` - - - `BetaWebhookSessionBudgetReachedEventData object` - - - `id: string` - - ID of the session that triggered the event. - - - `organization_id: string` - - - `type: "session.budget_reached"` - - - `workspace_id: string` - - - `type: "event"` - - Object type. Always `event` for webhook payloads.
api/compliance/apps/projects Changed · +26 / -26 lines
## Domain types -### Project List Response +### Project Retrieve Response -- `ProjectListResponse object` +- `ProjectRetrieveResponse object` - Project information for compliance responses. + Detailed project information for compliance responses. - `id: string` Project identifier (tagged ID) + - `attachments_count: number` + + Number of attachments contained within this project + + - `chats_count: number` + + Number of chats contained within this project + - `created_at: string` Project creation timestamp
format: date-time + - `description: string` + + Project description + + - `instructions: string` + + Project's custom instructions / prompt + - `is_private: boolean` If false, the project is visible to all organization members; if true the project is accessible only to the creator and specified collaborators
Organization identifier (tagged ID) -### Project Retrieve Response +### Project List Response -- `ProjectRetrieveResponse object` +- `ProjectListResponse object` - Detailed project information for compliance responses. + Project information for compliance responses. - `id: string` Project identifier (tagged ID) - - `attachments_count: number` - - Number of attachments contained within this project - - - `chats_count: number` - - Number of chats contained within this project - - `created_at: string` Project creation timestamp
Timestamp when the project was deleted by an end user, or null otherwise format: date-time - - - `description: string` - - Project description - - - `instructions: string` - - Project's custom instructions / prompt - `is_private: boolean`
api/compliance/apps/projects/documents Changed · +16 / -16 lines
User's email address +### Document Delete Response + +- `DocumentDeleteResponse object` + + Response for deleting a project document. + + - `id: string` + + The ID of the project document that was deleted + + - `type: "claude_project_document_deleted"` + + Constant string confirming deletion. + + default: claude_project_document_deleted + ### Document Metadata Response - `DocumentMetadataResponse object`
- `email_address: string` User's email address - -### Document Delete Response - -- `DocumentDeleteResponse object` - - Response for deleting a project document. - - - `id: string` - - The ID of the project document that was deleted - - - `type: "claude_project_document_deleted"` - - Constant string confirming deletion. - - default: claude_project_document_deleted
api/compliance/apps/sessions/local Changed · +6 / -6 lines
## Domain types -### Local List Response +### Local Retrieve Response -- `LocalListResponse object` +- `LocalRetrieveResponse object` A session that a user ran on their own computer in a Claude app while signed in with their organization account.
Workspace identifier (tagged ID, prefixed `wrkspc_`). Null for sessions not attributed to a workspace. -### Local Retrieve Response +### Local List Response -- `LocalRetrieveResponse object` +- `LocalListResponse object` A session that a user ran on their own computer in a Claude app while signed in with their organization account.
api/compliance/groups Changed · +34 / -34 lines
## Domain types -### Group List Response +### Group Retrieve Response -- `GroupListResponse object` +- `GroupRetrieveResponse object` Group information for compliance responses.
Group last-updated timestamp (ISO 8601) -### Group Retrieve Response +### Group List Response -- `GroupRetrieveResponse object` +- `GroupListResponse object` Group information for compliance responses.
api/compliance/organizations/roles Changed · +26 / -26 lines
## Domain types -### Role List Response +### Role Retrieve Response -- `RoleListResponse object` +- `RoleRetrieveResponse object` Role information for compliance responses.
Role last-updated timestamp (ISO 8601) -### Role Retrieve Response +### Role List Response -- `RoleRetrieveResponse object` +- `RoleListResponse object` Role information for compliance responses.
build-with-claude/files Changed · +23 / -0 lines
## Migrate from `files-api-2025-04-14` ### SDK beta namespace
If your organization has the [Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api) enabled, its [Activity Feed](https://platform.claude.com/docs/en/manage-claude/compliance-activity-feed) records Files API operations made with a Claude API key or from the Claude Console: each upload (`POST /v1/files`), content download (`GET /v1/files/{file_id}/content`), and deletion (`DELETE /v1/files/{file_id}`) appears as a `platform_file_uploaded`, `platform_file_content_downloaded`, or `platform_file_deleted` activity. Listing files and retrieving file metadata are not recorded. Operations that occur while the Compliance API is off are not recorded and cannot be recovered later, so [set up the Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api-access) before you rely on this audit trail. On [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#monitoring-and-logging), audit file operations with AWS CloudTrail data events instead. +## Migrate from `files-api-2025-04-14` + +The Files API is out of beta and needs no beta header. Migrating off `files-api-2025-04-14` is optional: requests that still send it keep working and keep returning the beta response shapes, so an existing integration keeps working until you change it. Removing the header switches those requests to the shapes documented on this page: + +| | With `files-api-2025-04-14` | Without the header | +| ---------------------------------------- | --------------------------------------- | ---------------------------------------------------------------------------- | +| List response | `{ data, has_more, first_id, last_id }` | `{ data, next_page }`; pass `next_page` back as the `page` query parameter | +| List cursors | `before_id`, `after_id` | `page`, or up to 100 `ids[]` (`before_id` and `after_id` return a 400 error) | +| `expires_at` on file objects | Not returned | Always present; `null` when the file has no expiration | +| `Content-Type` on the uploaded file part | Required | Optional; the type is detected when omitted | + +To migrate: + +1. **Remove the beta header.** Drop `anthropic-beta: files-api-2025-04-14` from your requests. In the SDKs, call `client.files` instead of `client.beta.files`; keeping `client.beta.files` works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/files#sdk-beta-namespace). Earlier releases send it from `client.beta.files` even with no `betas` argument. +2. **Update pagination.** Replace `after_id`/`before_id` loops with the `page`/`next_page` cursor, or use the SDK auto-pagination helpers shown in [Managing files](https://platform.claude.com/docs/en/build-with-claude/files#managing-files). +3. **Read `expires_at`.** The field appears only without the header; `null` means the file has no expiration (see [File expiration](https://platform.claude.com/docs/en/build-with-claude/files#file-expiration)). + +### SDK beta namespace + +Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.files` no longer sends `files-api-2025-04-14` and returns the same shapes as `client.files`, with `Beta`-prefixed type names. It accepts a `betas` argument for Files features that are still in beta, such as `scope_id` filtering under a [Managed Agents](https://platform.claude.com/docs/en/managed-agents/files) beta header. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. + +Requests that carry `anthropic-beta: managed-agents-2026-04-01` without `files-api-2025-04-14` receive the shapes on this page with one compatibility affordance on `GET /v1/files`: `before_id` and `after_id` are still accepted (not combinable with `page` or `ids[]`), and the list response includes `has_more`, `first_id`, and `last_id` alongside `next_page`. Later Managed Agents beta versions receive the plain shape. + ## Error handling Common errors when using the Files API include:
build-with-claude/skills-guide Changed · +35 / -0 lines
## Migrate from `skills-2025-10-02` ### SDK beta namespace
*** +## Migrate from `skills-2025-10-02` + +The Skills API is out of beta and needs no beta header. Migrating off `skills-2025-10-02` is optional: requests that still send it keep working and keep returning the beta response shapes, so an existing integration keeps working until you change it. Removing the header switches those requests to the shapes documented on this page: + +| | With `skills-2025-10-02` | Without the header | +| ------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| Skill label | `display_title` (up to 64 characters, unique per workspace) | `display_name` (up to 255 characters, not unique); derived from the `SKILL.md` `name` when omitted | +| Newest version pointer | `latest_version`, an epoch-microsecond string such as `"1759178010641129"` | `latest_version_id`, a version ID such as `"skver_01AbCdEfGhIjKlMnOpQrStUv"`; `GET /v1/skills/{skill_id}/versions/latest` resolves it in one call | +| Version identifier in URLs | Epoch-microsecond string | Version ID (`skver_...`). IDs captured under the beta with the `skill_version_` prefix are accepted as input. | +| Version object | Includes `directory` (always equal to the Skill `name`) | No `directory` field | +| `source` | A string, `"custom"` or `"anthropic"` | An object, for example `{"type": "custom"}`; the example catalog value is `"anthropic_example"` | +| List responses | `{ data, has_more, next_page }` | `{ data, next_page }`; `limit` from 1 to 1,000 (default 20) | +| Versions list order | Oldest first | Newest first, default `limit` 20. Page cursors from one shape are not valid on the other. | +| Deleting a Skill | Returns a 400 error while any version exists | Deletes the Skill and all of its versions | +| Deleting a Skill's only version | Allowed, leaving a Skill with no versions | Returns a 400 error; upload a replacement version first, or delete the Skill | +| Upload layout | Files must sit inside a top-level directory whose name matches the Skill `name` | `SKILL.md` may sit at the root of the upload; stored paths are the same either way | +| Response types | `CreateSkillResponse`, `GetSkillResponse`, and one type per operation | `Skill`, `SkillVersion`, `DeletedSkill`, `DeletedSkillVersion` | + +To migrate: + +1. **Remove the beta header.** Drop `anthropic-beta: skills-2025-10-02` from your requests. In the SDKs, call `client.skills` instead of `client.beta.skills`; keeping `client.beta.skills` works only on the [SDK releases that no longer send the header](https://platform.claude.com/docs/en/build-with-claude/skills-guide#sdk-beta-namespace). Earlier releases send it from `client.beta.skills` even with no `betas` argument. +2. **Rename fields** in your code: `display_title` to `display_name`, `latest_version` to `latest_version_id`, and read `source.type` instead of comparing `source` to a string. +3. **Use version IDs.** Wherever you stored an epoch-microsecond version, store the version's `id` instead, or use `latest`. Skill references in Messages requests accept a version ID, `latest`, or (for Anthropic Skills) the catalog version. +4. **Review delete calls.** `DELETE /v1/skills/{skill_id}` now removes every version with the Skill. If you relied on the beta's refusal as a safeguard, add your own check. + +<Warning> + After migrating, `client.skills.delete(skill_id)` and `client.beta.skills.delete(skill_id)` delete the Skill together with all of its versions in one call. +</Warning> + +A Skill whose versions were all deleted under the beta has no current version to return: `GET /v1/skills/{skill_id}` returns a 400 error and the Skill is omitted from list responses until you upload a version to it. You can still delete it. + +### SDK beta namespace + +Starting with Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.skills` no longer sends `skills-2025-10-02` and returns the same shapes as `client.skills`, with `Beta`-prefixed type names (`BetaSkill`, `BetaSkillVersion`, `BetaDeletedSkill`, `BetaDeletedSkillVersion`). It accepts a `betas` argument for Skills features that are still in beta. In the beta Messages types, the container Skill reference type is renamed from `BetaSkill` to `BetaContainerSkill` (same fields: `type`, `skill_id`, `version`); `BetaSkill` now names the Skill resource, matching `Skill` and `ContainerSkill` in the non-beta types. Earlier SDK releases are typed to the beta shapes; if you depend on those types, stay on an earlier release until you migrate. + ## Data retention Agent Skills are not covered by ZDR arrangements. Skill definitions and execution data are retained according to Anthropic's standard data retention policy.
build-with-claude/structured-outputs Changed · +4 / -4 lines
-H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ - "model": "claude-opus-4-8", + "model": "claude-opus-5", "max_tokens": 4096, "messages": [ {
-H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ - "model": "claude-opus-4-8", + "model": "claude-opus-5", "max_tokens": 1024, "messages": [ {
-H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ - "model": "claude-opus-4-8", + "model": "claude-opus-5", "max_tokens": 1024, "messages": [ {
-H "x-api-key: $ANTHROPIC_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ - "model": "claude-opus-4-8", + "model": "claude-opus-5", "max_tokens": 1024, "messages": [ {
build-with-claude/thinking-steering-and-cost Changed · +22 / -22 lines
```json { - "model": "claude-opus-4-8", + "model": "claude-opus-5", "max_tokens": 4096, "output_config": { "effort": "medium" }, "messages": [{ "role": "user", "content": "..." }]
# First request - establish cache print("First request - establishing cache") response1 = client.messages.create( - model="claude-opus-4-8", + model="claude-opus-5", max_tokens=16000, thinking={"type": "adaptive"}, messages=MESSAGES,
# Second request - same configuration (cache hit expected) print("\nSecond request - same configuration (cache hit expected)") response2 = client.messages.create( - model="claude-opus-4-8", + model="claude-opus-5", max_tokens=16000, thinking={"type": "adaptive"}, messages=MESSAGES,
# Third request - different effort level (cache miss expected) print("\nThird request - different effort level (cache miss expected)") response3 = client.messages.create( - model="claude-opus-4-8", + model="claude-opus-5", max_tokens=16000, thinking={"type": "adaptive"}, output_config={"effort": "medium"},
// First request - establish cache console.log("First request - establishing cache"); const response1 = await client.messages.create({ - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive" }, messages
// Second request - same configuration (cache hit expected) console.log("\nSecond request - same configuration (cache hit expected)"); const response2 = await client.messages.create({ - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive" }, messages
// Third request - different effort level (cache miss expected) console.log("\nThird request - different effort level (cache miss expected)"); const response3 = await client.messages.create({ - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive" }, output_config: { effort: "medium" },
Console.WriteLine("First request - establishing cache"); var parameters1 = new MessageCreateParams { - Model = Model.ClaudeOpus4_8, + Model = Model.ClaudeOpus5, MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), Messages =
Console.WriteLine("\nSecond request - same configuration (cache hit expected)"); var parameters2 = new MessageCreateParams { - Model = Model.ClaudeOpus4_8, + Model = Model.ClaudeOpus5, MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), Messages =
Console.WriteLine("\nThird request - different effort level (cache miss expected)"); var parameters3 = new MessageCreateParams { - Model = Model.ClaudeOpus4_8, + Model = Model.ClaudeOpus5, MaxTokens = 16000, Thinking = new ThinkingConfigAdaptive(), OutputConfig = new OutputConfig
// First request - establish cache fmt.Println("First request - establishing cache") response1, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{ - Model: anthropic.ModelClaudeOpus4_8, + Model: anthropic.ModelClaudeOpus5, MaxTokens: 16000, Thinking: anthropic.ThinkingConfigParamUnion{ OfAdaptive: &anthropic.ThinkingConfigAdaptiveParam{},
// Second request - same configuration (cache hit expected) fmt.Println("\nSecond request - same configuration (cache hit expected)") response2, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{ - Model: anthropic.ModelClaudeOpus4_8, + Model: anthropic.ModelClaudeOpus5, MaxTokens: 16000, Thinking: anthropic.ThinkingConfigParamUnion{ OfAdaptive: &anthropic.ThinkingConfigAdaptiveParam{},
// Third request - different effort level (cache miss expected) fmt.Println("\nThird request - different effort level (cache miss expected)") response3, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{ - Model: anthropic.ModelClaudeOpus4_8, + Model: anthropic.ModelClaudeOpus5, MaxTokens: 16000, Thinking: anthropic.ThinkingConfigParamUnion{ OfAdaptive: &anthropic.ThinkingConfigAdaptiveParam{},
// First request - establishing cache IO.println("First request - establishing cache"); MessageCreateParams params1 = MessageCreateParams.builder() - .model(Model.CLAUDE_OPUS_4_8) + .model(Model.CLAUDE_OPUS_5) .maxTokens(16000L) .thinking(ThinkingConfigAdaptive.builder().build()) .addUserMessageOfBlockParams(List.of(
// Second request - same configuration (cache hit expected) IO.println("\nSecond request - same configuration (cache hit expected)"); MessageCreateParams params2 = MessageCreateParams.builder() - .model(Model.CLAUDE_OPUS_4_8) + .model(Model.CLAUDE_OPUS_5) .maxTokens(16000L) .thinking(ThinkingConfigAdaptive.builder().build()) .addUserMessageOfBlockParams(List.of(
// Third request - different effort level (cache miss expected) IO.println("\nThird request - different effort level (cache miss expected)"); MessageCreateParams params3 = MessageCreateParams.builder() - .model(Model.CLAUDE_OPUS_4_8) + .model(Model.CLAUDE_OPUS_5) .maxTokens(16000L) .thinking(ThinkingConfigAdaptive.builder().build()) .outputConfig(OutputConfig.builder()
] ] ]], - model: 'claude-opus-4-8', + model: 'claude-opus-5', thinking: ['type' => 'adaptive'], );
'content' => 'Analyze the characters in this passage.' ] ], - model: 'claude-opus-4-8', + model: 'claude-opus-5', thinking: ['type' => 'adaptive'], );
'content' => 'Analyze the setting in this passage.' ] ], - model: 'claude-opus-4-8', + model: 'claude-opus-5', thinking: ['type' => 'adaptive'], outputConfig: ['effort' => 'medium'], );
puts "First request - establishing cache" response1 = client.messages.create( - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive"
puts "\nSecond request - same configuration (cache hit expected)" response2 = client.messages.create( - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive"
puts "\nThird request - different effort level (cache miss expected)" response3 = client.messages.create( - model: "claude-opus-4-8", + model: "claude-opus-5", max_tokens: 16000, thinking: { type: "adaptive"
cli-sdks-libraries/libraries/openai-sdk Changed · +169 / -6 lines
### Quick start example -<CodeGroup> +<CodeGroup exclude="shell"> ```python Python import os
import OpenAI from "openai"; const openai = new OpenAI({ - apiKey: "ANTHROPIC_API_KEY", // Your Claude API key + apiKey: process.env.ANTHROPIC_API_KEY, // Your Claude API key baseURL: "https://api.anthropic.com/v1/" // Claude API endpoint }); const response = await openai.chat.completions.create({ - messages: [{ role: "user", content: "Who are you?" }], + messages: [ + { role: "system", content: "You are a helpful assistant." }, + { role: "user", content: "Who are you?" } + ], model: "claude-opus-5" // Claude model name }); console.log(response.choices[0].message.content); ``` + + ```csharp C# + using System.ClientModel; + using OpenAI; + using OpenAI.Chat; + + ChatClient chatClient = new( + model: "claude-opus-5", // Claude model name + credential: new ApiKeyCredential( + Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY")), // Your Claude API key + options: new OpenAIClientOptions() + { + Endpoint = new Uri("https://api.anthropic.com/v1/") // the Claude API endpoint + }); + + ChatCompletion completion = chatClient.CompleteChat( + new SystemChatMessage("You are a helpful assistant."), + new UserChatMessage("Who are you?")); + + Console.WriteLine(completion.Content[0].Text); + ``` + + ```go Go + package main + + import ( + "context" + "fmt" + "os" + + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" + ) + + func main() { + client := openai.NewClient( + option.WithAPIKey(os.Getenv("ANTHROPIC_API_KEY")), // Your Claude API key + option.WithBaseURL("https://api.anthropic.com/v1/"), // the Claude API endpoint + ) + + response, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{ + Model: "claude-opus-5", // Claude model name + Messages: []openai.ChatCompletionMessageParamUnion{ + openai.SystemMessage("You are a helpful assistant."), + openai.UserMessage("Who are you?"), + }, + }) + if err != nil { + panic(err) + } + + fmt.Println(response.Choices[0].Message.Content) + } + ``` + + ```java Java + import com.openai.client.OpenAIClient; + import com.openai.client.okhttp.OpenAIOkHttpClient; + import com.openai.models.chat.completions.ChatCompletion; + import com.openai.models.chat.completions.ChatCompletionCreateParams; + + public class QuickStart { + public static void main(String[] args) { + OpenAIClient client = OpenAIOkHttpClient.builder() + .apiKey(System.getenv("ANTHROPIC_API_KEY")) // Your Claude API key + .baseUrl("https://api.anthropic.com/v1/") // the Claude API endpoint + .build(); + + ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() + .model("claude-opus-5") // Claude model name + .addSystemMessage("You are a helpful assistant.") + .addUserMessage("Who are you?") + .build(); + + ChatCompletion completion = client.chat().completions().create(params); + System.out.println(completion.choices().get(0).message().content().orElse("")); + } + } + ``` + + ```php PHP + <?php + // There is no official OpenAI PHP SDK, so no example is shown here. + // To use Claude from PHP, use the native Claude API instead: + // https://platform.claude.com/docs/en/cli-sdks-libraries/overview + ``` + + ```ruby Ruby + require "openai" + + openai = OpenAI::Client.new( + api_key: ENV["ANTHROPIC_API_KEY"], # Your Claude API key + base_url: "https://api.anthropic.com/v1/" # the Claude API endpoint + ) + + response = openai.chat.completions.create( + model: "claude-opus-5", # Claude model name + messages: [ + {role: "system", content: "You are a helpful assistant."}, + {role: "user", content: "Who are you?"} + ] + ) + + puts response.choices.first.message.content + ``` </CodeGroup> ## Important OpenAI compatibility limitations
### Thinking support -You can enable [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) by adding the `thinking` parameter. On current models thinking is adaptive, with Claude deciding when and how deeply to think, and on Claude 5 models it is on by default; manually configured extended thinking is a legacy mode. While thinking improves Claude's reasoning for complex tasks, the OpenAI SDK doesn't return Claude's detailed thought process. For full thinking features, including access to Claude's step-by-step reasoning output, use the native Claude API. +You can enable [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) by adding the `thinking` parameter. On current models thinking is adaptive, with Claude deciding when and how deeply to think, and on Claude 5 models it is on by default; manually configured extended thinking is a legacy mode. Although thinking improves Claude's reasoning for complex tasks, the OpenAI SDK doesn't return Claude's detailed thought process. For full thinking features, including access to Claude's step-by-step reasoning output, use the native Claude API. -<CodeGroup> +<CodeGroup exclude="shell"> ```python Python response = client.chat.completions.create( model="claude-sonnet-4-6",
// @ts-expect-error thinking: { type: "enabled", budget_tokens: 2000 } }); + ``` + + ```csharp C# + // The .NET SDK has no extra_body parameter like Python's, so this example + // sends the thinking parameter with the SDK's documented protocol method + // (a raw JSON request body). + BinaryData input = BinaryData.FromString(""" + { + "model": "claude-sonnet-4-6", + "messages": [{ "role": "user", "content": "Who are you?" }], + "thinking": { "type": "enabled", "budget_tokens": 2000 } + } + """); + + using BinaryContent content = BinaryContent.Create(input); + ClientResult result = chatClient.CompleteChat(content); + ``` + + ```go Go + response, err := client.Chat.Completions.New( + context.Background(), + openai.ChatCompletionNewParams{ + Model: "claude-sonnet-4-6", + Messages: []openai.ChatCompletionMessageParamUnion{ + openai.UserMessage("Who are you?"), + }, + }, + option.WithJSONSet("thinking", map[string]any{"type": "enabled", "budget_tokens": 2000}), + ) + ``` + + ```java Java + ChatCompletionCreateParams params = ChatCompletionCreateParams.builder() + .model("claude-sonnet-4-6") + .addUserMessage("Who are you?") + .putAdditionalBodyProperty("thinking", + JsonValue.from(Map.of("type", "enabled", "budget_tokens", 2000))) + .build(); + + ChatCompletion completion = client.chat().completions().create(params); + ``` + + ```php PHP + <?php + // There is no official OpenAI PHP SDK, so no example is shown here. + // To use Claude from PHP, use the native Claude API instead: + // https://platform.claude.com/docs/en/cli-sdks-libraries/overview + ``` + + ```ruby Ruby + response = openai.chat.completions.create( + model: "claude-sonnet-4-6", + messages: [{role: "user", content: "Who are you?"}], + request_options: {extra_body: {thinking: {type: "enabled", budget_tokens: 2000}}} + ) ``` </CodeGroup>
manage-claude/compliance-faq Changed · +3 / -3 lines
To retrieve message bodies and file contents, use the chat, message, and file endpoints with a Compliance Access Key carrying `read:compliance_user_data`. The same key and scope retrieve transcripts of Cowork and Claude Code sessions on users' machines through the [local session endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-local-sessions), and transcripts of Cowork sessions in the cloud through the [remote session endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-remote-sessions). These endpoints serve Claude Enterprise content only; Claude Console workloads, and Claude API workloads authenticated with an API key, expose administrative and resource events through the Activity Feed but do not expose prompt text or model responses through the Compliance API. </Accordion> - <Accordion title="Do Cowork and Claude Code sessions appear in the Compliance API?"> + <Accordion title="Do Cowork, Claude Code, Claude Science, and Claude for Microsoft 365 sessions appear in the Compliance API?"> Yes. Cowork sessions in Claude Desktop that run on users' machines, Claude Code sessions (in the terminal, in Claude Desktop, or in an IDE extension), sessions in the Claude Science desktop app, and Claude for Microsoft 365 sessions in Excel, PowerPoint, Word, and Outlook are captured while users are signed in with their Claude Enterprise account and are available through the [local session endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-local-sessions). Cowork sessions started on claude.ai web or mobile, which run in the cloud in Anthropic-managed environments, are available through the [remote session endpoints](https://platform.claude.com/docs/en/manage-claude/compliance-sessions#retrieve-remote-sessions). Each family has a list endpoint that returns session metadata and a messages endpoint that returns the session transcript (user prompts, assistant responses, and tool calls and results). The local family adds a third endpoint that retrieves one session's metadata. All of these endpoints use your existing Compliance Access Key with `read:compliance_user_data`; no new key or scope is needed. Local sessions are captured as their requests reach the Claude API, so nothing is installed on the device, and on-device activity that never reaches the API is not captured. Claude Code sessions authenticated with a Claude Console API key, Claude Code sessions run through a third-party cloud platform (Amazon Bedrock, Google Cloud, or Microsoft Foundry), and Claude Code on the web are not captured. Claude Code on the web also runs in the cloud in Anthropic-managed environments, but it is not a remote session; the remote session endpoints return Cowork sessions only. Organizations with [HIPAA readiness](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#hipaa-readiness) enabled get no local session data, and sessions for which [zero data retention (ZDR)](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#zero-data-retention-zdr-scope) is in effect are excluded.
The local and remote session endpoints are stable for Cowork and Claude Code sessions; coverage of Claude Science and Claude for Microsoft 365 sessions is in beta. </Accordion> - <Accordion title="What do Cowork and Claude Code session transcripts include?"> - Local and remote session transcripts both carry user prompts, assistant responses, and tool calls and results. For local sessions (Cowork and Claude Code on users' machines), that is what Claude was asked to do and what it returned, not what happened on the device. + <Accordion title="What do Cowork, Claude Code, Claude Science, and Claude for Microsoft 365 session transcripts include?"> + Local and remote session transcripts both carry user prompts, assistant responses, and tool calls and results. For local sessions (on users' machines), that is what Claude was asked to do and what it returned, not what happened on the device. | Data | Local sessions (on users' machines) | Remote sessions (in the cloud) | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
managed-agents/memory Changed · +7 / -7 lines
</CodeGroup> <Tip> - Individual memories within the store are capped at 100 kB (\~25k tokens). A store holds a maximum of 2,000 memories. Structure memory as many small focused files, not a few large ones. + Individual memories within the store are capped at 100 kB (\~25k tokens). A store holds a maximum of 10,000 memories. Structure memory as many small focused files, not a few large ones. </Tip> ## Attach a memory store to a session
Every mutation to a memory creates an immutable **memory version** (`memver_...`). Use the version endpoints to audit who changed what and when, to inspect or restore a prior snapshot, and to scrub sensitive content out of history with redact. -Versions belong to the store (not the individual memory) and survive even after the memory itself is deleted, so the audit trail stays complete. Versions are retained for 30 days; however, the recent versions are always kept regardless of age, so memories that change infrequently might retain history beyond 30 days. The live `memories.retrieve` call always returns the latest version; the version endpoints give you the retained history. +Versions belong to the store (not the individual memory) and are not deleted when the memory itself is deleted, so the audit trail also covers deleted memories, subject to the retention described below. Versions are retained for 30 days after they are written; however, the recent versions of a live memory are always kept regardless of age, so memories that change infrequently might retain history beyond 30 days. The live `memories.retrieve` call always returns the latest version; the version endpoints give you the retained history. -There is no dedicated restore endpoint; to roll back, retrieve the version you want and write its `content` back with `memories.update` (or `memories.create` if the parent memory has been deleted, because versions outlive their parent). +There is no dedicated restore endpoint; to roll back, retrieve the version you want and write its `content` back with `memories.update` (or `memories.create` if the parent memory has been deleted, provided the version you want is still retained). Past memory versions might be deleted after 30 days. To preserve memory history for longer, export versions through the API.
## Best practices for memory management -When a store reaches its 2,000-memory limit, writes to new memories fail: both direct `memories.create` calls and the agent's file writes to unmapped paths. Existing memories remain readable and editable. The following practices help you stay well under the limit and recover gracefully if you reach it. +When a store reaches its 10,000-memory limit, writes to new memories fail: both direct `memories.create` calls and the agent's file writes to unmapped paths. Existing memories remain readable and editable. The following practices help you stay well under the limit and recover gracefully if you reach it. -* **Use focused stores.** Rather than one large general-purpose store, use smaller purpose-built stores: one per user, one for shared domain knowledge, and one for project-specific context. Each store has its own 2,000-memory limit, so keeping stores scoped reduces the chance any single one fills up. +* **Use focused stores.** Rather than one large general-purpose store, use smaller purpose-built stores: one per user, one for shared domain knowledge, and one for project-specific context. Each store has its own 10,000-memory limit, so keeping stores scoped reduces the chance any single one fills up. * **Condense or prune before the store fills up.** Delete stale or redundant memories with `memories.delete`. You can also run a [dreaming session](https://platform.claude.com/docs/en/managed-agents/dreams), which consolidates fragmented content into a separate new output store rather than modifying the original. Switch your sessions over to that output store, then archive or delete the original.
models/fable-5/migration-guide Changed · +9 / -3 lines
1. **Thinking can no longer be disabled:** On Claude Opus 5, thinking is on by default and can be turned off with `thinking: {type: "disabled"}` at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or below. On `claude-fable-5` and `claude-mythos-5`, [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on, and `thinking: {type: "disabled"}` returns a 400 error at any effort level. Remove the `thinking: {type: "disabled"}` configuration and use lower effort levels to control token spend instead. + If your Claude Opus 5 requests disabled thinking, the response shape changes: a response can begin with one or more `thinking` blocks before the first `text` block, returned with an empty `thinking` field at the default `display: "omitted"` (the same default as Claude Opus 5). Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first content block as text, must select content blocks by their `type` field instead, and tool-use loops must pass `thinking` blocks back complete and unmodified with their tool results. The API rejects edited, reordered, or partially dropped thinking blocks with a 400 error (see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks)). Thinking tokens are billed as output tokens even when the thinking text is not returned. + 2. **Pricing:** Claude Fable 5 and Claude Mythos 5 are priced at $10 USD per million input tokens and $50 USD per million output tokens, compared with $5 USD and $25 USD for Claude Opus 5. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). 3. **Priority Tier:** [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5, so no existing traffic is affected. If your organization has a Priority Tier commitment, Claude Fable 5 supports it; Claude Mythos 5 does not.
* Update the model name from `claude-opus-5` to `claude-fable-5` (or `claude-mythos-5`). * Remove any `thinking: {type: "disabled"}` configuration; it returns a 400 error on `claude-fable-5` and `claude-mythos-5`. Use lower [effort](https://platform.claude.com/docs/en/build-with-claude/effort) levels to control token spend instead, and revisit `max_tokens` for workloads that ran with thinking disabled on Claude Opus 5. +* If those workloads read content by position, such as `content[0].text`, update them to select content blocks by `type`: `thinking` blocks now arrive before `text` blocks. Pass `thinking` blocks back complete and unmodified in tool-use loops; modified blocks return a 400 error. * If your organization has a zero data retention (ZDR) arrangement, confirm eligibility before migrating. See [Model-specific data retention requirements](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements). -* Re-baseline cost on your own workloads. Token counts are roughly unchanged; per-token pricing differs. +* Re-baseline cost on your own workloads. Token counts are roughly unchanged; per-token pricing differs, and workloads that ran with thinking disabled now produce thinking tokens, which are billed as output tokens. ## Migrating to Claude Mythos 5 and Claude Fable 5 from Claude Opus 4.8
1. **Adaptive thinking is always on:** [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is the only thinking mode on `claude-fable-5` and `claude-mythos-5`. The model determines when and how much to think on each request, and no `thinking` configuration is required. `thinking: {type: "disabled"}` returns an error. Use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control thinking depth. - The behavior change to check: on Claude Opus 4.8, requests without a `thinking` field run without thinking; on `claude-fable-5` and `claude-mythos-5`, those same requests run with adaptive thinking. `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.8. See [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). + The behavior change to check: on Claude Opus 4.8, requests without a `thinking` field run without thinking; on `claude-fable-5` and `claude-mythos-5`, those same requests run with adaptive thinking. `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.8. See [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). Responses can also begin with one or more `thinking` blocks before the first `text` block, so code that reads the reply by position (for example, `content[0].text`, or a stream handler that treats the first content block as text) must select content blocks by their `type` field instead. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so a workload that ran without thinking on Claude Opus 4.8 produces more output tokens per request, in addition to the per-token price difference. + If you run a tool-use loop, pass the `thinking` blocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whose `thinking` field is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). + Before (Claude Opus 4.8): <CodeGroup>
* If your organization has a zero data retention (ZDR) arrangement, confirm eligibility before migrating. `claude-fable-5` and `claude-mythos-5` require 30-day data retention; on the Claude API, requests to `claude-fable-5` that do not meet this requirement return a 400 `invalid_request_error`. Claude Opus 4.8 remains available under ZDR. See [Model-specific data retention requirements](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements). * Update the model name from `claude-opus-4-8` to `claude-fable-5` (or `claude-mythos-5`). * Remove any `thinking: {type: "disabled"}` configuration. Disabling thinking returns an error on `claude-fable-5` and `claude-mythos-5`, and requests without a `thinking` field run with adaptive thinking. +* Update response parsing that reads content by position, such as `content[0].text`: with adaptive thinking always on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead, and pass `thinking` blocks back complete and unmodified in tool-use loops; modified blocks return a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). * If you removed manual extended thinking and assistant prefills during earlier migrations, no action is needed: both remain unsupported on `claude-fable-5` and `claude-mythos-5`. * Verify any code that parses the `thinking` field treats it as display text only and passes thinking blocks back unchanged when continuing on the same model. `thinking.display` defaults to `"omitted"` on `claude-fable-5` and `claude-mythos-5`, the same as on Claude Opus 4.8; set `display: "summarized"` to receive readable summaries. See [Thinking output on Claude Fable 5 and Claude Mythos 5](https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-output-on-claude-fable-5-and-claude-mythos-5). * If you replay conversation history on another model, strip `thinking` and `redacted_thinking` blocks from prior assistant turns first. Thinking blocks from `claude-fable-5` and `claude-mythos-5` are tied to the model that produced them, and models other than Claude Fable 5 and Claude Mythos 5 silently ignore them. Stripping keeps cross-model requests minimal and uniform. The exception is redeeming a [fallback credit](https://platform.claude.com/docs/en/build-with-claude/fallback-credit), which requires the request body echoed under that feature's exact rules. * If you migrate to Claude Fable 5, handle `stop_reason: "refusal"` and read the `stop_details.category` field. To re-run refused requests on another model automatically, consider the opt-in `fallbacks` parameter (beta). See [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback). * Re-evaluate your `effort` setting. Start at `high` for most tasks, including workloads that ran at `xhigh` on Claude Opus 4.8. -* Re-baseline cost and latency on your own workloads. Token counts are roughly unchanged when migrating from `claude-opus-4-8`; per-token pricing differs. +* Re-baseline cost and latency on your own workloads. Token counts are roughly unchanged when migrating from `claude-opus-4-8`; per-token pricing differs, and thinking tokens are billed as output tokens, so workloads that ran without thinking produce more output tokens per request.
api/beta/files/download Changed · +0 / -1 lines
```bash curl https://api.anthropic.com/v1/files/$FILE_ID/content \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```
models/opus-5/migration-guide Changed · +32 / -12 lines
Claude Opus 5 is a step-change improvement over Claude Opus 4.8, strong on deep reasoning, agentic and long-horizon tasks, and test-time compute scaling. For behavioral differences and model-specific prompting patterns, see [Prompting Claude Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5). -Claude Opus 5 is a drop-in upgrade for Claude Opus 4.8 at the same pricing of $5 per million input tokens and $25 per million output tokens; see [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). There are two breaking changes for code already running on Claude Opus 4.8, covered under Breaking changes below. Claude Opus 5 supports the same set of features as Claude Opus 4.8, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) (the default, with no beta header), [128k max output tokens](https://platform.claude.com/docs/en/models/overview), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview), with two exceptions: [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) is not available on Claude Opus 5, and [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5. See each tool page for model availability. +Claude Opus 5 is a drop-in upgrade for Claude Opus 4.8 at the same pricing of $5 USD per million input tokens and $25 USD per million output tokens; see [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). There are two breaking changes for code already running on Claude Opus 4.8, covered under [Breaking changes](https://platform.claude.com/docs/en/models/opus-5/migration-guide#breaking-changes). Claude Opus 5 supports the same set of features as Claude Opus 4.8, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) (the default, with no beta header), [128k max output tokens](https://platform.claude.com/docs/en/models/overview), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview), with two exceptions: [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) is not available on Claude Opus 5, and [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5. See each tool page for model availability. ## Migrating to Claude Opus 5 from Claude Opus 4.8 <Note> - This section covers the delta from Claude Opus 4.8 only. If your code is on Claude Opus 4.7 or earlier, use the sections below instead: [Migrating to Claude Opus 5 from Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-47) or [Migrating to Claude Opus 5 from Claude Opus 4.6 and earlier Opus models](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-46). They include this delta plus the breaking changes from earlier models (sampling parameters rejected, manual extended thinking rejected, prefill removed, new tokenizer). + This section covers the delta from Claude Opus 4.8 only. If your code is on Claude Opus 4.7 or earlier, use these sections instead: [Migrating to Claude Opus 5 from Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-47) or [Migrating to Claude Opus 5 from Claude Opus 4.6 and earlier Opus models](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-46). They include this delta plus the breaking changes from earlier models (sampling parameters rejected, manual extended thinking rejected, prefill removed, new tokenizer). </Note> ### Update your model name
### Breaking changes -1. **Thinking on by default:** On Claude Opus 4.8, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.8. To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. +1. **Thinking on by default:** On Claude Opus 4.8, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.8. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so although per-token pricing is unchanged, a workload that ran without thinking on Claude Opus 4.8 can produce more output tokens per request on Claude Opus 5; see [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. + The response shape changes with it. With thinking on, a response can begin with one or more `thinking` blocks before the first `text` block, and because `thinking.display` defaults to `"omitted"` on Claude Opus 5, those blocks arrive with an empty `thinking` field alongside their `signature`. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first `content_block_start` event as text, breaks on these responses. Select content blocks by their `type` field instead: read `text` from the blocks whose `type` is `"text"`, and branch on the block type when handling stream events. To receive readable thinking summaries instead of an empty `thinking` field, set `display: "summarized"`; see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). + + If you run a tool-use loop, pass the `thinking` blocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whose `thinking` field is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). + 2. **Disabling thinking is capped at `high` effort:** You can still turn thinking off with `thinking: {type: "disabled"}`, but only at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or below. A request that combines `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error. Claude Opus 4.8 accepts this combination, so audit requests that disable thinking before you migrate. The check is enforced on each request: every request's effort and thinking configuration is validated independently, so a request that raises effort to `xhigh` or `max` while thinking is disabled is rejected even if earlier requests in the conversation were accepted.
* Update the model name from `claude-opus-4-8` to `claude-opus-5`. * Review workloads that ran without a `thinking` field: they run with thinking on Claude Opus 5. Revisit `max_tokens`, which remains a hard limit on total output (thinking plus response text), or pass `thinking: {type: "disabled"}` at effort `high` or below to preserve the old behavior. If you disable thinking, review [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for the output artifacts that can appear and their prompting mitigations. +* Update response parsing that reads content by position, such as `content[0].text` or a stream handler that assumes the first content block is text: with thinking on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead. +* If you run a tool-use loop, pass `thinking` blocks back complete and unmodified when you return tool results; modified blocks return a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). +* Verify any code that parses the `thinking` field treats it as display text only. `thinking.display` defaults to `"omitted"` on Claude Opus 5, the same as on Claude Opus 4.8, so thinking blocks arrive with an empty `thinking` field; set `display: "summarized"` to receive readable summaries. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). * Audit requests that disable thinking: `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error, enforced on each request. Re-enable thinking or lower the effort to `high` or below. * Re-evaluate your `effort` setting: run a fresh [effort](https://platform.claude.com/docs/en/build-with-claude/effort) sweep on your own evals rather than carrying over a setting tuned for an earlier model. `low` and `medium` effort are worth testing as cost and latency controls, and test `max` effort where maximum capability matters more than token spend. If you run at `xhigh` or `max` effort, raise `max_tokens` to at least 64k as a starting point. * Review prompts near the caching minimum: prompts of 512 tokens or more can now create cache entries, down from 1,024 tokens on Claude Opus 4.8.
* For agentic workloads, consider [task budgets](https://platform.claude.com/docs/en/build-with-claude/task-budgets) (beta) and mid-conversation tool changes (beta). * Re-tune length and verbosity prompts: default visible responses and written deliverables run longer on Claude Opus 5, and lowering effort reduces thinking volume without reliably shortening the visible response. Prompt explicitly for conciseness or a target length. See [Response length and verbosity](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#response-length-and-verbosity) and [Written deliverable length](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#written-deliverable-length). * Remove verification and self-check instructions carried over from prompts tuned for earlier models (they cause over-verification on Claude Opus 5), constrain task scope explicitly for narrow tasks, and in multi-agent frameworks steer or cap subagent delegation. See [Task scope and over-verification](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#task-scope-and-over-verification) and [Controlling subagent spawning](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#controlling-subagent-spawning). -* Re-baseline cost and latency on your own workloads. +* Re-baseline cost and latency on your own workloads. Per-token pricing is unchanged from Claude Opus 4.8, but thinking tokens are billed as output tokens, so workloads that ran without thinking can produce more output tokens per request. ## Migrating to Claude Opus 5 from Claude Opus 4.7 -Claude Opus 5 should have strong out-of-the-box performance on existing Claude Opus 4.7 prompts and evals, at the same pricing of $5 per million input tokens and $25 per million output tokens. It supports the same set of features as Claude Opus 4.7, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows), [128k max output tokens](https://platform.claude.com/docs/en/models/overview), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview), with two exceptions: [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) is not available on Claude Opus 5, and [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5. It also adds [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) and publicly documents [refusal stop details](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). On the Claude API and Google Cloud, Claude Opus 5 also supports [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) as the stable `computer_toolset_20260801` toolset and the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) for tasks inside webpages, neither of which Claude Opus 4.7 supports; existing integrations on the earlier `computer_20251124` version continue to work unchanged on both models. To upgrade an existing integration, see [Migrate from `computer_20251124`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#migrate-from-computer-20251124). +Claude Opus 5 should have strong out-of-the-box performance on existing Claude Opus 4.7 prompts and evals, at the same pricing of $5 USD per million input tokens and $25 USD per million output tokens. It supports the same set of features as Claude Opus 4.7, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows), [128k max output tokens](https://platform.claude.com/docs/en/models/overview), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview), with two exceptions: [web fetch](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool) is not available on Claude Opus 5, and [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5. It also adds [mid-conversation system messages](https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages) and publicly documents [refusal stop details](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback#refusal-response). On the Claude API and Google Cloud, Claude Opus 5 also supports [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) as the stable `computer_toolset_20260801` toolset and the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) for tasks inside webpages, neither of which Claude Opus 4.7 supports; existing integrations on the earlier `computer_20251124` version continue to work unchanged on both models. To upgrade an existing integration, see [Migrate from `computer_20251124`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#migrate-from-computer-20251124). <Note> If your code is on Claude Opus 4.6 or earlier, use [Migrating to Claude Opus 5 from Claude Opus 4.6 and earlier Opus models](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-46) instead. That section includes breaking changes (sampling parameters rejected, manual extended thinking rejected, new tokenizer) that the upgrade from Claude Opus 4.7 alone does not cover.
### Breaking changes -1. **Thinking on by default:** On Claude Opus 4.7, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.7. To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. +1. **Thinking on by default:** On Claude Opus 4.7, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking on Claude Opus 4.7. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so although per-token pricing is unchanged, a workload that ran without thinking on Claude Opus 4.7 can produce more output tokens per request on Claude Opus 5; see [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. + The response shape changes with it. With thinking on, a response can begin with one or more `thinking` blocks before the first `text` block, and because `thinking.display` defaults to `"omitted"` on Claude Opus 5, those blocks arrive with an empty `thinking` field alongside their `signature`. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first `content_block_start` event as text, breaks on these responses. Select content blocks by their `type` field instead: read `text` from the blocks whose `type` is `"text"`, and branch on the block type when handling stream events. To receive readable thinking summaries instead of an empty `thinking` field, set `display: "summarized"`; see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). + + If you run a tool-use loop, pass the `thinking` blocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whose `thinking` field is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). + 2. **Disabling thinking is capped at `high` effort:** You can turn thinking off with `thinking: {type: "disabled"}`, but only at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or below. A request that combines `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error. Claude Opus 4.7 accepts this combination, so audit requests that disable thinking before you migrate. The check is enforced on each request: every request's effort and thinking configuration is validated independently, so a request that raises effort to `xhigh` or `max` while thinking is disabled is rejected even if earlier requests in the conversation were accepted.
* Update model name from `claude-opus-4-7` to `claude-opus-5` (or update aliases). * Review workloads that ran without a `thinking` field: they run with thinking on Claude Opus 5. Revisit `max_tokens`, which remains a hard limit on total output (thinking plus response text), or pass `thinking: {type: "disabled"}` at effort `high` or below to preserve the old behavior. If you disable thinking, review [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for the output artifacts that can appear and their prompting mitigations. +* Update response parsing that reads content by position, such as `content[0].text` or a stream handler that assumes the first content block is text: with thinking on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead. +* If you run a tool-use loop, pass `thinking` blocks back complete and unmodified when you return tool results; modified blocks return a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). +* Verify any code that parses the `thinking` field treats it as display text only. `thinking.display` defaults to `"omitted"` on Claude Opus 5, the same as on Claude Opus 4.7, so thinking blocks arrive with an empty `thinking` field; set `display: "summarized"` to receive readable summaries. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). * Audit requests that disable thinking: `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error, enforced on each request. Re-enable thinking or lower the effort to `high` or below. * If you removed sampling parameters during the Opus 4.7 migration, no action is needed. If you re-added them with a 400-retry path, remove that retry path. * Re-evaluate your `effort` setting: run a fresh [effort](https://platform.claude.com/docs/en/build-with-claude/effort) sweep on your own evals rather than carrying over a setting tuned for Claude Opus 4.7. Test `low` and `medium` effort as cost and latency controls, and `max` effort where maximum capability matters more than token spend. If you run at `xhigh` or `max` effort, raise `max_tokens` to at least 64k as a starting point.
* If you used fast mode on Claude Opus 4.7, no request changes are needed beyond the model ID: `speed: "fast"` and the `fast-mode-2026-02-01` beta header work unchanged on Claude Opus 5. * For agentic workloads, consider [task budgets](https://platform.claude.com/docs/en/build-with-claude/task-budgets) (beta) and mid-conversation tool changes (beta). * Re-tune length and verbosity prompts, and remove verification and self-check instructions carried over from prompts tuned for earlier models. -* Re-baseline cost and latency at your chosen effort level. +* Re-baseline cost and latency at your chosen effort level. Per-token pricing is unchanged from Claude Opus 4.7, but thinking tokens are billed as output tokens, so workloads that ran without thinking can produce more output tokens per request. ## Migrating to Claude Opus 5 from Claude Opus 4.6 and earlier Opus models -Claude Opus 5 should have strong out-of-the-box performance on existing Claude Opus 4.6 prompts and evals at the same pricing, but there are a handful of behavioral and API changes worth knowing about as you migrate. Most of these changes took effect in Claude Opus 4.7; two more, thinking on by default and an effort cap on disabling thinking, take effect on Claude Opus 5. All of them are covered below, so this section is complete for code coming straight from Claude Opus 4.6. Claude Opus 5 supports the same set of features as Claude Opus 4.6, including: +Claude Opus 5 should have strong out-of-the-box performance on existing Claude Opus 4.6 prompts and evals at the same pricing, but there are a handful of behavioral and API changes worth knowing about as you migrate. Most of these changes took effect in Claude Opus 4.7; two more, thinking on by default and an effort cap on disabling thinking, take effect on Claude Opus 5. All of them are covered in this section, so it is complete for code coming straight from Claude Opus 4.6. Claude Opus 5 supports the same set of features as Claude Opus 4.6, including: * [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) at standard API pricing with no long-context premium * [128k max output tokens](https://platform.claude.com/docs/en/models/overview)
Adaptive thinking is steerable through prompting and the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort); see [Choosing an effort level](https://platform.claude.com/docs/en/models/opus-5/migration-guide#choosing-an-effort-level). -2. **Thinking on by default:** On Claude Opus 4.6 and Claude Opus 4.7, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking. To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. +2. **Thinking on by default:** On Claude Opus 4.6 and Claude Opus 4.7, requests without a `thinking` field run without thinking; on Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). `max_tokens` remains a hard limit on total output, thinking plus response text, so revisit it for workloads that ran without thinking. Thinking tokens are billed as output tokens even when the thinking text is not returned to you, so although per-token pricing is unchanged, a workload that ran without thinking can produce more output tokens per request on Claude Opus 5; see [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). To preserve the old behavior, pass `thinking: {type: "disabled"}`, subject to the effort cap in the next item; note that with thinking disabled the model can occasionally emit tool calls as plain text or include internal XML tags in its visible output, so prefer lower effort levels with thinking enabled where you can, and see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for mitigations where you can't. + The response shape changes with it. With thinking on, a response can begin with one or more `thinking` blocks before the first `text` block, and because thinking content is omitted by default on Claude Opus 5 (item 5 in this list), those blocks arrive with an empty `thinking` field alongside their `signature`. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first `content_block_start` event as text, breaks on these responses. Select content blocks by their `type` field instead: read `text` from the blocks whose `type` is `"text"`, and branch on the block type when handling stream events. + + If you run a tool-use loop, pass the `thinking` blocks from each assistant response back to the API complete and unmodified when you return tool results, including blocks whose `thinking` field is empty. Echo the assistant message as received rather than filtering its content blocks by type or rebuilding it: the API rejects edited, reordered, or partially dropped thinking blocks with a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). + 3. **Disabling thinking is capped at `high` effort:** You can turn thinking off with `thinking: {type: "disabled"}`, but only at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or below. A request that combines `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error on Claude Opus 5, enforced on each request. Audit requests that disable thinking before you migrate: re-enable thinking or lower the effort to `high` or below. 4. **Sampling parameters removed:** Setting `temperature`, `top_p`, or `top_k` to any non-default value on Claude Opus 4.7 or later models, including Claude Opus 5, returns a 400 error. The Python SDK (v1.0 and later) does not define them, and passing them raises a `TypeError`. The safest migration path is to omit these parameters entirely from request payloads. Prompting is the recommended way to guide model behavior on Claude Opus 5. If you were using `temperature = 0` for determinism, note that it never guaranteed identical outputs on prior models.
### Behavior changes -Claude Opus 4.7 introduced several behavioral differences from Claude Opus 4.6 that are not API breaking changes but may require prompt updates or scaffolding removal. They carry forward to Claude Opus 5, with the adjustments noted below. +Claude Opus 4.7 introduced several behavioral differences from Claude Opus 4.6 that are not API breaking changes but may require prompt updates or scaffolding removal. They carry forward to Claude Opus 5, with the adjustments noted in this list. 1. **Response length varies by use case:** Claude Opus 4.7 calibrates response length to how complex it judges the task to be, rather than defaulting to a fixed verbosity. This usually means shorter answers on simple lookups and much longer ones on open-ended analysis.
* Remove `temperature`, `top_p`, and `top_k` from request payloads. * Replace `thinking: {type: "enabled", budget_tokens: N}` with `thinking: {type: "adaptive"}` plus the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort), or remove the `thinking` field entirely; adaptive thinking is on by default on Claude Opus 5. * Review workloads that ran without a `thinking` field: they run with thinking on Claude Opus 5. Revisit `max_tokens`, which remains a hard limit on total output (thinking plus response text), or pass `thinking: {type: "disabled"}` at effort `high` or below to preserve the old behavior. +* Update response parsing that reads content by position, such as `content[0].text` or a stream handler that assumes the first content block is text: with thinking on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead. +* If you run a tool-use loop, pass `thinking` blocks back complete and unmodified when you return tool results; modified blocks return a 400 error. See [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). * Audit requests that disable thinking: `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error, enforced on each request. Re-enable thinking or lower the effort to `high` or below. * Remove any assistant-message prefills. * If your UI displays thinking content, explicitly opt in to thinking summarization. -* Re-benchmark end-to-end cost and latency under the updated tokenization. +* Re-benchmark end-to-end cost and latency under the updated tokenization; thinking tokens are billed as output tokens, so workloads that ran without thinking can also produce more output tokens per request. * Re-tune `max_tokens` to account for the updated tokenization. * Re-test any client-side token-count estimations. * If your application sends images, re-budget for [high-resolution image support](https://platform.claude.com/docs/en/build-with-claude/vision#high-resolution-image-support-on-claude-opus-4-7) (up to approximately 3x more image tokens per full-resolution image). Downsample before sending if you do not need the additional fidelity.
### What changed -1. **Pricing:** Claude Opus 5 is priced at $5 per million input tokens and $25 per million output tokens. Claude Sonnet 5 is priced at $2/$10 per million input/output tokens. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing) for complete pricing. +1. **Pricing:** Claude Opus 5 is priced at $5 USD per million input tokens and $25 USD per million output tokens. Claude Sonnet 5 is priced at $2/$10 USD per million input/output tokens. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing) for complete pricing. 2. **Disabling thinking is capped at `high` effort:** On Claude Sonnet 5, `thinking: {type: "disabled"}` is accepted at any effort level. On Claude Opus 5, it is accepted only at an [effort](https://platform.claude.com/docs/en/build-with-claude/effort) level of `high` or below; a request that combines `thinking: {type: "disabled"}` with effort `xhigh` or `max` returns a 400 error, enforced on each request. Audit requests that disable thinking before you migrate.
models/opus-5/whats-new-opus-5 Changed · +14 / -12 lines
description: Overview of new features and behavior changes in Claude Opus 5. --- -Claude Opus 5 is a step-change improvement over Claude Opus 4.8, with the largest gains in deep reasoning, agentic and long-horizon tasks, and test-time compute scaling. This page summarizes everything new in Claude Opus 5, including thinking on by default, mid-conversation tool changes, and a breaking change to when thinking can be disabled. +Claude Opus 5 is a step-change improvement over Claude Opus 4.8, with the largest gains in deep reasoning, agentic and long-horizon tasks, and test-time compute scaling. This page summarizes everything new in Claude Opus 5, including mid-conversation tool changes and two breaking changes for code running on Claude Opus 4.8: thinking is on by default, and thinking can be disabled only at effort `high` or below. ## New model
| ------------- | --------------- | ---------------------------------------------- | | Claude Opus 5 | `claude-opus-5` | For complex agentic coding and enterprise work | -Claude Opus 5 has a [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) (1M tokens is both the default and the maximum; there is no smaller context variant), 128k max output tokens, and [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) on by default. +Claude Opus 5 has a [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) (1M tokens is both the default and the maximum; there is no smaller context variant), 128k max output tokens, and [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) on by default. [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not supported on Claude Opus 5. For complete pricing and specs, see the [models overview](https://platform.claude.com/docs/en/models/overview).
### Thinking on by default -On Claude Opus 4.8, requests run without thinking unless you set `thinking: {"type": "adaptive"}`. On Claude Opus 5, the same requests run with [thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) on: the model decides when and how much to think on each turn, and the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) is the control for thinking depth. The wire value is unchanged; `thinking: {"type": "adaptive"}` remains valid and equivalent to the default. +On Claude Opus 4.8, requests run without thinking unless you set `thinking: {"type": "adaptive"}`. On Claude Opus 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) on by default: the model decides when and how much to think on each turn, and the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) is the control for thinking depth. The wire value is unchanged; `thinking: {"type": "adaptive"}` remains valid and equivalent to the default. -Because `max_tokens` is a hard limit on total output (thinking plus response text), revisit it for workloads that ran without thinking on Claude Opus 4.8. +This is a breaking change for code that ran without thinking on Claude Opus 4.8. A response can begin with one or more `thinking` blocks before the first `text` block, returned with an empty `thinking` field at the default `display: "omitted"`, so code that reads `content[0].text` or treats the first streamed content block as text must select content blocks by their `type` field instead. Tool-use loops must pass `thinking` blocks back complete and unmodified with their tool results; see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks). -The API keeps the option to disable thinking, subject to the effort restriction below. +Thinking tokens are billed as output tokens and count toward `max_tokens`, a hard limit on total output (thinking plus response text), so revisit `max_tokens` and re-baseline cost for workloads that ran without thinking on Claude Opus 4.8. +The API keeps the option to disable thinking, subject to the [effort restriction](https://platform.claude.com/docs/en/models/opus-5/whats-new-opus-5#disabling-thinking-requires-effort-high-or-below) on disabling it. + ### Effort matters more Claude Opus 5 converts additional [effort](https://platform.claude.com/docs/en/build-with-claude/effort) into better results more reliably than any earlier Opus model, so the effort level you choose carries more weight. The full ladder is available: `low`, `medium`, `high`, `xhigh`, and `max`, with `max` as the top tier for the deepest possible reasoning. Start at the default, `high`, and adjust in either direction based on your evals: step down where quality holds to save tokens and latency, or step up for the most demanding work. When running at `xhigh` or `max` effort, set a large `max_tokens` so the model has room to think and act across subagents and tool calls.
### Disabling thinking requires effort `high` or below -On Claude Opus 5, `thinking: {"type": "disabled"}` is accepted only when the effort level is `high` or below. Setting `thinking: {"type": "disabled"}` with effort `xhigh` or `max` returns a 400 error. This rule is enforced on every request to Claude Opus 5 and later models. It is a breaking change from Claude Opus 4.8, where disabling thinking was independent of the effort level. If you disable thinking at high effort levels today, either keep thinking disabled and set effort to `high` or below, or keep the effort level and remove the `thinking` field. +On Claude Opus 5, `thinking: {"type": "disabled"}` is accepted only when the effort level is `high` or below. Setting `thinking: {"type": "disabled"}` with effort `xhigh` or `max` returns a 400 error. This rule is enforced on every request to Claude Opus 5 and later models. It is a breaking change from Claude Opus 4.8, where disabling thinking was independent of the effort level. If your Claude Opus 4.8 requests disable thinking at effort `xhigh` or `max`, either keep thinking disabled and set effort to `high` or below, or keep the effort level and remove the `thinking` field. With thinking disabled, Claude Opus 5 can occasionally write a tool call into its text output instead of emitting a `tool_use` block, or include internal XML tags in its visible response. Where possible, keep thinking enabled and control token cost with lower effort levels; for integrations that must keep thinking disabled, see [Running with thinking disabled](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5#running-with-thinking-disabled) for prompting mitigations. ### Model behavior differences -Beyond the API changes above, Claude Opus 5 behaves differently from Claude Opus 4.8 in ways you may notice without changing any code. Default user-facing responses and written deliverables run longer. In agentic sessions, the model narrates its progress to the user more often. In multi-agent frameworks, it delegates to subagents more readily. It also verifies its own work without being told to, so remove verification instructions carried over from earlier models ("include a final verification step," "use a subagent to verify"); they cause over-verification on Claude Opus 5. For prompting patterns that tune each of these behaviors, see [Prompting Claude Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5). +Beyond these API changes, Claude Opus 5 behaves differently from Claude Opus 4.8 in ways you may notice without changing any code. Default user-facing responses and written deliverables run longer. In agentic sessions, the model narrates its progress to the user more often. In multi-agent frameworks, it delegates to subagents more readily. It also verifies its own work without being told to, so remove verification instructions carried over from earlier models ("include a final verification step," "use a subagent to verify"); they cause over-verification on Claude Opus 5. For prompting patterns that tune each of these behaviors, see [Prompting Claude Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5). ## Capability improvements -Compared with Claude Opus 4.8, Claude Opus 5 is a step-change improvement rather than an incremental one, and it delivers frontier intelligence at half the cost of Claude Fable 5. The largest gains are in: +Compared with Claude Opus 4.8, Claude Opus 5 is a step-change improvement rather than an incremental one, and it delivers frontier intelligence at half the cost of [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/introducing-claude-fable-5-and-claude-mythos-5). The largest gains are in: * **Deep reasoning**, sustaining multistep analysis across long problem chains. * **Agentic coding and long-horizon tasks**, staying on task across extended tool-use loops and completing multi-file features, larger refactors, and end-to-end feature work without leaving stubs or placeholders.
## Pricing -Claude Opus 5 is priced at $5 USD per million input tokens and $25 USD per million output tokens, unchanged from Claude Opus 4.8. +Claude Opus 5 is priced at $5 USD per million input tokens and $25 USD per million output tokens, unchanged from Claude Opus 4.8. Because thinking is on by default and thinking tokens are billed as output tokens, a workload that ran without thinking on Claude Opus 4.8 can produce more output tokens per request at the same per-token rates; see [Cost control](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost#cost-control). See [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for complete pricing, including batch processing, prompt caching, and fast mode rates.
``` </CodeGroup> -Then review the two [behavior changes](https://platform.claude.com/docs/en/models/opus-5/whats-new-opus-5#behavior-changes): thinking is on by default, and disabling thinking with effort `xhigh` or `max` returns a 400 error. See the [migration guide](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-4-8-to-claude-opus-5) for step-by-step instructions. +Then review the two breaking changes under [Behavior changes](https://platform.claude.com/docs/en/models/opus-5/whats-new-opus-5#behavior-changes): thinking is on by default (responses can begin with `thinking` blocks, so select content blocks by `type`), and disabling thinking with effort `xhigh` or `max` returns a 400 error. See the [migration guide](https://platform.claude.com/docs/en/models/opus-5/migration-guide#migrating-from-claude-opus-4-8-to-claude-opus-5) for step-by-step instructions and the full checklist. ## Next steps
models/sonnet-5/migration-guide Changed · +11 / -3 lines
Claude Sonnet 5 offers the best combination of speed and intelligence in the Claude model family. It builds on Claude Sonnet 4.6. -Claude Sonnet 5 is a drop-in upgrade for Claude Sonnet 4.6, priced at $2/$10 USD per million input/output tokens; see [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for details. There are two breaking API changes for code already running on Claude Sonnet 4.6: manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) and sampling parameters (`temperature`, `top_p`, `top_k`) set to non-default values are no longer accepted and return a 400 error. Use [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) with the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) instead. Claude Sonnet 5 supports the same set of features as Claude Sonnet 4.6, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and the full set of server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview). On the Claude API and Google Cloud, Claude Sonnet 5 also supports [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) as the stable `computer_toolset_20260801` toolset and the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) for tasks inside webpages, neither of which Claude Sonnet 4.6 supports; existing integrations on the earlier `computer_20251124` version continue to work unchanged on both models. To upgrade an existing integration, see [Migrate from `computer_20251124`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#migrate-from-computer-20251124). [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not available on Claude Sonnet 5. Claude Sonnet 5 also uses a new tokenizer. +Claude Sonnet 5 is a drop-in upgrade for Claude Sonnet 4.6, priced at $2/$10 USD per million input/output tokens; see [Pricing](https://platform.claude.com/docs/en/about-claude/pricing) for details. There are two breaking API changes for code already running on Claude Sonnet 4.6. First, [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is on by default and manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) returns a 400 error, so requests that ran without thinking can now return `thinking` blocks before the first `text` block and code that reads content by position must select content blocks by `type`. Second, sampling parameters (`temperature`, `top_p`, `top_k`) set to non-default values return a 400 error. Use adaptive thinking with the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control thinking depth. Claude Sonnet 5 supports the same set of features as Claude Sonnet 4.6, including the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows), [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [batch processing](https://platform.claude.com/docs/en/build-with-claude/batch-processing), the [Files API](https://platform.claude.com/docs/en/build-with-claude/files), [PDF support](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [vision](https://platform.claude.com/docs/en/build-with-claude/vision), and the full set of server-side and client-side [tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview). On the Claude API and Google Cloud, Claude Sonnet 5 also supports [computer use](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) as the stable `computer_toolset_20260801` toolset and the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) for tasks inside webpages, neither of which Claude Sonnet 4.6 supports; existing integrations on the earlier `computer_20251124` version continue to work unchanged on both models. To upgrade an existing integration, see [Migrate from `computer_20251124`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#migrate-from-computer-20251124). [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models) is not available on Claude Sonnet 5. Claude Sonnet 5 also uses a new tokenizer. ## Migrating to Claude Sonnet 5 from Claude Sonnet 4.6
Items 4 and 5 in the following list are breaking changes. `max_tokens` remains a hard limit on total output (thinking plus response text), so revisit it for workloads that ran without thinking on Claude Sonnet 4.6. -1. **New tokenizer:** Claude Sonnet 5 uses a new tokenizer. The same input text produces approximately 30% more tokens than on Claude Sonnet 4.6. The exact increase depends on the content. Requests, responses, and streaming events keep the same shape, and no code changes are required, but anything you measure or budget in tokens shifts: `usage` fields and [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) results for the same text are higher, the 1M token context window holds less text, and a `max_tokens` limit tuned for Claude Sonnet 4.6 may truncate equivalent output. Per-token pricing is lower ($2/$10 versus Claude Sonnet 4.6's $3/$15 per million input/output tokens), but the cost of an equivalent request does not drop in direct proportion. Re-run token counting against Claude Sonnet 5 rather than reusing counts measured against earlier models. +1. **New tokenizer:** Claude Sonnet 5 uses a new tokenizer. The same input text produces approximately 30% more tokens than on Claude Sonnet 4.6. The exact increase depends on the content. Requests, responses, and streaming events keep the same shape, and no code changes are required, but anything you measure or budget in tokens shifts: `usage` fields and [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) results for the same text are higher, the 1M token context window holds less text, and a `max_tokens` limit tuned for Claude Sonnet 4.6 may truncate equivalent output. Per-token pricing is lower ($2/$10 USD versus Claude Sonnet 4.6's $3/$15 USD per million input/output tokens), but the cost of an equivalent request does not drop in direct proportion. Re-run token counting against Claude Sonnet 5 rather than reusing counts measured against earlier models. 2. **128k max output tokens (unchanged):** Claude Sonnet 5 supports up to 128k output tokens, the same as Claude Sonnet 4.6. Existing `max_tokens` values remain valid. Account for the new tokenizer when sizing them.
4. **Adaptive thinking on by default:** On Claude Sonnet 4.6, requests without a `thinking` field run without thinking; on Claude Sonnet 5, the same requests run with [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking). To turn thinking off, pass `thinking: {type: "disabled"}`. Manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) is not supported and returns a 400 error. Use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) (default `high`) to control thinking depth. + With thinking on, a response can begin with one or more `thinking` blocks before the first `text` block, returned with an empty `thinking` field at the default `display: "omitted"`. Code that reads the reply by position, such as `content[0].text` or a stream handler that treats the first content block as text, must select content blocks by their `type` field instead, and tool-use loops must pass `thinking` blocks back complete and unmodified with their tool results (see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks)). Thinking tokens are billed as output tokens even when the thinking text is not returned. If you used thinking on Claude Sonnet 4.6 and display the returned thinking text, note that `thinking.display` defaulted to `"summarized"` there and defaults to `"omitted"` on Claude Sonnet 5; set `display: "summarized"`, as the following example does, to keep receiving readable summaries (see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display)). + <Tabs> <Tab title="Claude Sonnet 5"> <Note>
* Re-run [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) against Claude Sonnet 5. The new tokenizer produces approximately 30% more tokens for the same text, which can change per-request cost even though per-token pricing is lower. The exact increase depends on the content and workload shape. * Revisit `max_tokens` limits sized close to your expected output length, and raise them up to the 128k maximum (unchanged from Claude Sonnet 4.6) where useful. * Remove `thinking: {type: "enabled", budget_tokens: N}` configuration (returns a 400 error). Adaptive thinking is on by default; pass `{type: "disabled"}` to turn it off, or use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control depth. +* Update response parsing that reads content by position, such as `content[0].text`: with thinking on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead, and pass `thinking` blocks back unmodified in tool-use loops; modified blocks return a 400 error. +* Verify any code that parses the `thinking` field treats it as display text only. `thinking.display` defaults to `"omitted"` on Claude Sonnet 5 (it defaulted to `"summarized"` on Claude Sonnet 4.6), so thinking blocks arrive with an empty `thinking` field; set `display: "summarized"` to receive readable summaries. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). * Remove `temperature`, `top_p`, and `top_k` parameters set to non-default values (they return a 400 error on Claude Sonnet 5). * Add handling for `stop_reason: "refusal"` if your workload may touch cybersecurity topics. * Re-baseline cost on your typical workload before production deployment.
1. **Thinking configuration:** Claude Haiku 4.5 supports manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) and rejects `thinking: {type: "adaptive"}`. On Claude Sonnet 5, the support is reversed: adaptive thinking is on by default, and manual extended thinking returns a 400 error. Remove `thinking: {type: "enabled", budget_tokens: N}` configurations and rely on the default, or pass `thinking: {type: "disabled"}` to turn thinking off. `budget_tokens` has no direct replacement; use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) to control thinking depth. Effort is not available on Claude Haiku 4.5 and defaults to `high` on Claude Sonnet 5. + The response shape changes for both kinds of Claude Haiku 4.5 request. Requests that ran without extended thinking can now return one or more `thinking` blocks before the first `text` block, so code that reads the reply by position, such as `content[0].text`, must select content blocks by their `type` field instead, and tool-use loops must pass `thinking` blocks back complete and unmodified with their tool results (see [Preserving thinking blocks](https://platform.claude.com/docs/en/build-with-claude/thinking#preserving-thinking-blocks)). Requests that used extended thinking keep receiving `thinking` blocks, but `thinking.display` defaults to `"omitted"` on Claude Sonnet 5 rather than `"summarized"`, so those blocks arrive with an empty `thinking` field; set `display: "summarized"` to keep receiving readable summaries (see [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display)). Thinking tokens are billed as output tokens even when the thinking text is not returned. + 2. **Sampling parameters removed:** `temperature` and `top_p` work on Claude Haiku 4.5 (one at a time, not both). On Claude Sonnet 5, setting `temperature`, `top_p`, or `top_k` to a non-default value returns a 400 error. Remove these parameters and use prompting to guide the model's behavior. 3. **Assistant prefill removed:** Prefilling the assistant message works on Claude Haiku 4.5 but returns a 400 error on Claude Sonnet 5. Use [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs), system prompt instructions, or `output_config.format` instead.
4. **Larger context window and output:** Claude Sonnet 5 serves a 1M token context window by default, up from 200k tokens on Claude Haiku 4.5, and supports up to 128k output tokens, up from 64k. Claude Sonnet 5 also uses a different tokenizer, so re-run [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) rather than reusing counts measured against Claude Haiku 4.5. -5. **Pricing:** Claude Haiku 4.5 is priced at $1/$5 per million input/output tokens. Claude Sonnet 5 is priced at $2/$10 per million input/output tokens. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). +5. **Pricing:** Claude Haiku 4.5 is priced at $1/$5 USD per million input/output tokens. Claude Sonnet 5 is priced at $2/$10 USD per million input/output tokens. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing). 6. **Cybersecurity safeguards:** Claude Sonnet 5 has real-time cybersecurity safeguards. Requests that involve prohibited or high-risk cybersecurity topics may be refused, returned as a successful HTTP 200 response with `stop_reason: "refusal"`. See [Real-time cyber safeguards on Claude Opus and Sonnet](https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet) for what the safeguards block and how legitimate security work can apply to the Cyber Verification Program.
* Update the model name from `claude-haiku-4-5-20251001` (or the `claude-haiku-4-5` alias) to `claude-sonnet-5`. * Remove `thinking: {type: "enabled", budget_tokens: N}` configuration (returns a 400 error). Adaptive thinking is on by default; pass `thinking: {type: "disabled"}` to preserve no-thinking behavior, and revisit `max_tokens` for workloads that ran without thinking. +* Update response parsing that reads content by position, such as `content[0].text`: with thinking on, `thinking` blocks arrive before `text` blocks. Select content blocks by `type` instead, and pass `thinking` blocks back unmodified in tool-use loops; modified blocks return a 400 error. +* If your UI displays thinking content, set `display: "summarized"`. `thinking.display` defaults to `"omitted"` on Claude Sonnet 5, so thinking blocks otherwise arrive with an empty `thinking` field. See [Controlling thinking display](https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display). * Use the [effort parameter](https://platform.claude.com/docs/en/build-with-claude/effort) (default `high`) to control thinking depth and token spend; it is not available on Claude Haiku 4.5, so no existing setting carries over. * Remove `temperature` and `top_p` settings (non-default values return a 400 error on Claude Sonnet 5). * Remove any assistant-message prefills (they return a 400 error on Claude Sonnet 5).
release-notes/overview Changed · +5 / -3 lines
### August 27, 2026 -* You can now create **personal keys** and **service account keys** in the Claude Console. They act as you or as a [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts), with the same permissions, and stop working when the linked account is removed from an organization. This lets organization admins more easily track usage for each account, and ensure key usage is legitimate. These API keys can be scoped to a specific workspace or [work on admin endpoints and across any workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) the account has access to. Workspace API keys remain supported as a legacy option. See [API keys](https://platform.claude.com/docs/en/manage-claude/authentication#api-keys) for more information. +* In Python SDK 1.2.0, TypeScript SDK 0.122.0, Go SDK 1.68.0, Java SDK 2.59.0, Ruby SDK 1.67.0, and C# SDK 12.44.0, `client.beta.files` and `client.beta.skills` no longer send the `files-api-2025-04-14` and `skills-2025-10-02` beta headers and return the same shapes as `client.files` and `client.skills`. With this change, `client.beta.skills.delete()` deletes a Skill together with all of its versions, and the beta Messages type `BetaSkill` (the container Skill reference) is renamed `BetaContainerSkill`. Requests that still send the beta headers keep receiving the beta shapes. See [Migrate from `files-api-2025-04-14`](https://platform.claude.com/docs/en/build-with-claude/files#migrate-from-files-api-2025-04-14) and [Migrate from `skills-2025-10-02`](https://platform.claude.com/docs/en/build-with-claude/skills-guide#migrate-from-skills-2025-10-02). +- You can now create **personal keys** and **service account keys** in the Claude Console. They act as you or as a [service account](https://platform.claude.com/docs/en/manage-claude/workload-identity-federation#service-accounts), with the same permissions, and stop working when the linked account is removed from an organization. This lets organization admins more easily track usage for each account, and ensure key usage is legitimate. These API keys can be scoped to a specific workspace or [work on admin endpoints and across any workspace](https://platform.claude.com/docs/en/manage-claude/authentication#select-a-workspace) the account has access to. Workspace API keys remain supported as a legacy option. See [API keys](https://platform.claude.com/docs/en/manage-claude/authentication#api-keys) for more information. + ### August 26, 2026 * The [Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api) session endpoints are out of beta for Cowork and Claude Code sessions. See [Retrieve session transcripts](https://platform.claude.com/docs/en/manage-claude/compliance-sessions).
* The [computer use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool) is out of beta on the Claude API as the `computer_toolset_20260801` toolset: no beta header, batch actions (several actions in one turn), `zoom` enabled by default, and per-member configuration through `configs`. Earlier beta versions remain available. Upgrading an existing integration changes the request shape and tool handling; see [Migrate from `computer_20251124`](https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool#migrate-from-computer-20251124). * We've launched the [browser use tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/browser-use-tool) (`browser_toolset_20260801`), a client toolset for driving a browser that your application hosts. It works inside a browser viewport rather than a whole desktop, reading the page itself (its accessibility tree, elements, forms, and tabs) and adding element references, form input, tab management, download reporting, and opt-in file upload on top of screenshot-and-click control. * Both toolsets are available for Claude Fable 5, Claude Mythos 5, Claude Opus 5, Claude Sonnet 5, and Claude Opus 4.8 on the Claude API. -* The [Files API](https://platform.claude.com/docs/en/build-with-claude/files) is out of beta on the Claude API. Requests to the `/v1/files` endpoints, and Messages API requests that reference an uploaded file, no longer require the `files-api-2025-04-14` beta header. Requests sent without the header use the current response format: [file expiration](https://platform.claude.com/docs/en/build-with-claude/files#file-expiration) (set `expires_in_seconds` when you upload a file; file objects report `expires_at`), and `page` and `next_page` [pagination](https://platform.claude.com/docs/en/api/overview#pagination) plus an `ids[]` filter when you [list files](https://platform.claude.com/docs/en/build-with-claude/files#list-files). `/v1/files` requests that still send the beta header keep working and return the previous response format. -* [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) and the Skills API (`/v1/skills`) are out of beta on the Claude API. Requests no longer require the `skills-2025-10-02` beta header, including Messages API requests that load Skills through the `container` parameter. Requests that still send the header continue to work unchanged. See [Using Agent Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide). +* The [Files API](https://platform.claude.com/docs/en/build-with-claude/files) is out of beta on the Claude API. Requests to the `/v1/files` endpoints, and Messages API requests that reference an uploaded file, no longer require the `files-api-2025-04-14` beta header. Requests sent without the header use the current response format: [file expiration](https://platform.claude.com/docs/en/build-with-claude/files#file-expiration) (set `expires_in_seconds` when you upload a file; file objects report `expires_at`), and `page` and `next_page` [pagination](https://platform.claude.com/docs/en/api/overview#pagination) plus an `ids[]` filter when you [list files](https://platform.claude.com/docs/en/build-with-claude/files#list-files). `/v1/files` requests that still send the beta header keep working and return the previous response format. To move an existing integration off the header, see [Migrate from `files-api-2025-04-14`](https://platform.claude.com/docs/en/build-with-claude/files#migrate-from-files-api-2025-04-14). +* [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) and the Skills API (`/v1/skills`) are out of beta on the Claude API. Requests no longer require the `skills-2025-10-02` beta header, including Messages API requests that load Skills through the `container` parameter. Requests that still send the header continue to work unchanged. See [Using Agent Skills with the API](https://platform.claude.com/docs/en/build-with-claude/skills-guide). To move an existing integration off the header, see [Migrate from `skills-2025-10-02`](https://platform.claude.com/docs/en/build-with-claude/skills-guide#migrate-from-skills-2025-10-02). * The [Admin API](https://platform.claude.com/docs/en/api/admin) user-management endpoints for **Claude Enterprise** (claude.ai) organizations (members, invites, groups, and custom roles) are out of beta. The `anthropic-beta: ce-user-management-2026-07-13` header is no longer required on group and custom-role requests; requests that still send it are accepted unchanged. See [User management](https://platform.claude.com/docs/en/manage-claude/user-management). * You can now restrict which sites a Claude Managed Agents agent's `web_search` and `web_fetch` tools can reach. Set `allowed_domains` or `blocked_domains` on the tool's entry in the `agent_toolset_20260401` `configs` array; `web_fetch` also accepts `max_content_tokens` and `web_search` accepts `user_location`. Each `configs` entry is identified by its `name` and typed by an optional `type`, and requests that pass only `name`, `enabled`, and `permission_policy` continue to work; in the typed SDKs, `configs` entries become per-tool types. See [Restrict web search and web fetch domains](https://platform.claude.com/docs/en/managed-agents/tools#restrict-web-search-and-web-fetch-domains). * Claude Managed Agents sessions that run in a [self-hosted sandbox](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes) can now attach [memory stores](https://platform.claude.com/docs/en/managed-agents/memory). The Python, TypeScript, and Go SDK workers download each attached store into the sandbox at its `mount_path` and sync the agent's changes back to the store. See [Use memory stores](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#use-memory-stores).
api/beta/files/delete Changed · +0 / -1 lines
curl https://api.anthropic.com/v1/files/$FILE_ID \ -X DELETE \ -H 'anthropic-version: 2023-06-01' \ - -H 'anthropic-beta: files-api-2025-04-14' \ -H "X-Api-Key: $ANTHROPIC_API_KEY" ```