personal audience so the boundary rules apply. Agent access setup writes the Session’s grants for you.
Before starting, have:
- A Workspace-bound
CHECKFU_API_KEYthat can administer grants (root or admin) for the one-time setup. - The person’s Principal (
prin_…) inCHECKFU_PRINCIPAL_ID. - An Agent (
agent_…) and its current version, using a Connection the person connected. - An Environment (
env_…) with no network access. A personal Session refuses an Environment that allows any host.
1. Set up access once
Agent access setup grants the personact_as on the Agent, and the Agent its Environment and harness. It works on the exact Agent version you name, which must be the current one. The examples use the TypeScript SDK:
{ dry_run: "true" } as the third argument to see which grants are present, missing or blocked without writing any. A blocked grant is refused by an ActionPolicy or is outside its time window; fix it before applying. Run setup again after a new Agent version; grants that already exist report present.
2. Create a personal Session
Name the person inacted_as and set audience to personal:
audience nor scope is still private to the person, but it gets none of the boundary rules below: allowed writes run without asking. The checkfu.launch helper cannot set an audience yet, so create the Session directly.
To narrow what the assistant can do, add a scope. For example, keep only the Connection tools that read and draft, or cap a refund amount.
A personal Session cannot hold sandbox network access, so creation answers policy.denied if the Environment allows any host. A FileTree mount that declares Git writeback is refused with validation.malformed. Built-in web_fetch and web_search stay only on the claude-code platform harness, where they ask before every call. Custom tools stay, and each call asks the person first.
3. Ask the person before a write leaves
When the assistant calls a Connection tool that writes, such as sending an email or updating a ticket, or calls a custom tool, the Run pauses onrun.requires_action with an action_approval. This happens on every call, even when an ActionPolicy allows the tool or a StandingApproval matches it. Calls that only read do not pause.
Only the person the Session acts as can approve. Show them the frozen action (see Handle an approval), then record their decision with acted_as set to them:
approve on the Connection, or on the Agent for a custom tool. A response from another person, a service, or an API key acting as itself is refused. The person can also answer in the Console. Once the write is approved, the destination’s own permissions and retention apply to what was written.
What this leaves out
- The person reading their own Session with their own Principal credential instead of your API key.
- Sharing with a team. A Session that acts as a person can only be
personal. AgroupSession is created by a root or admin key acting as itself. - Background work on a schedule. That is an Automation, which needs the person’s consent and current access when it runs.