Two models follow.
Model A: one key per client (recommended)
An API key acts in the organization its creator belongs to at the time of each request, not in the one where it was created. When an account’s membership changes (it accepts an invitation, its join request is approved, it is removed or it leaves), its keys can start acting on another organization’s data, and data can move from one organization to another. The API does not report which organization a key acts in. There is no API to create organizations or keys. Provisioning happens in the app. Contact the Retriever team to automate it at scale. Set up one client at a time, from sign-up to the stored key, in a browser profile used only for that client, and open its verification email there:- Create an account for that client with an email and a password, on an address you control and use for that client only: a
gmail.comaddress, or a domain used only by your client accounts (not your agency’s own domain and not the client’s, where the app suggests joining existing teams). If sign-up fails for that address, use another one. - Finish or skip onboarding (the app opens Settings only after it), then create a key under Settings → API keys.
- With that key, call
GET /v1/workspaces. It must list nothing, or only the workspace that onboarding creates when you send its starter message. Anything else means you are signed in to another account: revoke the key and start again. - Create a workspace for that client with the key (
POST /v1/workspaces) and store itsidnext to the key. Do not delete that workspace in the app: it lets you check later that a new key was created by that client’s account. It does not show whether the organization changed, since the workspace moves with the account: step 7 of the departure procedure below covers that.
MCP · <client name>, where the name is the one the MCP app gives itself.
If a client account alone in its organization joins another one anyway, it takes part of the data with it (workspaces, runs, exclusion lists, company documents, signals). The rest does not follow: among other things the company brief, the CRM connection, service jobs and the credits left there are lost or can no longer be managed.
When someone who could sign in to a client account stops working on it, in this order:
- Take back their access to the account’s mailbox and to any Google account on that address.
- Reset the password with Forgot password on the sign-in page.
- Ask the Retriever team to end the sessions still open and to remove the Google sign-ins linked to the account: resetting the password does neither. Wait for the team’s confirmation, then 5 more minutes.
- Replace the key your integration uses, as above.
- Revoke every other key of the account, including the
MCP · …ones, then list the keys again: only the new one must be left. - Revoke the share links you no longer want: open each shared table, since there is no list of links (copies already made from a link stay, with every table of the workspace). Also check the CRM connection, scheduled runs and signals they set up.
- On the team page, check that the client account is the only member, that it is an admin, and that no invitation or join request is pending. Then check what the team page cannot show:
GET /v1/workspaces, through every page, must still include the workspace you stored for that client and list only workspaces you know (an unknown one can mean the organization has changed, or that someone created it from the account: find out which), and the credit balance and the company brief must be what you expect (they are lost when the account is moved to another organization). If anything differs, stop and contact the Retriever team.
429 only. To also retry 5xx and network errors safely, follow the rules of the shared Node client.
A compromised key exposes only one client, as long as no client account changes organization.
Model B: one key, one workspace per client
workspace_id: verify their parent table or run with the functions above.
Model B limits: know these before choosing it.
- Exclusions, credits and contact unsubscribes are shared across all your clients. One client’s customers on the exclusion list are excluded for every client, and so are their employees in people searches. One client’s unsubscribe blocks that contact for all of them.
- The organization’s company brief (the company description and ideal customer profile set in the app) and its company documents are shared: every
POST /v1/runsrun gets yours. Go jobs do not use them. - Messaging skills are shared.
- Email and phone answers found in the last 7 days are reused across the organization: a contact found for one client comes back, free, for another.
- Rate limits are shared: one active client can slow the others.
- Run slots are shared: your organization executes at most 5 runs at the same time by default, for all your clients together. One client’s batch of runs makes the other clients’ runs wait
queued. In model A, each client’s organization has its own 5 slots. See Runs per organization. GET /v1/runsandGET /v1/workspacesreturn resources for all your clients. Always filter byworkspace_id.
- Keep the key on your server. Your frontend calls your backend, never Retriever directly.
- Prefix
Idempotency-Keywith the tenant id. - Log
tenant_id+run_idto trace consumption.