twin. Every route is per account (or per agent, which belongs to one account). Another account’s items answer 404; a key bound to another account gets 403 account_mismatch.
People
A person is linked to an account through its agents’ conversations. Only facts the account’s own agents learned are shown. If the same person also talks to another account’s agents (for example the same phone number),
PATCH answers 409 person_shared.
Inbox and approvals
The API key that approves is recorded as the actor. Payments are always held for approval.
Autonomy
GET / PUT /v1/agents/{id}/autonomy:
draft, ask, tell, limits. channel is email, sms, call, chat (every chat channel) or one chat channel; a person rule beats a channel rule. PUT replaces every rule. level is the agent’s autonomy.
Memory
At most 500 items per account. Passwords, payment details and government ids are refused. Changes reach the agents on their next sync (right away when the hosted runtime is up).
Webhooks
approval.requested, inbox.item.created and message.received are sent for the account of the agent they came from. See Webhooks.
MCP
A project key with theagents scope can open the MCP agents server at https://mcp.allternit.com/mcp (Authorization: Bearer alt_live_…). Keys bound to one account are refused there (403 account_bound_key) because that server lists every agent of the project.
For contributors
People, inbox and approvals live on the project’s hosted runtime and are relayed (cmd/allternit-api/src/platform_twin.rs). Autonomy rules (platform_agents.autonomy_rules) and memory (platform_memory) are kept in cloud-api (migration 076_platform_twin.sql) and sent to the runtime with the agent definition. Hosted agents don’t get the people_lookup / people_remember tools, since one runtime holds every account’s people.