Legacy OAuth scopes
OAuth scopes let you specify exactly how your app needs to access a Slack user's account. As an app developer, you specify your desired scopes in the initial OAuth authorization request. When a user is responding to your OAuth request, the requested scopes will be displayed to them when they are asked to approve your request.
Slack's system of OAuth permission scopes governs usage of Slack apps and their use of the Web API, Events API, RTM API, Slash Commands, and incoming webhooks.
Types of Scopes
Slack uses scopes that refer to the object they grant access to, followed by the class of actions on that object they allow (e.g. file:write
). Additionally, some scopes have an optional perspective which is either user
, bot
, or admin
, which influences how the action appears in Slack (e.g. chat:write:user
will send a message from the authorizing user as opposed to your app).
The list of objects includes files
, search
, chat
, and reactions
, along with many other objects in Slack.
There are currently only three classes of action:
- read: Reading the full information about a single resource.
- write: Modifying the resource in any way e.g. creating, editing, or deleting.
- history: Accessing the message archive of channels, DMs, or private channels.
For example, to request access to the list of channels on a workspace and the ability to send messages to those channels as a bot, your app would request channels:read chat:write:bot
.
OAuth Scopes to API methods
admin.apps.approved.list
admin.apps.config.lookup
admin.apps.requests.list
admin.apps.restricted.list
admin.apps.approve
admin.apps.clearResolution
admin.apps.config.set
admin.apps.requests.cancel
admin.apps.restrict
admin.apps.uninstall
admin.conversations:manage_objects
admin.conversations.createForObjects
admin.conversations.linkObjects
admin.conversations.unlinkObjects
admin.conversations.ekm.listOriginalConnectedChannelInfo
admin.conversations.getConversationPrefs
admin.conversations.getCustomRetention
admin.conversations.getTeams
admin.conversations.lookup
admin.conversations.restrictAccess.listGroups
admin.conversations.search
admin.conversations.archive
admin.conversations.bulkArchive
admin.conversations.bulkDelete
admin.conversations.bulkMove
admin.conversations.convertToPrivate
admin.conversations.convertToPublic
admin.conversations.create
admin.conversations.delete
admin.conversations.disconnectShared
admin.conversations.invite
admin.conversations.removeCustomRetention
admin.conversations.rename
admin.conversations.restrictAccess.addGroup
admin.conversations.restrictAccess.removeGroup
admin.conversations.setConversationPrefs
admin.conversations.setCustomRetention
admin.conversations.setTeams
admin.conversations.unarchive
admin.emoji.list
admin.teams.admins.list
admin.teams.list
admin.teams.owners.list
admin.teams.settings.info
admin.emoji.add
admin.emoji.addAlias
admin.emoji.remove
admin.emoji.rename
admin.teams.create
admin.teams.settings.setDefaultChannels
admin.teams.settings.setDescription
admin.teams.settings.setDiscoverability
admin.teams.settings.setIcon
admin.teams.settings.setName
admin.usergroups.addTeams
admin.auth.policy.getEntities
admin.users.list
admin.users.session.getSettings
admin.users.session.list
admin.users.unsupportedVersions.export
admin.auth.policy.assignEntities
admin.auth.policy.removeEntities
admin.users.assign
admin.users.invite
admin.users.remove
admin.users.session.clearSettings
admin.users.session.invalidate
admin.users.session.reset
admin.users.session.resetBulk
admin.users.session.setSettings
admin.users.setAdmin
admin.users.setExpiration
admin.users.setOwner
admin.users.setRegular
admin.functions.list
admin.functions.permissions.lookup
admin.workflows.permissions.lookup
admin.workflows.search
admin.functions.permissions.set
admin.workflows.collaborators.add
admin.workflows.collaborators.remove
admin.workflows.unpublish
apps.manifest.create
apps.manifest.delete
apps.manifest.update
apps.manifest.validate
functions.distributions.permissions.add
functions.distributions.permissions.remove
functions.distributions.permissions.set
bookmarks.add
bookmarks.edit
bookmarks.remove
workflows.featured.add
workflows.featured.remove
workflows.featured.set
canvases.access.delete
canvases.access.set
canvases.create
canvases.delete
canvases.edit
conversations.canvases.create
conversations.archive
conversations.close
conversations.create
conversations.externalInvitePermissions.set
conversations.invite
conversations.join
conversations.kick
conversations.leave
conversations.mark
conversations.open
conversations.rename
conversations.setPurpose
conversations.setTopic
conversations.unarchive
team.externalTeams.disconnect
chat.delete
chat.deleteScheduledMessage
chat.meMessage
chat.postEphemeral
chat.postMessage
chat.scheduleMessage
chat.update
apps.datastore.bulkDelete
apps.datastore.bulkPut
apps.datastore.delete
apps.datastore.put
apps.datastore.update
files.comments.delete
files.completeUploadExternal
files.delete
files.getUploadURLExternal
files.revokePublicURL
files.sharedPublicURL
files.upload
conversations.archive
conversations.close
conversations.create
conversations.externalInvitePermissions.set
conversations.invite
conversations.kick
conversations.leave
conversations.mark
conversations.open
conversations.rename
conversations.setPurpose
conversations.setTopic
conversations.unarchive
team.externalTeams.disconnect
conversations.archive
conversations.close
conversations.create
conversations.externalInvitePermissions.set
conversations.invite
conversations.kick
conversations.leave
conversations.mark
conversations.open
conversations.rename
conversations.setPurpose
conversations.setTopic
conversations.unarchive
team.externalTeams.disconnect
slackLists.access.delete
slackLists.access.set
slackLists.create
slackLists.items.create
slackLists.items.delete
slackLists.items.deleteMultiple
slackLists.items.update
slackLists.update
conversations.archive
conversations.close
conversations.create
conversations.externalInvitePermissions.set
conversations.invite
conversations.kick
conversations.leave
conversations.mark
conversations.open
conversations.rename
conversations.setPurpose
conversations.setTopic
conversations.unarchive
team.externalTeams.disconnect
workflows.triggers.permissions.add
workflows.triggers.permissions.remove
workflows.triggers.permissions.set
OAuth Scopes to Events API methods
OAuth scopes also govern subscriptions to event types in the Events API.
Slack app scopes
If you're building a Slack app, you will also encounter three other scopes.
incoming-webhook
- requesting this scope during the authentication process allows workspaces to easily install an incoming webhook that can post from your app to a single Slack channel.commands
- similarly, requesting this scope allows workspaces to install slash commands bundled in your Slack app.bot
- request this scope when your Slack app includes bot user functionality. Unlikeincoming-webhook
andcommands
, thebot
scope grants your bot user access to a subset of Web API methods, the RTM API, and certain event types in the Events API.
Special scopes
Additionally, Slack supports the following special scopes:
- identify : Allows applications to confirm your identity.
- client: Allows applications to connect to slack as a client, and post messages on behalf of the user.
- admin: Allows applications to perform administrative actions, requires the authed user to be an admin.
Working with Scopes
When making the initial authorization request, your application can request multiple scopes as a space or comma separated list (e.g. teams:read users:read
).
https://slack.com/oauth/authorize?
client_id=...&
scope=team%3Aread+users%3Aread
When using the Slack API you can check the HTTP headers to see what OAuth scopes you have, and what the API method accepts.
$ curl https://slack.com/api/files.list -H "Authorization: Bearer xoxb-abc-1234" -I
HTTP/1.1 200 OK
x-oauth-scopes: files:read, chat:write, chat:write.public
x-accepted-oAuth-scopes: files:read
x-oauth-scopes
lists the scopes your token has authorized.
x-accepted-oAuth-scopes
lists the scopes that the action checks for.
Please note that certain scopes cannot be asked for in combination with each other. For instance, you cannot request both the bot
scope and the client
scope. When users arrive at an authorization page requesting invalid scope combinations, they'll see an ugly error stating something to this effect:
"OAuth error: invalid_scope: Cannot request service scope (bot) with deprecated scopes"
Deprecated Scopes
The following scopes are deprecated and their use is strongly discouraged:
read
post
client
Alternatives to the read
scope
This scope allows apps to read and inspect a wide range of data types.
Analyze which types of data your app needs and locate the accompanying scope in our scope catalog.
For instance, if you need to read public channel history, request channels:history
. If you need to read data about public channels, request [channels:read
].
You'll find a scope corresponding to almost all types of data you'll encounter on the Slack platform.
Alternatives to the post
scope
This scope allows posting messages into Slack.
Create a Slack app and request the chat:write
scope to use chat.postMessage
to send messages to channels.
Alternatives to the client
scope
This scope allows an app to retrieve all workspace events in real time.
We recommend using a combination of relevant scopes with the Events API to retrieve just the events your app needs.
If you must use the RTM API, you must use the classic bot scope and token model with rtm.connect
instead.