Credentials can be shared with other users so their workflows can use your API keys. See Credentials for an overview and Credentials Tab for adding and managing credentials.
Sharing Model
- CredentialShare – Links
credential_idtouser_id(unique per pair) - Share by email –
POST /api/credentials/{credential_id}/shareswith email; user is looked up and added - Revoke –
DELETE /api/credentials/{credential_id}/shares/{user_id}
You can also share credentials with Teams:
- CredentialTeamShare – Links
credential_idtoteam_id; all team members gain access - Share with team –
POST /api/credentials/{credential_id}/team-shareswithteam_id - Revoke team share –
DELETE /api/credentials/{credential_id}/team-shares/{team_id}
Shared credentials show an indicator in the Credentials Tab UI.
Broad-Scope Credentials
Sharing a credential grants the recipient everything that credential can do. For most integrations that is scoped to one workspace or one API key's permissions, but some credentials are far broader.
Google Drive credentials grant full Drive access. The Google Drive credential is authorized with the
https://www.googleapis.com/auth/drivescope so the node can operate on files you already own. Sharing it with a user or a team gives every one of them the ability to read, modify, and permanently delete anything in your Google Drive through a workflow — not just the files you had in mind. Share it only with people you would give full Drive access to directly.
If you need to limit exposure, create a dedicated Google account with access to only the folders the workflow needs, and connect the credential with that account instead of your primary one.
Sharing with Workflow Collaborators
When you share a workflow, collaborators can open and run it but cannot use your credentials unless you share those credentials with them too. This applies to credentials in the main workflow and in any sub-workflows it calls. Share each credential with the same users or teams you invited to the workflow. Sub-workflows must also be shared separately from the child workflow's editor. See Workflow Organization.
Execution Context
When a workflow runs, credentials are resolved for the workflow owner (or current user when running). get_credentials_context() merges:
- Owned credentials –
Credential.owner_id == user_id - User-shared credentials –
CredentialSharewhereCredentialShare.user_id == user_id - Team-shared credentials –
CredentialTeamSharewhere the user is a member of the team
All are merged into a single context dict keyed by credential name.
Usage in Workflows
By Name (Expression DSL)
Credentials are exposed as $credentials.CredentialName in the Expression DSL. Use this for:
- HTTP nodes (Bearer/Header auth)
- Telegram nodes
- Slack nodes
- Notion bearer tokens in custom HTTP requests (internal token or OAuth access token)
- Any node that accepts expressions for auth
$credentials.MyBearerToken
$credentials.MyNotionWorkspaceBy ID (credentialId)
Some nodes store credentialId (UUID) in node.data:
| Node Type | Field | Description |
|---|---|---|
| LLM, Agent, RAG, Image Gen | credentialId | LLM API credential |
| Codex | credentialId, githubCredentialId | Codex access token credential and GitHub credential |
| OpenCode Go | credentialId, githubCredentialId | OpenCode Go gateway credential and GitHub credential |
| Jira | credentialId | Jira Cloud email/API token or Data Center username/password credential |
| Notion | credentialId | Notion internal token or OAuth workspace credential |
| Sentry | credentialId | Sentry auth token and optional base URL |
| Supabase | credentialId | Supabase project URL and API key |
| ClickHouse | credentialId | ClickHouse connection details (host, port, auth, database) |
| Telegram Trigger, Telegram | credentialId | Telegram bot credential |
| Discord Trigger, Discord | credentialId | Discord public key or webhook credential |
| Vector Store | credential_id | Qdrant or Postgres (pgvector) vector DB, via a Qdrant, Psql, or Custom Embeddings RAG credential |
| Evals | credential_id, judge_credential_id | Model credentials |
| Playwright AI step | credentialId | LLM/Vision model (for AI step and Auto Heal) |
The executor loads the credential directly from the database by ID and decrypts the config.
Output Masking
After execution, mask_sensitive_output() replaces credential values in outputs with placeholders so secrets are not exposed in results or traces.
Related
- Credentials Tab – Add and share credentials
- Third-Party Integrations – Detailed setup for each credential type
- Teams – Share with teams
- Expression DSL –
$credentialssyntax - Node Types – Nodes that use credentials (LLM, Agent, Codex, Jira, Linear, RAG, Playwright, HTTP, Notion, Sentry, Supabase, ClickHouse, Telegram, Telegram Trigger, Discord, Discord Trigger, Slack)
- Agent Node – Uses
credentialIdfor LLM