The twin layer is what an account’s agents know and what they are waiting on. Scope: 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:
Levels: 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 the agents 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.