A boundary you never have to think about. It is built in, not agreed to.
Every other permission on a client’s workspace is a toggle they choose to flip. Credentials are not on that list, and never will be. This page shows how that limit is enforced end to end, and how to keep a client onboarding moving the moment you hit it.
What the client sees.
A client managing your access sees eight permission toggles and one card that is not a toggle at all.
The panel banner puts the same idea in one line: “Your reseller can only access the scopes enabled below · Credentials are always off-limits.” That is not a summary of the toggles below it, it is a separate statement about a separate thing.
That separateness is structural, not just written copy. The client’s nine delegated scopes are prompts_and_instructions, tools_and_integrations, skills, agent_memories, files, calendar_and_schedules, chat_history, audit_logs, and billing_summary. Credentials is not among them. It lives in its own hard-restrictions list, where the only recorded value for restricted is the literal true. There is no representable state in which credentials are unrestricted, because the type system never defined one.
Practically, this means a client can grant you every one of the eight toggles, including Files and Chat History, and the credentials line does not move. There is no combination of grants that adds up to visibility on a secret. Nothing you do inside a delegated session, and no setting a client flips, changes which card carries the HARD LIMIT badge.
Four layers, each one sufficient on its own.
This is not one check that a bug could slip past. It is four independent walls, stacked from the screen down to the database row.
Notice what none of these four layers depend on: your intent, your good behaviour, or a permission a client remembered to leave off. Each one holds on its own, which is the point. A bug in the interface layer would still leave the route rejecting the request. A bug in the route would still leave the service returning redacted metadata. A bug in the service would still leave the storage layer with nothing readable to return.
Why this is good for you.
A hard limit removes a whole category of liability from the reseller relationship. You cannot leak what you cannot see, and no breach on your end can ever expose a client’s API keys or tokens, because they never passed through your hands in the first place. That also means the client never has to weigh trust against convenience when they decide how much to delegate to you. They can hand you real, working access to configure their agents, apps, and schedules without a second thought about the one thing that actually keeps their other accounts safe.
It also simplifies your own pitch. When a prospective client asks how you’ll be managing their workspace, “I can configure almost everything, and I am structurally unable to see your API keys or tokens” is a sentence you can say once and never have to revisit.
The handoff.
There is no workaround for a locked control, and you shouldn’t want one. Here is the four-step move that keeps setup on track anyway.
Recognise the lock
Tell the client precisely which app and which action
Let them connect it themselves
Verify and carry on
What you can still do.
The hard limit is narrower than it sounds. Most of setting up a client’s tooling never touches a secret at all.
tools_and_integrations is granted.In the product’s own words, this is what tools_and_integrations grants and what it deliberately withholds:
“Manage the Apps section, including tools, MCP servers, and app connections that don’t require credentials. Installing credential-based apps, connecting OAuth apps, and disabling or modifying anything tied to API keys, OAuth tokens, or other secrets is always off-limits, regardless of this setting.”
tools_and_integrations scope descriptionMCP servers sit under the same tools_and_integrations grant as apps. For exactly what you can configure on an MCP server connection versus what waits on the client, treat the same credential boundary described here as the baseline, and check the MCP reference for the rest of that surface.
Can I just ask the client to paste me their key instead?
Can I just ask the client to paste me their key instead?
Does this change once I'm a certified reseller with every scope granted?
Does this change once I'm a certified reseller with every scope granted?
How secrets are stored.
You will never need this to do your job, but it’s worth knowing what actually backs the hard limit above.
Every secret is encrypted with AES-256-GCM under a data encryption key generated per client. That key is itself wrapped by Google Cloud KMS rather than kept in the database in the open, so a compromise of the application database alone does not expose usable secrets. The metadata table the Credentials Vault reads from to render its list has no ciphertext column at all, encrypted bytes live only in a separate table, reachable only through a machine-identity reveal path that checks which credentials that specific identity can use and logs the attempt whether it succeeds or not.
The vault stores four kinds of credential, and a stored credential can be bound to any of five things in a client’s workspace. You’ll recognise most of these by the app in front of them rather than the kind itself: a typical REST integration stores an api_key, an app that connects through a “Sign in with” flow stores a token, an API with an unusual auth header stores a header_secret, and a service-to-service or machine-to-machine integration stores client_credentials.
The Credentials Vault itself is a collapsible panel inside Settings, not a tab. Its own rules hold no matter who is looking at it, client or reseller:
- No reveal button for a stored value, ever.
- No copy-to-clipboard of a secret value.
- The eye toggle applies only to the field currently being typed into. It never fetches a value that was already saved.
- Delete is blocked whenever active bindings exist, so nobody can accidentally remove a credential an agent, skill, MCP server, or connection still relies on.
- OAuth-derived credentials show Reconnect instead of Rotate, because there is no user-holdable secret to paste back in.
Every action on a credential, create, rotate, revoke, disable, enable, reveal, a batch reveal, refresh, validate, registering or revoking a machine identity, and the pairing-code exchange, is written to an audit log with an outcome of success, denied, or error. A reveal attempt is logged whether it succeeds or is denied.
That audit trail is what makes the machine-identity reveal path safe to have at all. It exists so an agent, skill, or MCP server can actually use the secrets bound to it at runtime, and every one of those reads is checked against what that specific identity is allowed to reach, then logged, whether or not you or the client are anywhere in the loop at that moment.
Rotation and revocation.
These are client actions, not yours, but the client will ask you what happens next, so it’s worth knowing.
Rotating a credential creates a brand new secret version. It does not touch any binding, so every agent, skill, MCP server, or connection already pointed at that credential simply picks up the new version the next time it resolves the secret. Nothing needs to be rewired.
Revoking is different. It leaves every binding in place, pointed at a credential that no longer works. The agent, skill, MCP server, or connection that depended on it doesn’t fail silently or fall back to a stale value, it returns a clear error the next time it tries to use the dead credential.
An OAuth-derived credential doesn’t get revoked in quite the same way. When it expires, it flips to a “needs re-auth” state instead, and the client reconnects the same way they connected it the first time.
None of these three actions, rotate, revoke, or reconnect, are things you trigger from inside a delegated session. What you can do is recognise the symptom when it shows up: an agent or connection that was working suddenly returning an authorization error is very often a credential the client just rotated, revoked, or that quietly expired. Flag it to the client rather than assuming something you configured is broken.
Configure everything you can. Hand back only what you must.
The credential boundary is fixed so the rest of your access doesn’t have to be small.
Credentials are enforced at the interface, the route, the service, and the storage layer, all four independently.
No toggle grants it, no exception lifts it, and no support request changes that.