Skip to content

OAuth providers

Slack

Set up Slack OAuth for messaging, channels, and workspace access

Connect your users to Slack workspaces for messaging, channel management, file sharing, and notifications.

PropertyValue
Provider IDslack
PKCENot supported
Token refreshAutomatic (rolling - new token each refresh)
Access token lifetime12 hours
Redirect URIShown in Developer Portal

Go to Slack API

Navigate to api.slack.com/apps and click Create New App.

Choose creation method

Select From scratch. Enter:

  • App Name: The application name (e.g., “My App Integration”)
  • Pick a workspace: Select a development workspace for testing
  • Click Create App

Get credentials

Go to Settings > Basic Information:

  • Scroll to App Credentials
  • Copy the Client ID and Client Secret

Configure OAuth redirect

Go to OAuth & Permissions in the sidebar:

  • Under Redirect URLs, click Add New Redirect URL
  • Copy the Redirect URI from the Developer Portal
  • Click Save URLs

Enable token rotation

Go to OAuth & Permissions:

  • Scroll to Token Rotation
  • Click Opt in to token rotation

This enables refresh tokens, which Alter Vault uses to automatically keep access tokens fresh.

Add bot scopes

Go to OAuth & Permissions:

  • Scroll to Scopes > Bot Token Scopes
  • Add the scopes the application needs (see Available Scopes below)

Open the Developer Portal

Go to portal.alterauth.com and navigate to the application.

Add Slack provider

Go to OAuth Providers > Add Provider > Slack.

Enter credentials

  • Client ID: Paste your Slack Client ID
  • Client Secret: Paste your Slack Client Secret

Select scopes

Choose the bot token scopes the application needs.

Save

Click Save. The provider is now active.

After a user connects via Alter Connect, use the returned grant_id to make API calls:

from alter_sdk import App, HttpMethod
async with App(
api_key="alter_key_...",
caller="my-agent",
) as alter_app:
response = await alter_app.request(
HttpMethod.POST,
"https://slack.com/api/chat.postMessage",
grant_id=grant_id,
json={"channel": "#general", "text": "Hello from Alter Vault!"},
)
data = response.json()
if data.get("ok"):
print("Message sent!")
else:
print(f"Error: {data.get('error')}")
ScopeDescription
channels:readView public channel info
channels:historyView messages in public channels
groups:readView private channel info
im:readView direct message info
mpim:readView group DM info
users:readView people in workspace
users:read.emailView email addresses of workspace members
team:readView workspace name, domain, and icon
files:readView files shared in channels
reactions:readView emoji reactions
app_mentions:readView messages mentioning the application
ScopeDescription
chat:writePost messages in approved channels
chat:write.publicPost to any public channel
chat:write.customizePost with custom username and avatar
channels:manageManage and create public channels
channels:joinJoin public channels
groups:writeManage private channels
im:writeStart direct messages
mpim:writeStart group DMs
files:writeUpload, edit, and delete files
reactions:writeAdd and remove emoji reactions
ScopeDescription
commandsAdd slash commands
incoming-webhookPost via incoming webhooks
Use CaseMethodURL
Send a messagePOSThttps://slack.com/api/chat.postMessage
List channelsGEThttps://slack.com/api/conversations.list
Get channel historyGEThttps://slack.com/api/conversations.history
List usersGEThttps://slack.com/api/users.list
Get file upload URLPOSThttps://slack.com/api/files.getUploadURLExternal
Complete file uploadPOSThttps://slack.com/api/files.completeUploadExternal
Add a reactionPOSThttps://slack.com/api/reactions.add
  • Slack uses bot tokens (xoxb-...) by default. These act on behalf of the app, not the user.
  • Access tokens expire every 12 hours. With token rotation enabled, Alter Vault automatically refreshes them using the rolling refresh token.
  • Slack scopes are comma-separated (unlike most providers which use spaces). Alter Vault handles this automatically.
  • The Slack API always returns HTTP 200, even on errors. Check the ok field in the response body to determine success or failure.