Skip to content

Reference

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.

Alter’s Slack adapter requests Bot Token Scopes through Slack’s OAuth scope parameter and stores the resulting bot token (xoxb-... without token rotation, xoxe.xoxb-... with rotation). The end user approves the workspace installation, but API calls act as the Slack app bot — Alter does not request user_scope or use a user token for this provider.

PropertyValue
Provider IDslack
CategoryCommunication
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)
  • Do not add them only under User Token Scopes; Alter’s Slack consent URL requests bot scopes

Enable external workspace installation when needed

A newly created Slack app can only be installed in its associated development workspace. If users from other workspaces must authorize it, complete Slack’s distribution checklist and enable Manage Distribution → Activate Public Distribution. An unlisted distributed app is sufficient for private pilots; Slack Marketplace review is a separate publication step. See Slack’s app-distribution guide.

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

Slack opens directly in custom-credential mode. Enter:

  • 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:

With the default chat:write scope, first invite the Slack app to the destination channel with /invite @<your Slack app name>. A channel returned by conversations.list is not necessarily one the bot has joined. Select the broader chat:write.public scope only when the app should be able to post to any public channel without an invite.

chat:write.public depends on chat:write. The portal selects the prerequisite automatically and removes the dependent scope if the prerequisite is removed; the CLI and backend reject an invalid combination.

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:readBot token: list public channels; listing does not mean the bot has joined them
channels:historyView messages and other content in public channels
groups:readView basic information about private channels
im:readView basic information about direct messages
mpim:readView basic information about group direct messages
users:readView people in a workspace
users:read.emailView email addresses of people in this workspace
team:readView the name, email domain, and icon for workspaces
files:readView files shared in channels and conversations
reactions:readView emoji reactions in channels and conversations
app_mentions:readView messages that directly mention your app
ScopeDescription
chat:writeBot token: post only where the Slack app is already a member
chat:write.publicBot token: post in public channels without joining first; requires chat:write
chat:write.customizeBot token: send messages with a customized username and avatar; requires chat:write
channels:manageManage public channels and create new ones
channels:joinJoin public channels in a workspace
groups:writeManage private channels that your app has been added to
im:writeStart direct messages with people
mpim:writeStart group direct messages with people
files:writeUpload, edit, and delete files
reactions:writeAdd and remove emoji reactions
ScopeDescription
commandsAdd shortcuts and slash commands
incoming-webhookPost messages to specific channels 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-... without rotation, xoxe.xoxb-... with rotation). These act on behalf of the app, not the user.
  • Slack returns HTTP 200 for API-level failures. Always require ok: true; ok: false with error: "not_in_channel" means the bot must be invited or granted chat:write.public.
  • Non-rotation xoxb-... access tokens do not expire. Rotation xoxe.xoxb-... access tokens expire after 12 hours; 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.
  • See the Slack OAuth installation guide for details.

Alter policy rules can target these attested operations and families for operation-level and parameter-aware controls.

Operation IDFamiliesMethodProvider path
chat_postMessagesendPOST/api/chat.postMessage
chat_postEphemeralsendPOST/api/chat.postEphemeral
chat_scheduleMessagesendPOST/api/chat.scheduleMessage
chat_meMessagesendPOST/api/chat.meMessage
chat_updatewritePOST/api/chat.update
chat_deletedeletePOST/api/chat.delete
chat_deleteScheduledMessagedeletePOST/api/chat.deleteScheduledMessage
chat_getPermalinkreadGET/api/chat.getPermalink
chat_scheduledMessages_listreadGET/api/chat.scheduledMessages.list
conversations_createwritePOST/api/conversations.create
conversations_archivewritePOST/api/conversations.archive
conversations_renamewritePOST/api/conversations.rename
conversations_joinwritePOST/api/conversations.join
conversations_leavewritePOST/api/conversations.leave
conversations_openwritePOST/api/conversations.open
conversations_inviteadminPOST/api/conversations.invite
conversations_kickadminPOST/api/conversations.kick
conversations_listreadGET/api/conversations.list
conversations_historyreadGET/api/conversations.history
users_listreadGET/api/users.list
users_inforeadGET/api/users.info
users_lookupByEmailreadGET/api/users.lookupByEmail
files_uploadwritePOST/api/files.upload
files_deletedeletePOST/api/files.delete
reactions_addwritePOST/api/reactions.add
reactions_removewritePOST/api/reactions.remove
pins_addwritePOST/api/pins.add
pins_listreadGET/api/pins.list
search_messagesreadGET/api/search.messages
auth_testreadGET/api/auth.test
team_inforeadGET/api/team.info

Report an issue with this page

Necessary

Required for sign-in, security, authorization, and remembering your choices.

Always active

Analytics

Helps us understand which product and documentation features are useful.

Performance diagnostics

Uses performance tracing and privacy-masked session replay to diagnose problems.

You can change these choices at any time from Cookie settings.