Skip to main content
Problem: your product serves multiple end customers. Their data must never mix. What an API key can see: Two models follow. 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:
  1. 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.com address, 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.
  2. Finish or skip onboarding (the app opens Settings only after it), then create a key under Settings → API keys.
  3. 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.
  4. Create a workspace for that client with the key (POST /v1/workspaces) and store its id next 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.
Connecting an MCP client through OAuth (such as Claude) also creates a key on the account signed in to that browser, listed under Settings → API keys as MCP · <client name>, where the name is the one the MCP app gives itself.
Rules for client accounts:
  • Never change the membership of a client account. Never invite an account into a client organization, never accept an invitation or send a join request from one, never approve a join request into one, and never remove a client account from its organization or have it leave. If the app offers a client account to join a team, do not accept, whatever the team is called: anyone can send an invitation and choose that name.
  • The app works as one account at a time per browser: after you sign in to another account in another tab, every open tab acts as that account, even a tab that still shows the previous one. Use one browser profile per client account, or sign out before switching. Sign out of a client account when you are done, and do not browse other sites while signed in as it.
  • Never send a message from the page of a shared table while signed out: the next account that opens the app in that browser within the hour gets a copy of the whole shared workspace (all its tables and how they were built) and of the conversation.
  • When you connect an MCP client, check the account shown on the consent page. If it is the wrong one, sign out of the app and start the connection again.
  • Before you store a replacement key, check it (step 3 above checks the first one): GET /v1/workspaces/{id}/tables with the workspace id you stored for that client and the new key must answer 200. On 404, do not store the key: revoke it and check which account you are signed in as. If it is the right account, the workspace was deleted or the organization changed: contact the Retriever team. A workspace name is not enough, since any account can create a workspace with that name.
  • To replace a client’s key, sign in as that client’s account, create the new key under Settings → API keys, check it as above, put it in your integration, then revoke the old one on the same page. A key created by any other account acts in that account’s organization, not the client’s. Only the account that created a key can see or revoke it.
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:
  1. Take back their access to the account’s mailbox and to any Google account on that address.
  2. Reset the password with Forgot password on the sign-in page.
  3. 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.
  4. Replace the key your integration uses, as above.
  5. Revoke every other key of the account, including the MCP · … ones, then list the keys again: only the new one must be left.
  6. 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.
  7. 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.
Store each key encrypted next to its tenant. Resolve it on every request, never in a shared global variable.
This client retries 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

Frozen rows and tables have no 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/runs run 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/runs and GET /v1/workspaces return resources for all your clients. Always filter by workspace_id.
In both models
  • Keep the key on your server. Your frontend calls your backend, never Retriever directly.
  • Prefix Idempotency-Key with the tenant id.
  • Log tenant_id + run_id to trace consumption.