Managed connections to external services.
Overview
Credentials are managed connections to external services. Instead of manually copying tokens, you authenticate through OAuth or service-specific flows.
Available Credentials
Two options for Google services:
| Credential | Services | How it works |
|---|---|---|
| Service Account | Sheets, Docs, Drive | Share files with a dedicated email |
| OAuth | Gmail, Calendar, personal Drive | Sign in with your Google account |
Slack
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Messages, Channels, Events | Use your own Slack app |
Discord
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Messages, Servers, Bot Events | Use your own Discord bot |
X.com (Twitter)
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Tweets, Users, Timelines | Use your own X Developer app |
Google Cloud Platform
| Credential | Services | How it works |
|---|---|---|
| GCP (BYOK) | Vertex AI, BigQuery, Cloud Storage, Pub/Sub | Connect your own GCP project |
Microsoft 365
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Outlook, OneDrive, Teams, Calendar | Use your own Azure app registration |
Notion
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Pages, databases, workspace content | Use your own Notion integration |
Salesforce
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Leads, accounts, opportunities, cases | Use your own Salesforce connected app |
| Credential | Services | How it works |
|---|---|---|
| OAuth (BYOK) | Posts, comments, subreddits, messages | Use your own Reddit app |
Credential Types
| Type | Description | Example |
|---|---|---|
| OAuth | Sign in and authorize access | Google OAuth |
| OAuth (BYOK) | Use your own app credentials | Slack, Discord, X.com |
| Service Account | Dedicated email you share resources with | Google Service Account |
| Cloud (BYOK) | Connect your own cloud provider project | GCP Vertex AI, BigQuery |
Per-user vs team connections
Some OAuth providers use managed credentials configured by the platform (has_managed: true on GET /credentials/configs). The grant field on that config controls whether connections are shared or personal:
grant | Who connects | Button label |
|---|---|---|
| (omitted) | One OAuth account for the whole team | connect {name} |
credentials | Each team member connects their own account | connect your {name} account |
token | Platform provides ready-to-use access for the team | connect {name} |
When grant is credentials, your connection is scoped to you (scope: "user" in the API). Apps and agents run with your authorized account, not a shared team account. Other members must connect separately from Vault → credentials.
In the credentials list:
- Collapsed subtitle (connected) — account identifier with a (your account) suffix on user-scoped connections
- Expanded subtitle (connected) — your account — via team's {name} app (for example your account — via team's X app)
- Collapsed subtitle (not connected) — when the team has managed OAuth (
has_managed: truewithgrant: "credentials") but you have not connected yet, provided by your team — connect your account - Disconnect — user-scoped credentials use disconnect your account in the list card as well as on the detail page; the confirmation explains that disconnecting only affects your personal account
→ Credentials API — managed credentials and grant type
Credential scope
The Vault → credentials table has a scope column that shows who can use each connected credential:
| Workspace label | API scope | Meaning |
|---|---|---|
| only you | user | Only you can use this credential |
| team | team | Shared with everyone on this team |
| org | org | Shared with all teams in your organization |
| everyone | platform | Available to all teams on the platform |
Scope is chosen once, when the credential is created. The badge is read-only. To use a different scope, disconnect and reconnect.
Team admins, org admins, and platform admins get a scope choice:
- Clicking Connect on an OAuth provider opens a choose who can use this credential dialog with the options the role allows.
- Adding an API key shows a who can use it selector with the same options.
Other members connect with the provider's default scope: user for MCP servers and per-user OAuth (grant: "credentials"), team otherwise.
On the credential detail page, an inherited credential (org or platform scope) shows a managed by platform or managed by your organization banner. Disconnect is hidden because the team does not own it. When the provider config has allows_byok: true, the banner offers use your own key so the team can override the shared credential with its own.
→ Credentials API: connection scope
What is BYOK?
Bring Your Own Key (BYOK) means you create your own app/bot in the service's developer portal and use those credentials. This gives you:
- Isolated events — only receive events from your workspaces/servers
- Full control — configure permissions, webhooks, and triggers yourself
- Your rate limits — not shared with other users
- Custom branding — your bot name and avatar
- Your billing — for cloud providers like GCP, use your own quotas and billing
Security
| Feature | Benefit |
|---|---|
| Token encryption | OAuth tokens encrypted at rest |
| Auto-refresh | We handle token expiration |
| Granular permissions | Request only the scopes you need |
| Revocable | Disconnect anytime from Vault |
Using in Apps
Apps declare credential requirements:
1# inf.yml2credentials:3 - key: google.sheets4 description: Read sales data from Google Sheets56 - key: slack.channels.write7 description: Send notifications to Slack89 - key: gcp.vertex_ai10 description: Use Vertex AI models (Gemini, etc.)1112 - key: x.tweet.write13 description: Post automated updates14 optional: trueWhen you run the app:
- We check if you have the required credential connected
- If not, you'll be prompted to connect it
- Once connected, credentials are injected automatically
Connecting Credentials
Open Vaults in the workspace (/vaults), select the default vault, and open the credentials tab.
This tab manages OAuth, BYOK, and service-account credentials (Google, Slack, GCP, and similar). Team admins can click add credential to connect an OAuth account, save an API key, add an environment variable, or add an MCP server. MCP server opens the add dialog on /my/mcps?add=1. MCP servers are also listed on the workspace Mcps page (/my/mcps) and under Explore → MCP servers, and belt mcp connect <slug> connects one from the CLI. After you connect an MCP server, it appears in belt credentials list and on this page alongside catalog credentials (GET /credentials/configs returns the merged catalog and connection state, including connected MCP rows).
Standard OAuth (Google)
- Open the credential from the list, or go directly to its detail page (for example
/credentials/google) - Click Connect
- Complete the OAuth flow — you are redirected back to the detail page when authorization finishes
- Done!
From the CLI, belt credentials connect google starts the OAuth flow. Google Sheets/Docs/Drive also offers a service account connection — connect it from the workspace UI at /credentials/google-sa or with belt credentials connect google-sa.
BYOK Credentials (Slack, Discord, X.com)
- Create an app in the service's developer portal
- Configure OAuth redirect URLs and permissions
- Click Configure and enter your credentials
- Click Connect to authorize
- Done!
GCP WIF Credentials
- Configure Workload Identity Federation in your GCP project
- Create a service account with required permissions
- Click Configure and enter your project details
- Click Connect to verify
- Done!
See the GCP Setup Guide for detailed instructions.
Credential detail page
Each credential type has its own detail page at /credentials/{slug}. Open it from the credentials tab or link directly:
1https://app.inference.sh/credentials/google2https://app.inference.sh/credentials/google-sa3https://app.inference.sh/credentials/gcpUse the slug from GET /credentials/configs (for example google for Google OAuth, google-sa for the Sheets/Docs/Drive service account, gcp for GCP WIF/BYOK, slack for Slack). Provider names are globally unique — Google OAuth uses google, the managed service account uses google-sa, and GCP WIF uses gcp.
When not connected, the page shows setup steps and a connect button — connect your {name} account when the provider uses per-user managed OAuth (grant: "credentials", for example connect your X account), otherwise connect {name}.
When pending (awaiting connection), the detail page shows an awaiting connection badge and a banner prompting you to connect — for example when an agent needs the credential before it can run. Account details are hidden until OAuth or BYOK setup completes. The credentials list shows the same status badges (pending, expired, error) so you can spot broken connections without opening each provider.
When connected, the page shows:
- Scope badge — read-only label (only you, team, org, or everyone). See Credential scope.
- Account or your account — connected account identifier and display name. User-scoped connections (
scope: "user") use the your account heading; team-scoped connections use account. - Permissions — granted OAuth scopes
- Add permissions — request additional capabilities (redirects through OAuth re-authorization)
- Disconnect or disconnect your account — revoke the connection. User-scoped credentials use disconnect your account and confirm that disconnecting only affects your personal connection — other team members are not affected. Team-scoped credentials use disconnect and explain that access for the connected account will be revoked. Inherited platform or org credentials hide disconnect.
When expired or errored, if token refresh fails or credentials are revoked, the page shows a warning badge (expired or error) and a banner:
- Credentials expired — reconnect to restore access (refresh token missing or expired, for example after you revoked access in the provider's settings)
- Connection error — the platform could not refresh credentials (provider outage, invalid grant, or similar)
When the API returns an error_message, it appears in the banner. Click Reconnect to start the OAuth flow again — the same flow as Connect, with previously granted scopes included in the OAuth consent screen. Account info and permissions stay visible so you can see what was previously connected. Use Disconnect to remove the broken connection entirely.
Apps and agents that require an expired or errored credential fail at validation (POST /credentials/check or POST /run with HTTP 412) with a reconnect prompt — they do not run with empty credentials.
OAuth callbacks redirect to the detail page after authorization completes.
Use direct links in setup flows, emails, or custom UIs when you know which credential type a user needs to connect or manage. Look up slug from GET /credentials/configs. → Credentials API — check requirements
Next
→ Google Service Account
→ Google OAuth
→ Google Cloud Platform
→ Slack
→ Discord
→ X.com
→ Microsoft 365
→ Notion
→ Salesforce
→ Reddit