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 5api/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