Agent customer model
Alice (Developer) adds Bruce (Business) as a customer for one of her agents with specific permissions and limits. Bruce reviews and approves the agent-customer relationship:payments.create- Create paymentspayments.read- Read payment statuswallets.read- Check wallet balancewallets.update- Modify wallet settingsparty.read- View party informationparty.update- Modify party details
Agent authentication
Agents authenticate via our SDKs using credentials the developer owns. There are two ways to establish agent identity:- Agent keys (
ak_ntl_…) — a credential bound to one agent. Requests resolve as that agent automatically. The same verified binding applies to agent-scoped MCP OAuth grants. - API keys (
sk_ntl_…) — a party credential for user/party actions. Prefer agent keys or agent-scoped OAuth for new agent integrations.
Instance ID required for agent money movement
Whenever a money-movement request is attributed to an agent — by agent key or agent-scoped OAuth grant — it must also carry aninstance_id (X-Instance-ID) for transaction observability. Agent-attributed money-movement requests without X-Instance-ID are rejected with a 400 error (missing_instance_id). Reads do not require an instance ID.
Agent instances
Aninstance_id is an identifier that groups related agent executions together. In other common frameworks like LangGraph or OpenAI Assistant API, this is represented by a thread_id. While Natural tracks every payment individually, an instance_id allows developers to correlate multiple actions belonging to the same logical workflow.
For example, if your agent processes a multi-step payment execution (outbound contractors → negotiate rates → send multiple payment), you can tag all actions with the same instance_id to view them as a single workflow in the audit trail.
Instances are developer-controlled. Developers should pass instance_id as an idempotent string to Natural that helps group their agent executions together.