Skip to main content
An agency owner connects once and the assistant can then read any sub-account in that agency. There is no separate key per client and no signing in and out. Two things make that work: a tool that lists your accounts, and seven tools that accept one of those ids.

1. Get the roster

subaccount_list returns your active sub-accounts — id, name, email, plan and state. Owner-only; any other role is refused. An account is listed when it is enabled and on a plan. Disabled, deleted and not-yet-subscribed accounts are left out, and the response says how many were.

2. Name the account

Seven tools take a userId. Pass one and they answer for that sub-account instead of yours: agent_duplicate is the only one that writes across accounts. It creates an agent inside the client’s account, so name the client and get a yes first.
Take the id from subaccount_list. Never construct or guess one — a wrong id does not fail quietly, it names a different account.

Records by id

Beyond those seven, any tool that takes a record id — campaignId, leadId, conversationId, linkedAccountId — also works on a sub-account’s records once you have the id. That includes writes such as campaign_update and flow_set, so an id is effectively full access to that record.

What is enforced, and where

Scoping is applied by the server, not hidden in an interface. Rephrasing a request does not widen it.
  • userId is accepted only from an agency owner key.
  • It is accepted only for an account inside your own agency. An id from outside your roster is refused with an error naming subaccount_list.
  • The sub-account list itself is scoped by the server to your own agency tree, and excludes you.
  • A record reached by id is checked against the accounts you own before it is read or written.
Client accounts keep their own keys for their own assistants. Connecting your agency key changes nothing about what a client can see.

Worth asking for

Because one key reaches the whole roster, the useful questions are the ones that span clients:
  • “Which client campaigns had the worst reply rate this week?”
  • “Any LinkedIn sessions expired across my accounts?”
  • “Which clients have no active campaigns right now?”
  • “Copy my qualifier agent into the Acme account.”
The assistant will need to call subaccount_list first to know who it is comparing. Ask it to tell you which account each number belongs to — the tools return data per account, not a labelled roll-up.
On the ChatGPT plugin this needs release 1.2.8 or later. Earlier releases ship a skill that predates subaccount_list, so ChatGPT does not know to ask for the roster first.