managed-agents-2026-04-01). Point the official Anthropic SDK (Python ≥ 2.3 or TypeScript ≥ 1.3) at BMA by setting base_url and using a BMA API key, and the capabilities listed below work. BMA is not a drop-in replacement: the unsupported list and the behavior differences below apply.
The rule BMA follows for requests: a field BMA cannot honor is rejected with 400 and an error.code that names it (usually unsupported or unsupported_session_override) instead of being accepted and ignored. The known exceptions are listed below until they are fixed.
Status as of BMA
main a3efd35 (deployed to the early-access environment on 2026-11-04), checked by the 2026-11-04 compatibility audit with the official anthropic Python SDK 2.4.0. Fixes for the gaps below are in progress; see the Roadmap. Items are removed from this page when the fix is deployed.Supported subset
Not supported
- Endpoints: Skills, Vaults (and credentials), Deployments and deployment runs, Dreams, Tunnels, User profiles,
GET /v1/agents/{id}/versions, session thread endpoints, session resource retrieve/update, memory store archive, memory versions. - Multi-agent orchestration and threads, outcomes (
user.define_outcome), budgets,self_hostedenvironments and theirworkqueue endpoints. github_repositorysession resources.- Agent history: retrieving or starting a session on an older agent version.
- Image and document content blocks in
user.message;system.message. user.custom_tool_result. Return custom tool results with the BMA extension eventuser.tool_resultinstead.- On create: session
metadata,vault_ids,budget; tool, skill and MCP overrides inagent_with_overrides(400 unsupported_session_override). Set sessionmetadatawith an update after create. - Agent fields: the
read,write,edit,globandgrepbuilt-in tools (accepted only withenabled: false; the agent works on files throughbash);web_fetch/web_searchoptionsallowed_domains,blocked_domains,max_content_tokens,url_sources,user_location; pinned skill versions andtype: "anthropic"skills;execution_identityother thanservice_account; anymultiagent. - Environment fields:
networking.type: "limited"(BMA cannot enforce an egress allowlist on its sandbox provider);cargo,gemandgopackages. created_at[…]filters on the event list (400).
400 and error.code = "unsupported". Paths outside the served endpoints (for example /v1/skills or /v1/vaults) return 404 with a plain {"error": "not found"} body instead of the Anthropic error envelope; the SDKs still raise their not-found error.
Known exceptions
These requests are currently ignored instead of rejected, until they are fixed:GET /v1/files?ids[]=…returns all files, not only the listed ids.include_archivedon the session list is ignored, and the list includes archived sessions by default.GET /v1/agents/{id}?version=Nreturns the current version.expires_in_secondson file upload is ignored when sent after the file part (rejected when sent before it).
Behavior differences
- IDs use BMA prefixes (
aprf_for agents,mpo_for environments,ses_for sessions). - Model ids are BMA model names.
- Tool events:
agent.tool_use.nameis the BMA tool name (for examplerun_commandinstead ofbash), and its input carriesmachine_id. MCP calls are reported asagent.tool_usewith the namemcp__<server>__<tool>, not asagent.mcp_tool_use. Custom tool calls are reported asagent.tool_use, not asagent.custom_tool_use. - Errors in a session:
session.errordoes not yet use the official error types:error.typeis"error"or"unknown_error",retry_statusisnull, and the turn ends withsession.status_idlestop_reason: {"type": "error"}instead ofretries_exhausted.error.codecarries the BMA detail (for examplecontext_too_large). - Session list: pagination is per agent, so with many sessions per agent a page can miss sessions; a hidden default session of each agent can appear in the list; without
orderthe list is not sorted newest first. - Event ids: a streaming preview has a different id from the final
agent.message, and theuser.messageid in the send response differs from the id in the stream and history. Useagent_input_idandbma_sequenceto correlate. - Usage is counted per BMA agent, so every session of the same agent reports the agent total.
- Agents: archive deletes the agent, so a later retrieve is
404. Changing onlydescriptionormetadatadoes not create a new version. Permission policyautobecomesalways_ask. - Environments: the list returns every environment on one page; the stored config is limited to 512 bytes.
- Sessions: delete archives instead of deleting (retrieve still returns the session with status
terminated). Machines start on the first tool call that needs one, not at session create, so chat-only sessions never hold a machine. Statusreschedulingmeans work is queued while the machine is provisioned, resumed or restored. - Session lifecycle events:
session.status_rescheduled,session.status_terminated,session.deleted,session.usage, span events andagent.thread_context_compactedare not emitted. - Memory stores: the store
nameis stored as a slug and storemetadatais not kept; a memory id changes when its path changes; the returnedmount_pathdoes not exist on the machine. - SSE: after the opening
: okcomment the stream sends no keepalive pings. - HTTP: no
request-idresponse header and norequest_idin errors; error bodies adderror.code; a malformed id returns400instead of404; no rate-limit orretry-afterheaders; an oversized body (over 8 MiB) is400, not413; an unknown route or wrong method is404, never405. - Sessions without a
titleget one generated after the first turn (session.updated).
How BMA maps the objects
Authentication and headers
Agents
descriptionandmetadataare stored (16 keys, key ≤ 64, value ≤ 512 characters).systemis optional;tools: []clears the toolset.- Built-in tools:
bashmaps to BMA’srun_command;web_fetchandweb_searchmap to BMA’s web tools. - Permission policies:
always_allowandalways_askmap directly;autobecomesalways_ask. - Skills:
{type: "custom", skill_id, version}withversionomitted or"latest"; BMA always runs the latest revision. - MCP: URL servers. BMA adds
mcp_servers[].bma_auth(bearer,oauth,sigv4) that references a project secret.
Sessions and events
- Stream start: a stream opened without
Last-Event-IDdelivers events emitted after it opens, like Anthropic. If you send first and subscribe second while a turn is running, the stream starts just before that turn’s input so you still get the whole turn. - Resume: durable events carry
bma_sequence(BMA extension). Resume history fromnext_pageand the stream withLast-Event-ID: <bma_sequence>or the opaqueidof the last durable frame.Last-Event-ID: 0replays the whole session. user.interruptstops only that session’s turn; the nextuser.messagecontinues the conversation.- See Machines for when machines start, pause and resume.
BMA extensions
All optional. A client that only implements the Anthropic contract can ignore them.
Typed helpers for these are in
bma-sdk; the schemas are in the API reference.