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

One read of Claude Developer Platformapi-20260821T193729Z

5 pages moved out of 584 read.

Pages moved 5 significant first
Pages read 584 in this capture
Captured 19:37 UTC
Corpus hash 76d0a058fc7b corpus-hash

What this read moved

1-5 of 5

api/beta/sessions/list Changed · +255 / -43 lines

from line 369
369369 
370370 - `configs: array of BetaManagedAgentsAgentToolConfig`
371371 
372 - `enabled: boolean`
372 - `BetaManagedAgentsBashToolConfig object { enabled, name, permission_policy, type }`
373373 
374 - `name: "bash" or "edit" or "read" or 5 more`
374 Configuration for the bash tool.
375375 
376 Built-in agent tool identifier.
376 - `enabled: boolean`
377377 
378 - `"bash"`
378 - `name: "bash"`
379379 
380 - `"edit"`
380 - `"bash"`
381381 
382 - `"read"`
382 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
383383 
384 - `"write"`
384 Permission policy for tool execution.
385385 
386 - `"glob"`
386 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
387387 
388 - `"grep"`
388 Tool calls are automatically approved without user confirmation.
389389 
390 - `"web_fetch"`
390 - `type: "always_allow"`
391391 
392 - `"web_search"`
392 - `"always_allow"`
393393 
394 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
394 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
395395 
396 Permission policy for tool execution.
396 Tool calls require user confirmation before execution.
397397 
398 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
398 - `type: "always_ask"`
399399 
400 Tool calls are automatically approved without user confirmation.
400 - `"always_ask"`
401401 
402 - `type: "always_allow"`
402 - `type: "bash"`
403403 
404 - `"always_allow"`
404 - `"bash"`
405405 
406 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
406 - `BetaManagedAgentsEditToolConfig object { enabled, name, permission_policy, type }`
407407 
408 Tool calls require user confirmation before execution.
408 Configuration for the edit tool.
409409 
410 - `type: "always_ask"`
410 - `enabled: boolean`
411411 
412 - `"always_ask"`
412 - `name: "edit"`
413413 
414 - `"edit"`
415 
416 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
417 
418 Permission policy for tool execution.
419 
420 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
421 
422 Tool calls are automatically approved without user confirmation.
423 
424 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
425 
426 Tool calls require user confirmation before execution.
427 
428 - `type: "edit"`
429 
430 - `"edit"`
431 
432 - `BetaManagedAgentsReadToolConfig object { enabled, name, permission_policy, type }`
433 
434 Configuration for the read tool.
435 
436 - `enabled: boolean`
437 
438 - `name: "read"`
439 
440 - `"read"`
441 
442 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
443 
444 Permission policy for tool execution.
445 
446 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
447 
448 Tool calls are automatically approved without user confirmation.
449 
450 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
451 
452 Tool calls require user confirmation before execution.
453 
454 - `type: "read"`
455 
456 - `"read"`
457 
458 - `BetaManagedAgentsWriteToolConfig object { enabled, name, permission_policy, type }`
459 
460 Configuration for the write tool.
461 
462 - `enabled: boolean`
463 
464 - `name: "write"`
465 
466 - `"write"`
467 
468 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
469 
470 Permission policy for tool execution.
471 
472 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
473 
474 Tool calls are automatically approved without user confirmation.
475 
476 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
477 
478 Tool calls require user confirmation before execution.
479 
480 - `type: "write"`
481 
482 - `"write"`
483 
484 - `BetaManagedAgentsGlobToolConfig object { enabled, name, permission_policy, type }`
485 
486 Configuration for the glob tool.
487 
488 - `enabled: boolean`
489 
490 - `name: "glob"`
491 
492 - `"glob"`
493 
494 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
495 
496 Permission policy for tool execution.
497 
498 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
499 
500 Tool calls are automatically approved without user confirmation.
501 
502 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
503 
504 Tool calls require user confirmation before execution.
505 
506 - `type: "glob"`
507 
508 - `"glob"`
509 
510 - `BetaManagedAgentsGrepToolConfig object { enabled, name, permission_policy, type }`
511 
512 Configuration for the grep tool.
513 
514 - `enabled: boolean`
515 
516 - `name: "grep"`
517 
518 - `"grep"`
519 
520 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
521 
522 Permission policy for tool execution.
523 
524 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
525 
526 Tool calls are automatically approved without user confirmation.
527 
528 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
529 
530 Tool calls require user confirmation before execution.
531 
532 - `type: "grep"`
533 
534 - `"grep"`
535 
536 - `BetaManagedAgentsWebFetchToolConfig object { enabled, name, permission_policy, 4 more }`
537 
538 Configuration for the web_fetch tool.
539 
540 - `enabled: boolean`
541 
542 - `name: "web_fetch"`
543 
544 - `"web_fetch"`
545 
546 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
547 
548 Permission policy for tool execution.
549 
550 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
551 
552 Tool calls are automatically approved without user confirmation.
553 
554 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
555 
556 Tool calls require user confirmation before execution.
557 
558 - `type: "web_fetch"`
559 
560 - `"web_fetch"`
561 
562 - `allowed_domains: optional array of string`
563 
564 - `blocked_domains: optional array of string`
565 
566 - `max_content_tokens: optional number or null`
567 
568 - `BetaManagedAgentsWebSearchToolConfig object { enabled, name, permission_policy, 4 more }`
569 
570 Configuration for the web_search tool.
571 
572 - `enabled: boolean`
573 
574 - `name: "web_search"`
575 
576 - `"web_search"`
577 
578 - `permission_policy: BetaManagedAgentsAlwaysAllowPolicy or BetaManagedAgentsAlwaysAskPolicy`
579 
580 Permission policy for tool execution.
581 
582 - `BetaManagedAgentsAlwaysAllowPolicy object { type }`
583 
584 Tool calls are automatically approved without user confirmation.
585 
586 - `BetaManagedAgentsAlwaysAskPolicy object { type }`
587 
588 Tool calls require user confirmation before execution.
589 
590 - `type: "web_search"`
591 
592 - `"web_search"`
593 
594 - `allowed_domains: optional array of string`
595 
596 - `blocked_domains: optional array of string`
597 
598 - `user_location: optional BetaManagedAgentsUserLocation or null`
599 
600 Approximate user location for search result localization.
601 
602 - `type: "approximate"`
603 
604 Location precision. Only "approximate" is supported.
605 
606 - `"approximate"`
607 
608 - `city: optional string or null`
609 
610 City name.
611 
612 - `country: optional string or null`
613 
614 Two-letter ISO 3166-1 country code, uppercase.
615 
616 - `region: optional string or null`
617 
618 Region or state name.
619 
620 - `timezone: optional string or null`
621 
622 IANA timezone identifier, e.g. "America/Los_Angeles".
623 
414624 - `default_config: BetaManagedAgentsAgentToolsetDefaultConfig`
415625 
416626 Resolved default configuration for agent tools.
from line 1098
8881098 "name": "bash",
8891099 "permission_policy": {
8901100 "type": "always_allow"
891 }
1101 },
1102 "type": "bash"
8921103 }
8931104 ],
8941105 "default_config": {
from line 1139
9281139 "name": "bash",
9291140 "permission_policy": {
9301141 "type": "always_allow"
931 }
1142 },
1143 "type": "bash"
9321144 }
9331145 ],
9341146 "default_config": {

managed-agents/self-hosted-sandboxes Changed · +26 / -20 lines

from line 241
241241 `ant beta:worker poll` claims work items assigned to the environment, downloads skills, executes tool calls in the working directory, and posts results back. It reads `ANTHROPIC_ENVIRONMENT_KEY` and `ANTHROPIC_ENVIRONMENT_ID` from the environment.
242242 
243243 ```bash
244 ant beta:worker poll \
245 --workdir "/workspace"
244 ant beta:worker poll --workdir "/workspace"
246245 ```
247246 
248247 The worker exits cleanly on SIGTERM or SIGINT: it cancels any in-flight tool call, posts its error result, and releases the work item before stopping.
from line 280
281280 Start the poller pointing at the script:
282281 
283282 ```bash
284 ant beta:worker poll \
285 --on-work ./spawn.sh
283 ant beta:worker poll --on-work ./spawn.sh
286284 ```
287285 </Step>
288286 </Steps>
from line 425
427425 ```python Python
428426 import asyncio
429427 import os
430 import signal
431428 import anthropic
432429 import standardwebhooks # installed by the anthropic[webhooks] extra
433430 
from line 433
436433 client = anthropic.AsyncAnthropic(
437434 auth_token=environment_key,
438435 )
439 # Cancelled on SIGINT or SIGTERM (wired in handle) so an in-flight work item can upload
440 # changed memory files and remove its store directories before the process exits.
436 # Cancelled by shutdown() so an in-flight work item can upload changed memory files and
437 # remove its store directories before the process exits.
441438 inflight: set[asyncio.Task[None]] = set()
442439 
443440 
444 def cancel_inflight() -> None:
441 # Await this from the host's shutdown hook, such as an ASGI lifespan shutdown (the code after
442 # `yield` in a FastAPI lifespan), which uvicorn runs on SIGTERM. uvicorn lets open requests
443 # finish before that hook runs, so set --timeout-graceful-shutdown to bound the wait.
444 async def shutdown() -> None:
445445 for task in inflight:
446446 task.cancel()
447 await asyncio.gather(*inflight, return_exceptions=True)
447448 
448449 
449450 async def handle(raw: bytes, headers: dict[str, str]) -> tuple[dict[str, str], int]:
from line 454
453454 return {"error": "signature verification failed"}, 401
454455 if event.data.type != "session.status_run_started":
455456 return {"status": "ignored"}, 200
456 loop = asyncio.get_running_loop()
457 for signum in (signal.SIGINT, signal.SIGTERM):
458 loop.add_signal_handler(signum, cancel_inflight)
459457 task = asyncio.create_task(run_queued_work())
460458 inflight.add(task)
461459 task.add_done_callback(inflight.discard)
462460 try:
463 await task
461 # Shielded: a dropped or timed-out delivery must not cancel the item; shutdown() does.
462 await asyncio.shield(task)
464463 except asyncio.CancelledError:
465464 return {"status": "shutting down"}, 503
466465 return {"status": "ok"}, 200
from line 492
493492 const client = new Anthropic({
494493 authToken: environmentKey
495494 });
496 // Aborted on SIGINT or SIGTERM so an in-flight work item can upload changed memory
497 // files and remove its store directories before the process exits.
498 const shutdown = new AbortController();
499 process.once("SIGINT", () => shutdown.abort());
500 process.once("SIGTERM", () => shutdown.abort());
495 // Call shutdown.abort() from the host's SIGTERM/SIGINT handler, alongside closing the server,
496 // then wait for in-flight handle() calls before exiting: the abort lets a running work item
497 // upload changed memory files and remove its store directories first.
498 export const shutdown = new AbortController();
501499 
502500 export async function handle(req: Request): Promise<Response> {
501 // Never acknowledge a delivery whose work will not run here; a 503 makes the sender retry.
502 if (shutdown.signal.aborted) {
503 return Response.json({ status: "shutting down" }, { status: 503 });
504 }
503505 const body = await req.text();
504506 let event;
505507 try {
from line 532
530532 signal: shutdown.signal
531533 });
532534 }
535 // The poller and handleItem return quietly on abort, so a drain cut short lands here.
536 if (shutdown.signal.aborted) {
537 return Response.json({ status: "shutting down" }, { status: 503 });
538 }
533539 return Response.json({ status: "ok" });
534540 }
535541 ```
from line 691
685691 * `drain`: whether to stop polling once the queue is empty rather than waiting for new work.
686692 * `block_ms`: how long to wait for work to arrive before returning, in milliseconds. Must be between 1 and 999 (per-poll wait; the helper re-polls automatically). Pass `null` (`None` in Python, `param.Null[int64]()` in Go) for a non-blocking check; omitting the parameter uses the default 999 ms long-poll.
687693 * `reclaim_older_than_ms`: re-claim work items that were claimed but never acknowledged within this many milliseconds.
688 * `auto_stop` (`autoStop` in TypeScript, `AutoStop` in Go): whether to post a stop signal for each work item once your loop body finishes with it. Turn it off when the process you launch for the session, rather than the loop body, runs the work item to completion.
694 * `auto_stop` (`autoStop` in TypeScript, `AutoStop` in Go): whether to post a stop signal for each work item once your loop body finishes with it. Turn it off whenever whatever runs the work item posts the stop itself: `handle_item()` does, so set it to false when you hand claimed items to `handle_item()` as the webhook handlers on this page do, and so does a sandbox you launch that owns the stop call.
689695 
690696* **`client.beta.sessions.events.tool_runner()`:** runs tool calls for a single session, given the session ID and a tool list. Use when you've already claimed the work and only need the execution layer.
691697 
from line 1156
11501156Do not create the per-store directories yourself. The worker creates each store's `mount_path` directory (for example, `/mnt/memory/user-preferences`) when a session starts, refuses to start the session's work if something already exists at that path, and removes the directory when the session ends. Two operating rules follow:
11511157 
11521158* **Run one session per filesystem when sessions attach the same store.** Two sessions cannot mount the same store on one host at the same time, because both need the same path. Giving each session its own sandbox, as described in [Run one sandbox per session](https://platform.claude.com/docs/en/managed-agents/self-hosted-sandboxes#run-one-sandbox-per-session), satisfies this rule.
1153* **Stop workers gracefully.** When you stop a worker while a session runs, `EnvironmentWorker` uploads the session's changed memory files and removes its store directories only if it is cancelled rather than killed: a killed process runs no teardown, and the worker does not install signal handlers itself. Wire SIGTERM and SIGINT to cancellation in the process that runs it: abort the `signal` you pass to the worker in TypeScript, cancel the context in Go, and in Python cancel the task that runs `run()` or `handle_item()` from a signal handler. Then stop workers with SIGTERM and give them at least 30 seconds to exit before any hard kill, because the final upload can take that long. If a worker is killed before its teardown runs, remove the leftover store directory under `/mnt/memory/` before the next session that attaches that store; any edits in it that had not synced are lost.
1159* **Stop workers gracefully.** When you stop a worker while a session runs, `EnvironmentWorker` uploads the session's changed memory files and removes its store directories only if it is cancelled rather than killed: a killed process runs no teardown, and the worker does not install signal handlers itself. Wire SIGTERM and SIGINT to cancellation in the process that runs it: abort the `signal` you pass to the worker in TypeScript, cancel the context in Go, and in Python cancel the task that runs `run()` or `handle_item()`. Do that from a signal handler when your worker is the process, as the standalone workers on this page do, or from your server's own shutdown hook when the worker runs inside a webhook handler, which must not take over the server's signals. Then stop workers with SIGTERM and give them at least 30 seconds to exit before any hard kill, because the final upload can take that long. If a worker is killed before its teardown runs, remove the leftover store directory under `/mnt/memory/` before the next session that attaches that store; any edits in it that had not synced are lost.
11541160 
11551161### Run one sandbox per session
11561162 
from line 1348
13421348 
13431349### Read-only stores and conflicts
13441350 
1345For a store attached with `access: "read_only"`, the `write` and `edit` tools refuse to change files inside its directory, and the worker never uploads anything from it. Changes made through `bash` are not blocked locally: they are never synced to the store, and the next remote change to that memory overwrites them. If you need the local copy itself to stay unchanged during the session, disable the `bash` tool for that agent; do not mount the store path read-only, because the worker itself must create the directory and write the downloaded memories into it.
1351For a store attached with `access: "read_only"`, the `write` and `edit` tools refuse to change files inside its directory, and the worker never uploads anything from it. Changes made through `bash`, or through a custom tool or MCP server you serve from the sandbox, are not blocked locally: they are never synced to the store, and the next remote change to that memory overwrites them. If you need the local copy itself to stay unchanged during the session, disable the `bash` tool for that agent and give it no custom tool that writes to the sandbox's filesystem; do not mount the store path read-only, because the worker itself must create the directory and write the downloaded memories into it.
13461352 
13471353Conflicts resolve in favor of the store. When the agent changes a memory file that also changed in the store since the session last synced it, the worker keeps the store's version at the next sync, overwrites the local file with it, and logs a warning; the `write` and `edit` tools themselves succeed and no error reaches the agent. If the agent's change still applies, it can re-read the file after the sync and make the change again.
13481354 

managed-agents/skills Changed · +6 / -8 lines

from line 32
3232 ```
3333 
3434 ```bash CLI
35 ant skills create \
36 --file example_skill.zip
35 ant skills create --file example_skill.zip
3736 ```
3837 
3938 ```python Python
from line 148
149148 ```
150149 
151150 ```php PHP
152 // The PHP SDK exposes the Skills API under the beta namespace; field names can differ from other SDKs.
153151 use Anthropic\Client;
154152 use Anthropic\Core\FileParam;
155153 
156154 $client = new Client();
157155 
158 $skill = $client->beta->skills->create(
156 $skill = $client->skills->create(
159157 files: [
160 FileParam::fromResource(fopen('example_skill.zip', 'r'))
158 FileParam::fromResource(fopen('example_skill.zip', 'r')),
161159 ],
162160 );
163161 
164162 echo "Created skill: {$skill->id}\n";
165 echo "Latest version: {$skill->latestVersion}\n";
163 echo "Latest version: {$skill->latestVersionID}\n";
166164 ```
167165 
168166 ```ruby Ruby
from line 347
349347 model: 'claude-opus-5',
350348 system: 'You are a financial analysis agent.',
351349 skills: [
352 ['type' => 'anthropic', 'skill_id' => 'xlsx'],
353 ['type' => 'custom', 'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv', 'version' => 'latest'],
350 ['type' => 'anthropic', 'skillID' => 'xlsx'],
351 ['type' => 'custom', 'skillID' => 'skill_01AbCdEfGhIjKlMnOpQrStUv', 'version' => 'latest'],
354352 ],
355353 );
356354 ```

api/admin/analytics/chat_projects Changed · +1 / -1 lines

from line 138
138138```http
139139curl https://api.anthropic.com/v1/organizations/analytics/apps/chat/projects \
140140 -H 'anthropic-version: 2023-06-01' \
141 -H "Authorization: Bearer $ANTHROPIC_OAUTH_TOKEN"
141 -H "X-Api-Key: $ANTHROPIC_ADMIN_API_KEY"
142142```
143143 
144144#### Response

manage-claude/app-attest Changed · +1 / -1 lines

from line 6
66 
77App Attest authenticates iOS and macOS apps that call the Claude API directly from the device, with usage billed to your workspace. This page explains how App Attest works, how to register your app in the Claude Console, and how to revoke an app integration.
88 
9Apps use App Attest through the [Claude for Foundation Models](https://github.com/anthropics/ClaudeForFoundationModels) Swift package, which is in beta: it requires the OS 27 betas, and APIs might change before general availability. For the Swift configuration, see [Apple Foundation Models](https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models#app-attest-production).
9Apps use App Attest through the [Claude for Foundation Models](https://github.com/anthropics/ClaudeForFoundationModels) Swift package, which is in beta: it requires the OS 27 betas, and APIs might change during the beta. For the Swift configuration, see [Apple Foundation Models](https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models#app-attest-production).
1010 
1111## How App Attest works
1212 
Feedback