The controls you own
Your policy is enforced by the platform, not just requested in the prompt. You have four layers, each acting at a different point:
A subscriber can tighten your rules for their own instance but never loosen
them, and every tool — built-in, custom, MCP, connector, OpenAPI, or skill —
passes through the same guards. For conversation-level control, your agent can
escalate to a human, and you can take over a live conversation from the
Inbox — see
Multi-agent orchestration.
Sandboxed code
Every piece of code you author — custom code tools, event actions, per-goal Goal Checks, and event pre-processors — runs in an isolated sandbox, never inside the platform. The built-inexecute_code tool
runs there too.
Your code has no access to platform environment variables and no access to the
platform filesystem.
Your code reaches built-in tools only through the
ctx bridge, and every call it makes goes through the same
guards, billing, and logging as the model’s own tool calls. On public pages,
embed blocks render inside sandboxed frames and uploaded SVG images are served
isolated with scripts disabled.
Spend limits
Spend is bounded at every level, so no single runaway loop or hostile user can drain an account:
Underneath every limit, your balance is the floor: a turn that runs out of
credits stops rather than continuing to spend.
Platform protections
Underneath your controls, the platform protects your agent automatically:- Inbound screening. Incoming messages are screened for prompt-injection and probing before your agent acts on them, and a hostile visitor learns nothing about what was detected.
- Untrusted content is framed. Retrieved passages, ingested documents, and uploaded files are clearly marked as data, not instructions, and anything your agent is about to remember is screened first — so a poisoned document can’t hijack your agent.
- Prompt-leak protection. Your agent’s output is screened so it doesn’t disclose its own configured prompt to a user.
- Abuse and cost protection. The platform blocks probing traffic at the edge and caps abusive usage before it reaches your account.
Isolation
- Per-agent data isolation. Each agent’s data is fully separated from every other agent and account.
- Per-contact memory. A subscriber’s visitors’ memories are private from the owner — a real boundary, not a hidden view. See User memory.
- Team roles. Collaborator grants carry per-area view/edit permissions, and anything without an explicit grant stays owner-only. Collaborator actions bill to the owner.
- Machine access. Management MCP keys are account-scoped and owner-only; per-agent API keys are scoped to their agent.
- Separate surfaces. The web app, public API, MCP, A2A, and management surfaces are served separately and don’t cross over.
Audit trails
- Activity log — one record per billable operation, with cost line items and source attribution. Message content is kept separately and reachable from the record.
- Conversation records — the full per-turn detail on the Monitoring and Conversations pages. See Observability and debugging.
- Your own audit events — your sandboxed code can record structured audit
events with
ctx.audit(event, data).