One read of Claude Developer Platformapi-20261021T220722Z
82 pages moved out of 808 read.
Pages moved
82
significant first
Pages read
808
in this capture
Captured
22:07 UTC
Corpus hash
dd90a8d0c9c2
index-hash
What this read moved
26-50 of 82, page 2 of 4This capture is too large to show at once. Changes 26-50 of 82 are below, significant first; the rest are on the following screens.
build-with-claude/token-counting Changed · +6 / -5 lines
from line 175
175175 client = Anthropic::Client.new
176176
177177 response = client.messages.count_tokens(
178 model: "claude-opus-5-5",
178 model: Anthropic::Model::CLAUDE_OPUS_5_5,
179179 system: "You are a scientist",
180180 messages: [
181181 { role: "user", content: "Hello, Claude" }
from line 443
443443 client = Anthropic::Client.new
444444
445445 response = client.messages.count_tokens(
446 model: "claude-opus-5-5",
446 model: Anthropic::Model::CLAUDE_OPUS_5_5,
447447 tools: [
448448 {
449449 name: "get_weather",
from line 503
503503 ```
504504
505505 ```bash CLI
506 curl -s "https://platform.claude.com/docs/images/vision-example.jpg" -o ./vision-example.jpg
506 curl -s "https://platform.claude.com/docs/images/vision-example.jpg" \
507 -o ./vision-example.jpg
507508
508509 ant messages count-tokens <<'YAML'
509510 model: claude-opus-5-5
from line 752
751752 client = Anthropic::Client.new
752753
753754 response = client.messages.count_tokens(
754 model: "claude-opus-5-5",
755 model: Anthropic::Model::CLAUDE_OPUS_5_5,
755756 messages: [
756757 {
757758 role: "user",
from line 1355
13541355 pdf_base64 = Base64.strict_encode64(File.binread("/path/to/document.pdf"))
13551356
13561357 response = client.messages.count_tokens(
1357 model: "claude-opus-5-5",
1358 model: Anthropic::Model::CLAUDE_OPUS_5_5,
13581359 messages: [
13591360 {
13601361 role: "user",
build-with-claude/vision Changed · +3 / -4 lines
from line 266
266266 image_data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGP4z8AAAAMBAQDJ/pLvAAAAAElFTkSuQmCC"
267267
268268 message = client.messages.create(
269 model: "claude-opus-5-5",
269 model: Anthropic::Model::CLAUDE_OPUS_5_5,
270270 max_tokens: 1024,
271271 messages: [
272272 {
from line 575
575575 https://platform.claude.com/docs/images/vision-example.jpg
576576
577577 # First, upload your image to the Files API
578 ant files upload \
579 --file ./vision-example.jpg
578 ant files upload --file ./vision-example.jpg
580579
581580 # Then use the file_id from the upload response in your message
582581 ant messages create <<YAML
from line 1176
11771176 image2_data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGNgYPgPAAEDAQAIicLsAAAAAElFTkSuQmCC"
11781177
11791178 message = client.messages.create(
1180 model: "claude-opus-5-5",
1179 model: Anthropic::Model::CLAUDE_OPUS_5_5,
11811180 max_tokens: 1024,
11821181 messages: [
11831182 {
cli-sdks-libraries/overview Changed · +7 / -7 lines
from line 61
6161| Tool | Latest version | Package |
6262| ---------- | -------------- | ----------------------------------------------------------------------------------------------------- |
6363| ant CLI | `2.0.0` | [`github.com/anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli/releases) |
64| Python | `2.0.0` | [`anthropic`](https://pypi.org/project/anthropic/) |
65| TypeScript | `1.0.0` | [`@anthropic-ai/sdk`](https://www.npmjs.com/package/@anthropic-ai/sdk) |
66| C# | `13.0.0` | [`Anthropic`](https://www.nuget.org/packages/Anthropic) |
67| Go | `2.0.0` | [`github.com/anthropics/anthropic-sdk-go`](https://pkg.go.dev/github.com/anthropics/anthropic-sdk-go) |
68| Java | `3.0.0` | [`com.anthropic:anthropic-java`](https://central.sonatype.com/artifact/com.anthropic/anthropic-java) |
69| PHP | `1.0.0` | [`anthropic-ai/sdk`](https://packagist.org/packages/anthropic-ai/sdk) |
70| Ruby | `2.0.0` | [`anthropic`](https://rubygems.org/gems/anthropic) |
64| Python | `2.1.0` | [`anthropic`](https://pypi.org/project/anthropic/) |
65| TypeScript | `1.1.0` | [`@anthropic-ai/sdk`](https://www.npmjs.com/package/@anthropic-ai/sdk) |
66| C# | `13.1.0` | [`Anthropic`](https://www.nuget.org/packages/Anthropic) |
67| Go | `2.1.0` | [`github.com/anthropics/anthropic-sdk-go`](https://pkg.go.dev/github.com/anthropics/anthropic-sdk-go) |
68| Java | `3.1.0` | [`com.anthropic:anthropic-java`](https://central.sonatype.com/artifact/com.anthropic/anthropic-java) |
69| PHP | `1.1.0` | [`anthropic-ai/sdk`](https://packagist.org/packages/anthropic-ai/sdk) |
70| Ruby | `2.1.0` | [`anthropic`](https://rubygems.org/gems/anthropic) |
7171
7272The same versions are available as JSON at `https://platform.claude.com/docs/sdk-versions.json`.
7373
cli-sdks-libraries/sdks/ruby Changed · +8 / -8 lines
from line 32
3232message = anthropic.messages.create(
3333 max_tokens: 1024,
3434 messages: [{role: "user", content: "Hello, Claude"}],
35 model: :"claude-opus-5-5"
35 model: Anthropic::Model::CLAUDE_OPUS_5_5
3636)
3737
3838message.content.each do |block|
from line 51
5151stream = anthropic.messages.stream(
5252 max_tokens: 1024,
5353 messages: [{role: "user", content: "Hello, Claude"}],
54 model: :"claude-opus-5-5"
54 model: Anthropic::Model::CLAUDE_OPUS_5_5
5555)
5656
5757stream.each do |message|
from line 68
6868stream = anthropic.messages.stream(
6969 max_tokens: 1024,
7070 messages: [{role: :user, content: "Say hello there!"}],
71 model: :"claude-opus-5-5"
71 model: Anthropic::Model::CLAUDE_OPUS_5_5
7272)
7373
7474stream.text.each do |text|
from line 100
100100
101101# Automatically handles tool execution loop
102102anthropic.beta.messages.tool_runner(
103 model: "claude-opus-5-5",
103 model: Anthropic::Model::CLAUDE_OPUS_5_5,
104104 max_tokens: 1024,
105105 messages: [{role: "user", content: "What's 15 * 7?"}],
106106 tools: [Calculator.new]
from line 121
121121 message = anthropic.messages.create(
122122 max_tokens: 1024,
123123 messages: [{role: "user", content: "Hello, Claude"}],
124 model: :"claude-opus-5-5"
124 model: Anthropic::Model::CLAUDE_OPUS_5_5
125125 )
126126rescue Anthropic::Errors::APIConnectionError => e
127127 puts("The server could not be reached")
from line 262
262262anthropic.messages.create(
263263 max_tokens: 1024,
264264 messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
265 model: :"claude-opus-5-5"
265 model: Anthropic::Model::CLAUDE_OPUS_5_5
266266)
267267```
268268
from line 274
274274anthropic.messages.create(
275275 max_tokens: 1024,
276276 messages: [{role: "user", content: "Hello, Claude"}],
277 model: :"claude-opus-5-5"
277 model: Anthropic::Model::CLAUDE_OPUS_5_5
278278)
279279
280280# You can also splat a full Params class:
from line 281
281281params = Anthropic::MessageCreateParams.new(
282282 max_tokens: 1024,
283283 messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
284 model: :"claude-opus-5-5"
284 model: Anthropic::Model::CLAUDE_OPUS_5_5
285285)
286286anthropic.messages.create(**params)
287287```
manage-claude/inference-hooks-endpoint Changed · +30 / -7 lines
from line 258
258258
259259`tool_info` says who runs or provides the tool, not what the tool can reach. It is one of four kinds, told apart by its `type` field, and each kind carries its own fields. Anthropic sends the first of the following kinds that fits the tool. New kinds may appear: accept a `type` you don't recognize, and for such a kind rely only on `type`.
260260
261An optional field that doesn't apply is left out, never `null`, so a `tool_info` can be just `{"type": "client"}`. `tool_name` is chosen by whoever defined the tool, and a server's `toolset_name` by whoever wrote the request, so don't treat either as a trust boundary.
261An optional field that doesn't apply is left out, never `null`, so a `tool_info` can be just `{"type": "client"}`. `tool_name` is chosen by whoever defined the tool, and a server's `toolset_name` by whoever wrote the request or named the connector. Don't treat either as a trust boundary.
262262
263263### Platform tools
264264
from line 301
301301
302302A third-party tool is one on a server that Anthropic knows of, such as a claude.ai connector or an MCP server that the request names in `mcp_servers`. This doesn't mean Anthropic has vetted the server. In voice mode, a call to a claude.ai connector's tool is `"client"` instead.
303303
304| Field | Present | Description |
305| ----------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
306| `type` | Always | `"third_party"` |
307| `toolset_name` | Optional | The name the request gives the server. |
308| `origin` | Optional | The scheme, host, and non-default port of the server's URL. It can be a private or local address, `localhost` included. An absent `origin` means unknown, not safe. |
309| `verified_origin` | Whenever `origin` is | `true` only when Anthropic's servers connect to the server themselves. Treat `false` as an origin that Anthropic hasn't confirmed. |
304| Field | Present | Description |
305| ----------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
306| `type` | Always | `"third_party"` |
307| `toolset_name` | Optional | For a server in `mcp_servers`, the name the request gives the server. For any other server, such as a claude.ai connector, the server's name, copied from `tool_name`. |
308| `origin` | Optional | The scheme, host, and non-default port of the server's URL. It can be a private or local address, `localhost` included. An absent `origin` means unknown, not safe. |
309| `verified_origin` | Whenever `origin` is | `true` only when Anthropic's servers connect to the server themselves. Treat `false` as an origin that Anthropic hasn't confirmed. |
310310
311311A `tool_use` block for a tool on an MCP server that the request names `crm` in `mcp_servers`:
312312
from line 326
326326 }
327327}
328328```
329
330A `tool_use` block for a tool on a Gmail connector, called in a claude.ai chat:
331
332```json
333{
334 "type": "tool_use",
335 "id": "toolu_01DeFgHiJkLmNoPqRsTuVwXy",
336 "tool_name": "mcp__Gmail__search_threads",
337 "input": {
338 "query": "from:[email protected] newer_than:30d"
339 },
340 "tool_info": {
341 "type": "third_party",
342 "toolset_name": "Gmail",
343 "origin": "https://gmail.mcp.example.com",
344 "verified_origin": false
345 }
346}
347```
348
349For a claude.ai connector, `verified_origin` can be `false` even when Anthropic's servers connect to the server themselves.
350
351A name copied from `tool_name` can differ from the name the user sees: `mcp__Google_Drive__search_files` gives `Google_Drive`, not `Google Drive`. It can also end in a short suffix (`Gmail-1a2b3c4d`), for example when another of the user's connectors has the same name. The name isn't a stable identifier and doesn't prove which server the tool is on. When `tool_name` has no server name in it, `toolset_name` is left out.
329352
330353### Client tools
331354
manage-claude/plugins-api Changed · +22 / -17 lines
#### Failed scans an administrator allowed
from line 260
260260* `latest_version_id`: the newest version
261261* `served_version_id`: the version members are served
262262
263By default `served_version_pinned` is `false`: the served version normally follows the newest one. When content scanning is on, a version saved in claude.ai might **wait** for its content scan: it is stored but not served at once. This page uses "wait" only for a version saved in claude.ai, not for one that a member or an administrator publishes into a plugin. While scanning is on, a waiting version is served only after its scan completes with `pass` or `warn`. While a version waits, `served_version_id` names an earlier version than `latest_version_id`. Do not poll until the two IDs match: they might stay different, for example when the scan fails.
263By default `served_version_pinned` is `false`: the served version normally follows the newest one. When content scanning is on, a version saved in claude.ai might **wait** for its content scan: it is stored but not served at once. This page uses "wait" only for a version saved in claude.ai, not for one that a member or an administrator publishes into a plugin. While scanning is on, a waiting version is served only when its `content_scan` reads `completed` with `pass` or `warn`. While a version waits, `served_version_id` names an earlier version than `latest_version_id`. Do not poll until the two IDs match: they might stay different, for example when the scan fails.
264264
265265Choosing a version with `POST /v1/organizations/plugins/{plugin_id}` **pins** the plugin (`served_version_pinned: true`). So does an administrator choosing a version in claude.ai, or accepting a member's request to publish into the plugin. From then on, new uploads are stored and advance `latest_version_id`, but members keep the pinned version until you point `served_version_id` at another one. A plugin whose two pointers differ has a stored version that is not being served.
266266
267This lets a release pipeline upload each build, test it, and then promote it. To have your pipeline determine when each build is served, pin the plugin once by setting `served_version_id` to its current version; from then on, promote each build you want served. With content scanning on, that first pin returns `409 scan_pending` until the current version's scan completes, and `400 scan_failed` if the scan completed with `fail` or `unknown`, or errored (`warn` is accepted). A pinned plugin cannot currently be unpinned, here or in claude.ai.
267This lets a release pipeline upload each build, test it, and then promote it. To have your pipeline determine when each build is served, pin the plugin once by setting `served_version_id` to its current version; from then on, promote each build you want served. With content scanning on, that first pin returns `409 scan_pending` until the current version's scan completes, and `400 scan_failed` if the scan reads `fail` or `unknown`, or errored (`warn` is accepted). A pinned plugin cannot currently be unpinned, here or in claude.ai.
268268
269269To roll back, set `served_version_id` to an earlier version. Roll forward the same way.
270270
from line 301
301301
302302Content scanning is an organization setting in claude.ai. When it is on, newly stored versions are scanned (claude.ai exempts a few) and the result is reported in `content_scan`; a version that was not scanned, for example one stored before scanning was turned on, has `content_scan: null`. Scanning is not offered to organizations that use customer-managed encryption keys or zero data retention.
303303
304While scanning is on, members are served a plugin only when its served version's scan is `completed` with `pass` or `warn`. While the scan runs, or after it fails, errors, or reaches no verdict, the plugin is withheld from members, and an earlier version is not served in its place. A version that was never scanned (`content_scan: null`) is served normally.
304While scanning is on, members are served a plugin only when its served version's scan is `completed` with `pass` or `warn`. While the scan is `processing` or `errored`, or reads `fail` or `unknown`, the plugin is withheld from members, and an earlier version is not served in its place. A version that was never scanned (`content_scan: null`) is served normally.
305305
306A version you upload through this API never waits for its content scan. When it becomes the served version, members lose the plugin until its scan completes with `pass` or `warn`. If members should keep the current version while a new one is scanned, pin the plugin first (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)).
306A version you upload through this API never waits for its content scan. When it becomes the served version, members lose the plugin until its `content_scan` reads `completed` with `pass` or `warn`. If members should keep the current version while a new one is scanned, pin the plugin first (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)).
307307
308308While a version saved in claude.ai waits for its scan, the served version does not change. When your API upload becomes the served version, any wait ends: the waiting version is served only if someone chooses it. To see a waiting version's scan, read the version (see [List a plugin's versions](https://platform.claude.com/docs/en/manage-claude/plugins-api#list-a-plugins-versions)).
309309
310After an upload, `content_scan.status` is `processing` and the verdict arrives asynchronously. Read the version to see it; the plugin object shows only its served version's scan. Changing the served version to a version whose scan is still running returns `409 scan_pending`; to one whose scan failed, `400 scan_failed`.
310After an upload, `content_scan.status` is `processing` and the verdict arrives asynchronously. Read the version to see it; the plugin object shows only its served version's scan. While scanning is on, changing the served version to a version whose scan is still running returns `409 scan_pending`, and changing it to one whose scan reads `fail` or `unknown`, or errored, returns `400 scan_failed`.
311311
312#### Failed scans an administrator allowed
313
314In claude.ai, an administrator can allow a version whose scan failed. This API can then report that scan as `completed` with `warn` and the failed scan's `reason`. While it does, the rules for `warn` apply: the version can be served to members, and you can make it the served version. Nothing in the response shows that it was allowed, so a `warn` is either a warning or a failed scan that an administrator allowed. Allowing a version whose scan reads `warn` does not change its `content_scan`. When a version stops being allowed, this API reports the verdict of its newest completed scan, and a served version whose scan reads `fail` or `unknown` is withheld from members.
315
312316### Reach
313317
314318`reach` summarizes, in one value, how far a version reaches on members' machines and beyond:
from line 497
493497
494498### Keep a security inventory in sync
495499
496Run a nightly job that flags plugins reaching outside the member's session or failing their content scan.
500Run a nightly job that flags plugins that reach outside the member's session or whose content scan reads `warn`, `fail`, or `unknown`.
497501
4981. Page through [`GET /v1/organizations/plugins?limit=100`](https://platform.claude.com/docs/en/manage-claude/plugins-api#list-plugins) until `next_page` is `null` (see [Pagination](https://platform.claude.com/docs/en/manage-claude/plugins-api#pagination)). Read each plugin's `reach` and `content_scan` from that list on every run: a scan verdict that arrives later does not move `updated_at`. `updated_at` normally tells you which plugins have new content or a new served version since the last run (worth a fresh archive download). A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) moves `updated_at` when it becomes the served version, not necessarily when it is stored. To notice one, compare `latest_version_id` with the value from your last run. The full re-list is also what catches removals, because a plugin removed by a Git synchronization or an account deletion disappears without an event.
4992. Flag each plugin whose `reach` is `remote` (it declares an MCP server or a CLI), or whose `content_scan.assessment` is `fail` or `unknown`. These fields describe the served version. To also check a newer version that is not served, list the plugin's versions when `latest_version_id` differs from `served_version_id` (see [List a plugin's versions](https://platform.claude.com/docs/en/manage-claude/plugins-api#list-a-plugins-versions)).
5021. Page through [`GET /v1/organizations/plugins?limit=100`](https://platform.claude.com/docs/en/manage-claude/plugins-api#list-plugins) until `next_page` is `null` (see [Pagination](https://platform.claude.com/docs/en/manage-claude/plugins-api#pagination)). Read each plugin's `reach` and `content_scan` from that list on every run: a change to `content_scan` alone, such as a verdict that arrives later, does not move `updated_at`. `updated_at` normally tells you which plugins have new content or a new served version since the last run (worth a fresh archive download). A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) moves `updated_at` when it becomes the served version, not necessarily when it is stored. To notice one, compare `latest_version_id` with the value from your last run. The full re-list is also what catches removals, because a plugin removed by a Git synchronization or an account deletion disappears without an event.
5032. Flag each plugin whose `reach` is `remote` (it declares an MCP server or a CLI), or whose `content_scan.assessment` is `warn`, `fail`, or `unknown`. A `warn` can also be a failed scan that an administrator allowed (see [Failed scans an administrator allowed](https://platform.claude.com/docs/en/manage-claude/plugins-api#failed-scans-an-administrator-allowed)); leave `warn` out only if you accept every failed scan that an administrator allows. These fields describe the served version. To also check a newer version that is not served, list the plugin's versions when `latest_version_id` differs from `served_version_id` (see [List a plugin's versions](https://platform.claude.com/docs/en/manage-claude/plugins-api#list-a-plugins-versions)).
5005043. For each flagged plugin, download the served version's archive for review with `GET /v1/organizations/plugins/{plugin_id}/versions/{served_version_id}/content` (see [Download a version's files](https://platform.claude.com/docs/en/manage-claude/plugins-api#download-a-versions-files)). Also download any unserved version that meets step 2's test, by its ID.
5015054. To take a plugin away from members while you review it, see [Delete a plugin](https://platform.claude.com/docs/en/manage-claude/plugins-api#delete-a-plugin) for the reversible (organization-owned) and permanent options.
502506
from line 522
518522| `content_scan` | The served version's scan result, an object with `status`, `assessment`, and `reason` (described after this table). `null` when it was never scanned. |
519523| `components` | The served version's components, each `{"type", "name", "description"}` with `type` one of `skill`, `mcp_server`, `command`, `agent`, `hook`, or `cli`, listed in that type order and then by name. For an MCP server, `name` is its key in the manifest; for a hook, the event it runs on; for a CLI, the executable's name. `description` is always `null` for MCP servers, hooks, and CLIs. `null` when not recorded. |
520524| `reach` | `contained`, `privileged`, or `remote`. See [Reach](https://platform.claude.com/docs/en/manage-claude/plugins-api#reach). |
521| `updated_at` | Changes when the served version changes, when the plugin becomes pinned, and normally when a new version is stored. A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) changes it when it becomes the served version, not necessarily when it is stored. It does not change for installation settings, shares, or new scan results. |
525| `updated_at` | Changes when the served version changes, when the plugin becomes pinned, and normally when a new version is stored. A waiting version (see [Versions and the served version](https://platform.claude.com/docs/en/manage-claude/plugins-api#versions-and-the-served-version)) changes it when it becomes the served version, not necessarily when it is stored. It does not change for installation settings, shares, or a change to `content_scan` alone. |
522526
523527The `content_scan` object:
524528
525| Field | Description |
526| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
527| `status` | `processing` while the scan runs, `completed` when it finished, or `errored` when it could not finish (or, occasionally, when its result could not be read for this response, in which case a later read may report it). Members are not served a version whose scan is `processing` or `errored`; uploading the content again as a new version gets a fresh scan. |
528| `assessment` | Set when `status` is `completed`: `pass` (nothing found), `warn` (something found that does not block use), `fail` (something found that blocks use), or `unknown` (no verdict). Otherwise `null`. |
529| `reason` | For `warn` and `fail`, the main concern, from the following list. Otherwise `null`, and also `null` on an older scan that predates reason recording. |
529| Field | Description |
530| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
531| `status` | `processing` while the scan runs, `completed` when it finished, or `errored` when it could not finish (or, occasionally, when its result could not be read for this response, in which case a later read may report it). Members are not served a version whose scan is `processing` or `errored`; uploading the content again as a new version gets a fresh scan. |
532| `assessment` | Set when `status` is `completed`: `pass` (nothing found), `warn` (something found that does not block use, or a failed scan that an administrator allowed; see [Failed scans an administrator allowed](https://platform.claude.com/docs/en/manage-claude/plugins-api#failed-scans-an-administrator-allowed)), `fail` (something found that blocks use), or `unknown` (no verdict). Otherwise `null`. |
533| `reason` | For `warn` and `fail`, the main concern, from the following list. Otherwise `null`, and also `null` on an older scan that predates reason recording. |
530534
531535<Accordion title="Content scan reason values">
532536 | `reason` | Meaning |
from line 3188
31843188| `skill_name_taken` | 409 | The plugin is in the library marketplace and one of its skills has the same name as an organization skill (a skill an administrator uploaded for the whole organization in claude.ai). `details.skill_name` names it. Rename or remove one of them. |
31853189| `registration_pending` | 503 | The files were stored, but the plugin's skills could not yet be made available to members. See [Retrying uploads](https://platform.claude.com/docs/en/manage-claude/plugins-api#retrying-uploads). |
31863190| `scan_pending` | 409 | The version's content scan is still running. Retry once it finishes. |
3187| `scan_failed` | 400 | The version's content scan failed, errored, or reached no verdict, so it cannot be served. Choose another version. |
3191| `scan_failed` | 400 | The version's content scan reads `fail` or `unknown`, or errored, so it cannot be served. Choose another version. |
31883192| `cmek_key_disabled`, `cmek_key_network_blocked` | 400 | Your organization's customer-managed encryption key is unavailable. See [Customer-managed encryption keys](https://platform.claude.com/docs/en/manage-claude/plugins-api#customer-managed-encryption-keys). |
3193| `unsupported_charset` | 400 | On an upload or `validate_archive`, the request's `Content-Type` header names a charset other than UTF-8, ISO-8859-1, or US-ASCII. Send the request with no charset, or with one of these. |
31893194
31903195New codes may be added. Treat a code you do not recognize the way you treat its status.
31913196
manage-claude/spend-limits-api Changed · +9 / -2 lines
from line 511
511511 -H "content-type: application/json" \
512512 -H "x-api-key: $ANTHROPIC_API_KEY" \
513513 -H "anthropic-version: 2023-06-01" \
514 -d '{"scope": {"type": "user", "user_id": "user_01AbCdEfGh"}, "amount": "75000"}'
514 -d '{
515 "scope": {"type": "user", "user_id": "user_01AbCdEfGh"},
516 "amount": "75000"
517 }'
515518 ```
516519
517520 ```bash CLI
from line 2019
20162019 -H "content-type: application/json" \
20172020 -H "x-api-key: $ANTHROPIC_API_KEY" \
20182021 -H "anthropic-version: 2023-06-01" \
2019 -d '{"scope": {"type": "user", "user_id": "user_01AbCdEfGh"}, "amount": "500000", "period": "monthly"}'
2022 -d '{
2023 "scope": {"type": "user", "user_id": "user_01AbCdEfGh"},
2024 "amount": "500000",
2025 "period": "monthly"
2026 }'
20202027 ```
20212028
20222029 ```bash CLI
manage-claude/wif-providers/spiffe Changed · +7 / -7 lines
from line 85
8585# Replace NODE_UID with the node's UID:
8686# kubectl get node <node-name> -o jsonpath='{.metadata.uid}'
8787spire-server entry create \
88 -spiffeID spiffe://prod.example.com/ns/inference/sa/worker \
89 -parentID spiffe://prod.example.com/spire/agent/k8s_psat/prod-cluster/NODE_UID \
90 -selector k8s:ns:inference \
91 -selector k8s:sa:worker
88 -spiffeID spiffe://prod.example.com/ns/inference/sa/worker \
89 -parentID spiffe://prod.example.com/spire/agent/k8s_psat/prod-cluster/NODE_UID \
90 -selector k8s:ns:inference \
91 -selector k8s:sa:worker
9292```
9393
9494<Note>
from line 453
453453
454454```bash CLI
455455spire-agent api fetch jwt \
456 -audience https://api.anthropic.com \
457 -socketPath /run/spire/sockets/agent.sock \
458 -output json \
456 -audience https://api.anthropic.com \
457 -socketPath /run/spire/sockets/agent.sock \
458 -output json \
459459 | jq -r '.[0].svids[0].svid' \
460460 | jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson'
461461```
managed-agents/multiagent-orchestration Changed · +4 / -4 lines
from line 318
318318 ```ruby Ruby
319319 lead_agent = client.beta.agents.create(
320320 name: "Engineering Lead",
321 model: "claude-opus-5-5",
321 model: Anthropic::Beta::BetaManagedAgentsModel::CLAUDE_OPUS_5_5,
322322 system: "You coordinate engineering work. Delegate code review to the reviewer agent and test writing to the test agent.",
323323 tools: [
324324 {type: "agent_toolset_20260401"}
from line 457
457457 "tools": [{"type": "mcp_toolset", "mcp_server_name": "github"}]
458458 }'
459459
460 # Create the agent that delegates to it: research_agent_id is the id from the first response
460 # Create the agent that delegates to it: research_agent_id is the ID from the first response
461461 curl --fail-with-body -sS https://api.anthropic.com/v1/agents \
462462 -H "x-api-key: $ANTHROPIC_API_KEY" \
463463 -H "anthropic-version: 2023-06-01" \
from line 976
976976 ```ruby Ruby
977977 agent = client.beta.agents.create(
978978 name: "Contract Reviewer",
979 model: "claude-opus-5-5",
979 model: Anthropic::Beta::BetaManagedAgentsModel::CLAUDE_OPUS_5_5,
980980 system_: "You review contracts. When you're asked to review more than a few contracts, start a workflow run that reads them in parallel and combines the findings. Review one or two contracts yourself, without a run.",
981981 tools: [
982982 {type: "agent_toolset_20260401"}
from line 1197
11971197 ```ruby Ruby
11981198 agent = client.beta.agents.create(
11991199 name: "Backend engineer",
1200 model: "claude-sonnet-5",
1200 model: Anthropic::Beta::BetaManagedAgentsModel::CLAUDE_SONNET_5,
12011201 system_: "You implement backend features end to end. Consult the advisor before major backend design decisions.",
12021202 multiagent: {
12031203 type: "multiagent_20261001",
managed-agents/session-operations Changed · +3 / -8 lines
from line 277
277277 ```bash CLI
278278 # --format raw returns one page envelope with its prev_page and next_page
279279 # cursors; the default output auto-paginates and emits only the sessions.
280 ant beta:sessions list \
281 --agent-id "$AGENT_ID" \
282 --limit 1 \
283 --format raw
280 ant beta:sessions list --agent-id "$AGENT_ID" --limit 1 --format raw
284281 # Pass next_page back as --page to fetch the next page, or prev_page to go back.
285282 ```
286283
from line 501
504501 ```
505502
506503 ```bash CLI
507 ant beta:sessions archive \
508 --session-id "$SESSION_ID"
504 ant beta:sessions archive --session-id "$SESSION_ID"
509505 ```
510506
511507 ```python Python
from line 551
555551 ```
556552
557553 ```bash CLI
558 ant beta:sessions delete \
559 --session-id "$SESSION_ID"
554 ant beta:sessions delete --session-id "$SESSION_ID"
560555 ```
561556
562557 ```python Python
managed-agents/session-threads Changed · +10 / -2 lines
from line 117
117117 -H "anthropic-version: 2023-06-01" \
118118 -H "anthropic-beta: managed-agents-2026-04-01" \
119119 -H "content-type: application/json" \
120 -d '{"events": [{"type": "user.interrupt", "session_thread_id": "'"$THREAD_ID"'"}]}'
120 -d '{
121 "events": [
122 {"type": "user.interrupt", "session_thread_id": "'"$THREAD_ID"'"}
123 ]
124 }'
121125 ```
122126
123127 ```bash CLI
from line 267
263267 -H "anthropic-version: 2023-06-01" \
264268 -H "anthropic-beta: managed-agents-2026-04-01" \
265269 -H "content-type: application/json" \
266 -d '{"events": [{"type": "user.interrupt", "session_thread_id": "'"$THREAD_ID"'"}]}'
270 -d '{
271 "events": [
272 {"type": "user.interrupt", "session_thread_id": "'"$THREAD_ID"'"}
273 ]
274 }'
267275
268276 curl -fsS -X POST "https://api.anthropic.com/v1/sessions/$SESSION_ID/threads/$THREAD_ID/archive" \
269277 -H "x-api-key: $ANTHROPIC_API_KEY" \
managed-agents/sessions Changed · +3 / -6 lines
from line 30
3030 ```
3131
3232 ```bash CLI
33 ant beta:sessions create \
34 --agent "$AGENT_ID" \
35 --environment-id "$ENVIRONMENT_ID"
33 ant beta:sessions create --agent "$AGENT_ID" --environment-id "$ENVIRONMENT_ID"
3634 ```
3735
3836 ```python Python
from line 466
468466
469467 ```bash CLI
470468 # The response's `agent` is the resolved snapshot: each override replaces that
471 # field for this session only, and the agent resource keeps its id and version.
469 # field for this session only, and the agent resource keeps its ID and version.
472470 ant beta:sessions create <<YAML
473471 agent:
474472 type: agent_with_overrides
from line 993
995993 ```
996994
997995 ```bash CLI
998 ant beta:sessions:events send \
999 --session-id "$SESSION_ID" <<'YAML'
996 ant beta:sessions:events send --session-id "$SESSION_ID" <<'YAML'
1000997 events:
1001998 - type: user.message
1002999 content:
release-notes/overview Changed · +4 / -3 lines
from line 17
1717* We've released API version `2026-10-21`. [Migrating to API version 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21) shows how to upgrade.
1818* We've released new versions of the [client SDKs](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) and the [`ant` CLI](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/quickstart) that send API version `2026-10-21` by default: Python SDK 2.0.0, TypeScript SDK 1.0.0, C# SDK 13.0.0, Go SDK 2.0.0, Java SDK 3.0.0, PHP SDK 1.0.0, Ruby SDK 2.0.0, and `ant` CLI 2.0.0. See [Switch to 2026-10-21](https://platform.claude.com/docs/en/api/migration-2026-10-21#upgrade).
1919* The new SDK and CLI versions also have breaking changes that don't depend on the API version, and they are licensed under Apache 2.0 instead of the MIT License. See [SDK and CLI changes](https://platform.claude.com/docs/en/api/migration-2026-10-21#sdk-changes).
20* We've added the `enforcement_status` and `enforcement_actions` fields to [user profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles), so you can see whether Anthropic has restricted or banned one of your end customers. To find the profiles that have an open restriction or ban, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with the new `enforcement_status[]` filter. See [Check whether Anthropic has restricted or banned a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles#check-whether-anthropic-has-restricted-or-banned-a-profile).
2021
21- We've added the `enforcement_status` and `enforcement_actions` fields to [user profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles), so you can see whether Anthropic has restricted or banned one of your end customers. To find the profiles that have an open restriction or ban, [list your profiles](https://platform.claude.com/docs/en/api/user_profiles/list) with the new `enforcement_status[]` filter. See [Check whether Anthropic has restricted or banned a profile](https://platform.claude.com/docs/en/manage-claude/user-profiles#check-whether-anthropic-has-restricted-or-banned-a-profile).
22
2322### October 20, 2026
2423
2524* [Inference hooks](https://platform.claude.com/docs/en/manage-claude/inference-hooks) are out of beta for Claude Enterprise organizations.
2625* We've launched [user profiles](https://platform.claude.com/docs/en/manage-claude/user-profiles), so you can tell Anthropic which of your end customers each API request is for. If you operate a platform or gateway, or resell API access, a safety enforcement action can then apply to one end customer instead of your whole organization. The SDK and the `ant` CLI support the new [`/v1/user_profiles` endpoints](https://platform.claude.com/docs/en/api/user_profiles).
2726* We've added [organization webhooks](https://platform.claude.com/docs/en/manage-claude/organization-webhooks) to the [Admin API](https://platform.claude.com/docs/en/manage-claude/admin-api), in beta with the `webhooks-2026-10-07` beta header. Its [`/v1/organizations/webhooks` endpoints](https://platform.claude.com/docs/en/api/beta/organization/webhooks) register webhook endpoints for two event types: one for when Anthropic restricts or bans one of your organization's user profiles, and one for when the restriction or ban ends. To request access, contact your Anthropic account team.
27* Organization admins can now turn off web fetch for their organization on the [**Capabilities**](https://platform.claude.com/settings/capabilities) page of the Claude Console. With web fetch off, a Messages API request that includes the web fetch tool fails with a 400 error. In a Claude Managed Agents session, `web_fetch` calls return an error result to the agent instead. With web fetch on, admins can also set allowed or blocked domains for web fetch on the same page. See [Web fetch tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool#how-to-use-web-fetch) and [Domain filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools#domain-filtering).
28* In Claude Managed Agents, the [`web_fetch` tool](https://platform.claude.com/docs/en/managed-agents/tools#available-tools) now follows your organization's web fetch domain restrictions set on the [**Capabilities**](https://platform.claude.com/settings/capabilities) page of the Claude Console. A URL, including one reached by a redirect, must pass both the organization's list and the `allowed_domains` or `blocked_domains` list on the agent's `web_fetch` tool. See [Restrict web search and web fetch domains](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions).
29* In Claude Managed Agents, sessions follow your organization's web search settings on the [**Capabilities**](https://platform.claude.com/settings/capabilities) page of the Claude Console: the **Allow web search** setting since October 6, and its web search domain restrictions since October 14. The agent receives only the search results that both the organization's domain restrictions and the `allowed_domains` or `blocked_domains` list on the agent's [`web_search` tool](https://platform.claude.com/docs/en/managed-agents/tools#available-tools) allow. See [Restrict web search and web fetch domains](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions).
2830
2931### October 15, 2026
3032
from line 39
3739
3840* We've launched [OpenTelemetry export](https://platform.claude.com/docs/en/manage-claude/opentelemetry) in beta, so you can trace Messages API requests and Claude Managed Agents sessions in your observability platform. The Claude SDK emits spans in Python, TypeScript, C#, Go, Java, PHP, and Ruby. To get spans from the API, [add an OpenTelemetry destination](https://platform.claude.com/docs/en/manage-claude/opentelemetry/api#add-a-destination) in the Claude Console.
3941* Claude Managed Agents [scheduled deployments](https://platform.claude.com/docs/en/managed-agents/scheduled-deployments) are now available on [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws#claude-managed-agents).
40* In Claude Managed Agents, the [`web_search` tool](https://platform.claude.com/docs/en/managed-agents/tools#available-tools) now follows your organization's web search domain restrictions set in the Claude Console. The agent receives only the search results that both the organization's domain restrictions and the `allowed_domains` or `blocked_domains` list on the agent's `web_search` tool allow. Sessions have followed the organization's **Allow web search** setting since October 6. See [Restrict web search and web fetch domains](https://platform.claude.com/docs/en/managed-agents/tools-web-restrictions).
4142
4243### October 9, 2026
4344
about-claude/use-case-guides/customer-support-chat Changed · +1 / -1 lines
from line 440
440440
441441<CodeGroup exclude="shell">
442442 ```python Python
443 # In your chatbot.py, import these from the config.py you wrote above:
443 # In your chatbot.py, import these from the config.py you wrote earlier:
444444 # from config import IDENTITY, TOOLS, MODEL, get_quote
445445 from anthropic import Anthropic
446446 from dotenv import load_dotenv
agents-and-tools/agent-skills/best-practices Changed · +1 / -1 lines
from line 918
918918# Longer timeout accounts for slow connections
919919REQUEST_TIMEOUT = 30
920920
921# Three retries balances reliability vs speed
921# Three retries balances reliability versus speed
922922# Most intermittent failures resolve by the second retry
923923MAX_RETRIES = 3
924924```
agents-and-tools/agent-skills/enterprise Changed · +1 / -1 lines
from line 46
4646
4747### Skill content scanning
4848
49Claude Enterprise organizations can turn on automated security scanning for custom Skills in claude.ai and Claude Cowork. After you turn on **Skill and plugin security scanning** at [claude.ai > Organization settings > Skills](https://claude.ai/admin-settings/skills), Skills that members then upload or edit in claude.ai or Cowork are scanned for signs of malicious behavior, such as hidden code execution, sending your data to an outside service, or instructions that tamper with Claude's safeguards. A Skill that fails the scan, or whose scan hasn't completed, is blocked from use. A Skill that passes with a warning stays usable behind a caution notice. If scanning is available to your organization, turn it on. It complements, but doesn't replace, the [review checklist](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#review-checklist).
49Claude Enterprise organizations can turn on automated security scanning for custom Skills in claude.ai and Claude Cowork. After you turn on **Skill and plugin security scanning** at [claude.ai > Organization settings > Skills](https://claude.ai/admin-settings/skills), Skills that members then upload or edit in claude.ai or Cowork are scanned for signs of malicious behavior, such as hidden code execution, sending your data to an outside service, or instructions that tamper with Claude's safeguards. A Skill that fails the scan, or whose scan hasn't completed, is blocked from use. An administrator can allow some Skills that failed the scan. A Skill that passes with a warning stays usable behind a caution notice. If scanning is available to your organization, turn it on. It complements, but doesn't replace, the [review checklist](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#review-checklist).
5050
5151Scanning doesn't cover the Claude API. Skills you upload through the Skills API (`/v1/skills`), including from the Claude Console, aren't scanned, so for API deployments, rely on the review checklist and [version pinning](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise#versioning-strategy). Scanning also doesn't apply to Skills that were already in your organization when you turned it on, or to organizations with certain data handling configurations, such as customer-managed encryption keys (CMEK), zero data retention (ZDR), or HIPAA readiness. For setup steps, exclusions, and result types, see [Get started with skill and plugin scanning](https://support.claude.com/en/articles/15927065-get-started-with-skill-and-plugin-scanning) in the Claude Help Center.
5252
agents-and-tools/agent-skills/quickstart Changed · +3 / -1 lines
from line 394
394394
395395 if [[ -n "$file_id" ]]; then
396396 # Download the file and save it
397 ant files download --file-id "$file_id" --output "${TMPDIR:-/tmp}/renewable_energy.pptx"
397 ant files download \
398 --file-id "$file_id" \
399 --output "${TMPDIR:-/tmp}/renewable_energy.pptx"
398400 fi
399401 ```
400402
agents-and-tools/mcp-tunnels/deploy-compose Changed · +2 / -2 lines
from line 409
409409export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
410410export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
411411# export ANTHROPIC_WORKSPACE_ID=wrkspc_... # if your rule is workspace-scoped
412# Re-mint ANTHROPIC_IDENTITY_TOKEN per the WIF provider guide for your
413# environment (it will have expired since install).
412# Re-mint ANTHROPIC_IDENTITY_TOKEN as described in the WIF provider guide for
413# your environment (it will have expired since install).
414414export ANTHROPIC_IDENTITY_TOKEN=...
415415
416416docker compose run --rm setup
agents-and-tools/tool-use/advisor-tool Changed · +2 / -2 lines
from line 1181
11811181 end
11821182
11831183 tools = [
1184 { type: "advisor_20260301", name: "advisor", model: "claude-opus-5-5" }
1184 { type: "advisor_20260301", name: "advisor", model: Anthropic::Model::CLAUDE_OPUS_5_5 }
11851185 # ... your other tools
11861186 ]
11871187 task = "Build a concurrent worker pool in Go with graceful shutdown."
from line 1190
11901190
11911191 (1..MAX_TURNS).each do |turn|
11921192 response = client.beta.messages.create(
1193 model: "claude-haiku-5-5",
1193 model: Anthropic::Model::CLAUDE_HAIKU_5_5,
11941194 max_tokens: 4096,
11951195 tools: tools,
11961196 messages: messages,
agents-and-tools/tool-use/bash-tool Changed · +2 / -2 lines
from line 166
166166 client = Anthropic::Client.new
167167
168168 response = client.messages.create(
169 model: "claude-opus-5-5",
169 model: Anthropic::Model::CLAUDE_OPUS_5_5,
170170 max_tokens: 1024,
171171 tools: [{type: "bash_20250124", name: "bash"}],
172172 messages: [
from line 1147
11471147 client = Anthropic::Client.new
11481148
11491149 response = client.messages.create(
1150 model: "claude-opus-5-5",
1150 model: Anthropic::Model::CLAUDE_OPUS_5_5,
11511151 max_tokens: 1024,
11521152 tools: [{type: "bash_20250124", name: "bash"}],
11531153 messages: [
agents-and-tools/tool-use/browser-use-tool Changed · +2 / -2 lines
from line 186
186186 client = Anthropic::Client.new
187187
188188 response = client.messages.create(
189 model: "claude-opus-5-5",
189 model: Anthropic::Model::CLAUDE_OPUS_5_5,
190190 max_tokens: 2048,
191191 tools: [
192192 { type: "browser_toolset_20260801" }
from line 802
802802 continue;
803803 }
804804 if (failed) {
805 // A batch stops at its first failure; answer later actions unexecuted
805 // A batch stops at its first failure; answer later actions without running them
806806 toolResults.push(browserResult(block.id, HALT_TEXT, true));
807807 continue;
808808 }
agents-and-tools/tool-use/code-execution-tool Changed · +2 / -2 lines
from line 295
295295 -H "anthropic-version: 2023-06-01" \
297297
298 # Then use the file with code execution: FILE_ID is the id from the upload response
298 # Then use the file with code execution: FILE_ID is the ID from the upload response
299299 curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
300300 -H "x-api-key: $ANTHROPIC_API_KEY" \
301301 -H "anthropic-version: 2023-06-01" \
from line 321
321321 # First, upload a file
322322 ant files upload --file ./data.csv
323323
324 # Then use the file with code execution: FILE_ID is the id from the upload response
324 # Then use the file with code execution: FILE_ID is the ID from the upload response
325325 ant messages create <<YAML
326326 model: claude-opus-5-5
327327 max_tokens: 4096
agents-and-tools/tool-use/computer-use-tool Changed · +2 / -2 lines
from line 253
253253 client = Anthropic::Client.new
254254
255255 response = client.messages.create(
256 model: "claude-opus-5-5",
256 model: Anthropic::Model::CLAUDE_OPUS_5_5,
257257 max_tokens: 1024,
258258 tools: [
259259 { type: "computer_toolset_20260801" },
from line 1323
13231323 continue;
13241324 }
13251325 if (failed) {
1326 // A batch stops at its first failure; answer later actions unexecuted
1326 // A batch stops at its first failure; answer later actions without running them
13271327 toolResults.push(computerResult(block.id, HALT_TEXT, true));
13281328 continue;
13291329 }
agents-and-tools/tool-use/define-tools Changed · +2 / -2 lines
from line 494
494494 client = Anthropic::Client.new
495495
496496 message = client.messages.create(
497 model: "claude-opus-5-5",
497 model: Anthropic::Model::CLAUDE_OPUS_5_5,
498498 max_tokens: 1024,
499499 tools: [
500500 {
from line 807
807807 client = Anthropic::Client.new
808808
809809 message = client.messages.create(
810 model: "claude-opus-5",
810 model: Anthropic::Model::CLAUDE_OPUS_5,
811811 max_tokens: 1024,
812812 tools: [
813813 {
agents-and-tools/tool-use/programmatic-tool-calling Changed · +1 / -1 lines
from line 1197
11971197 results[region] = sum(row["revenue"] for row in rows)
11981198
11991199# Process results programmatically
1200top_region = max(results.items(), key=lambda x: x[1])
1200top_region = max(results.items(), key=lambda item: item[1])
12011201print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
12021202```
12031203