Resources/The Agent API Atlas/Communication/Slack

Everything an AI agent can do with the Slack API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints31
AuthenticationOAuth 2.0
Last updated22 June 2026
Orientation

How the Slack API works.

The Slack API is how an app or AI agent works with a Slack workspace: posting messages, reading channel history, creating channels, looking up people, and handling files. Access is granted through an access token and a set of permissions, and an app only ever sees the channels it has been added to. Separately, Slack can push live updates to an app the moment something happens.

31Endpoints
6Capability groups
15Read
16Write
13Permissions
Authentication
Two kinds of access key are used: a bot key (it starts xoxb) for things the app does on its own, and a user key (it starts xoxp) for actions tied to a specific person. Every request carries one.
Permissions
Each action needs its own permission. Slack calls these scopes, like chat:write or files:read. On top of that, an app only sees the channels it has been added to.
Versioning
There are no version numbers. There is one, always-current API. Slack announces any method it is retiring in its changelog.
Data model
A workspace is made of conversations, meaning channels, direct messages, and group messages, along with the people, files, and reactions in them.
Connect & authenticate

Connection & authentication methods.

How an agent connects to Slack determines what it can reach. There are two routes, one for making calls to Slack and one for receiving events from it, each with its own access token. Either way, an agent is limited to the permissions it is granted and the channels the app has been added to.

Ways to connect

Web API

The actions an app or AI agent calls to read and change Slack, covering messages, channels, people, and files.

Best forAnything an agent does in Slack: posting, reading, managing.
Governed byA bot or user access key, plus a permission for each action; the app only sees channels it is in.
Docs ↗

Events API

Slack sends updates, like messages, reactions, and joins, to an app as they happen.

Best forReacting to what happens in Slack in real time.
Governed byAn app subscribes to the updates it wants, and Slack delivers them to it.
Docs ↗
Authentication

Bot token

Acts as the app rather than a person, the default for automation.

TokenAn access key starting xoxb-, granted with the app's permissions.
Best forMost agent automation.
Docs ↗

User token

Acts on behalf of the installing user, and is needed for search and some user-only methods.

TokenAn access key starting xoxp-, granted with a person's permissions.
Best forActions that must be a specific person (search, user DMs).
Docs ↗

App-level token

Used to open a live connection for receiving updates, not to call the API.

TokenAn access key starting xapp-.
Best forReceiving events over a websocket without a public URL.
Docs ↗
Endpoint reference

Every Slack API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Channels & conversations

Public and private channels, DMs, and group DMs.10

Paginated; filter by types (public_channel, private_channel, mpim, im).

Acts onconversation
Permission (capability)channels:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reads one conversation's settings, not its messages.

Acts onconversation
Permission (capability)channels:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Needs the history scope for the channel type; cursor-paginated.

Acts onmessage
Permission (capability)channels:history
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitNew non-Marketplace apps: 1 request/minute, limit ≤ 15 (since 29 May 2025).

Returns a thread's messages from its parent ts.

Acts onmessage
Permission (capability)channels:history
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitNew non-Marketplace apps: 1 request/minute, limit ≤ 15 (since 29 May 2025).

Acts onuser
Permission (capability)channels:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reshapes the workspace; private needs groups:write.

Acts onconversation
Permission (capability)channels:manage
VersionAvailable since the API’s base version
Webhook eventchannel_created
Rate limitStandard limits apply

Acts onuser
Permission (capability)channels:manage
VersionAvailable since the API’s base version
Webhook eventmember_joined_channel
Rate limitStandard limits apply

Acts onconversation
Permission (capability)channels:manage
VersionAvailable since the API’s base version
Webhook eventchannel_archive
Rate limitStandard limits apply

Acts onconversation
Permission (capability)im:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onconversation
Permission (capability)channels:manage
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Messages

Send, edit, schedule, and delete messages.6

Posts as the app; supports Block Kit. chat:write.public lets it post to public channels it hasn't joined; chat:write.customize to override the name or icon. About 1 message a second per channel.

Acts onmessage
Permission (capability)chat:write
VersionAvailable since the API’s base version
Webhook eventmessage
Rate limitStandard limits apply

Acts onmessage
Permission (capability)chat:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onmessage
Permission (capability)chat:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onmessage
Permission (capability)chat:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onmessage
Permission (capability)chat:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No special scope beyond access to the channel.

Acts onmessage
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Users

Look up people, profiles, and the channels they are in.5

Cursor-paginated.

Acts onuser
Permission (capability)users:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onuser
Permission (capability)users:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Requires the email scope; exposes the email-to-user mapping.

Acts onuser
Permission (capability)users:read.email
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onuser
Permission (capability)users.profile:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onconversation
Permission (capability)channels:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Files

Upload, list, and remove files.6

Current upload flow; pair with files.completeUploadExternal.

Acts onfile
Permission (capability)files:write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onfile
Permission (capability)files:write
VersionAvailable since the API’s base version
Webhook eventfile_shared
Rate limitStandard limits apply

Deprecated. Use the external-upload flow instead.

Acts onfile
Permission (capability)files:write
VersionDeprecated 2025-03-11
Webhook eventfile_shared
Rate limitStandard limits apply

Acts onfile
Permission (capability)files:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onfile
Permission (capability)files:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Acts onfile
Permission (capability)files:write
VersionAvailable since the API’s base version
Webhook eventfile_deleted
Rate limitStandard limits apply

Reactions

Add, remove, and read emoji reactions.3

Acts onreaction
Permission (capability)reactions:write
VersionAvailable since the API’s base version
Webhook eventreaction_added
Rate limitStandard limits apply

Acts onreaction
Permission (capability)reactions:write
VersionAvailable since the API’s base version
Webhook eventreaction_removed
Rate limitStandard limits apply

Acts onreaction
Permission (capability)reactions:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
Search messages across the workspace.1

User token only; reaches everything the searching user can see.

Acts onmessage
Permission (capability)search:read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Alongside the methods an agent calls, Slack can push events to an app the moment something happens, like a message being posted, a reaction being added, or a member joining a channel. This lets an agent react to activity rather than repeatedly checking for it. Subscriptions are set in the app's settings.

EventWhat it signalsTriggered by
messageA message was posted to a channel./api/chat.postMessage
app_mentionThe app was @-mentioned.In-app only
reaction_addedAn emoji reaction was added to an item./api/reactions.add
reaction_removedAn emoji reaction was removed./api/reactions.remove
channel_createdA channel was created./api/conversations.create
channel_archiveA channel was archived./api/conversations.archive
member_joined_channelA member joined a channel./api/conversations.invite
file_sharedA file was shared into a channel./api/files.completeUploadExternal
/api/files.upload
file_createdA file was created in the workspace.In-app only
file_deletedA file was deleted./api/files.delete
team_joinA new member joined the workspace.In-app only
user_changeA member's profile changed.In-app only
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Slack caps how much an agent can do, and hitting those caps is a common cause of failed calls in production. The caps fall into three kinds: how often an agent can call, how much it can send in one request, and how results are paginated. Limits that apply to a single method are shown on its row above.

Request rate

Slack sorts each method into one of four rate-limit tiers that set how often it can be called, from Tier 1, the most restrictive (around 1 call a minute), up to Tier 4 (100+ a minute). Posting is handled separately: chat.postMessage allows about one message a second per channel. And since 29 May 2025, newly-created non-Marketplace apps are capped at 1 call a minute on conversations.history and conversations.replies, returning at most 15 results. Going over any limit returns an HTTP 429 with a Retry-After header giving the number of seconds to wait.

Pagination

Pagination is cursor-based: a call passes limit and cursor, and responses carry response_metadata.next_cursor. For new non-Marketplace apps the conversations.history and conversations.replies limit is capped at 15 (default 15) since 29 May 2025.

Request size

Message text runs up to 40,000 characters and up to 50 Block Kit blocks per message. File uploads run up to 1 GB depending on plan.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
200ok:falseSlack returns HTTP 200 with "ok": false and an error field for most failures, so check the body, not the status.Always read the JSON ok and error fields, not just the HTTP status.
200not_authedNo authentication token was provided.Send a valid Bearer token in the Authorization header.
200invalid_authThe token is invalid or has been revoked.Re-install the app or refresh the token.
200missing_scopeThe token lacks a scope the method requires.Add the named scope and re-install the app.
200channel_not_foundThe channel doesn't exist or the app isn't in it.Add the app to the channel, or check the channel ID.
200not_in_channelThe app must be a member of the channel to act there.Invite the app to the channel first.
200msg_too_longThe message text exceeded the limit (40,000 characters).Shorten the message or split it.
429rate_limitedToo many requests for this method's tier.Honour the Retry-After header (seconds) and back off, then retry.
Versioning & freshness

Version history.

How an API handles change determines how much maintenance it asks for. Slack doesn't use version numbers. There is a single, continuously updated API. When a method is retired, Slack announces it in advance in the changelog, with a removal date, like the two examples below.

Version history

What changed, and when

Latest versionCurrent
CurrentCurrent version
Web API

Slack's Web API updates continuously, in place. There is no version number to pin to.

What changed
  • The API changes gradually, without versions
  • Anything being retired is announced in the changelog, with a date
2025-03-11Requires migration
files.upload deprecated

The old one-step file upload was retired in favour of a safer two-step upload.

Migrate: Switch uploads to the two-step flow: files.getUploadURLExternal, then files.completeUploadExternal.
What changed
  • The single-call file upload was marked for retirement
  • Replaced by a two-step upload: get an upload link, then confirm it
2020-08-26Feature update
Granular bot scopes

Bot keys moved to specific, per-action permissions.

What changed
  • Each method now asks only for the permissions it needs, instead of broad ones
Earlier
Unified conversation methods

One unified set of conversation methods replaced Slack's older per-type ones.

Migrate: Use the conversations methods, with the right permission for each channel type.
What changed
  • Slack's original separate methods for channels, direct messages, and group messages were replaced by a single conversations set

There is no version to lock to. Instead, an integration watches Slack's changelog and moves off any retired method on its own schedule.

Slack's API changelog ↗
Questions

Slack API, answered.

Does an AI agent need its own Slack account?+
No. An agent acts through a Slack app authorised once via OAuth, using a bot or user token. Nobody hands the agent a Slack login.
What's the difference between a bot token and a user token?+
A bot token (xoxb-…) acts as the app and is best for most automation. A user token (xoxp-…) acts on behalf of a specific person and is required for a few methods like search.messages.
How does an app get permission to read a channel?+
Two things together: the right OAuth scope (e.g. channels:history) and the app being added to the channel. Access doesn't flow workspace-wide. The app only sees channels it's in.
Why did POST /api/files.upload stop working?+
files.upload was deprecated in 2025. Uploading now happens in two steps instead: files.getUploadURLExternal then files.completeUploadExternal. See the new flow.
How does Slack signal an error?+
Usually with HTTP 200 and a body of {"ok": false, "error": "…"}, so the body needs checking, not just the status code. Rate limiting is the exception: it returns 429 with a Retry-After header.
How does an agent receive messages, not just send them?+
Through the Events API. Slack pushes events (a new message, a reaction, a member joining) to the app. An app receives them over HTTP, or via Socket Mode when a public URL isn't available. The legacy RTM API is being retired (classic apps deprecate November 2026), so new apps should use the Events API.
Is there a rate limit?+
Yes. Each method sits in a tier from roughly 1 to 100+ requests per minute, and chat.postMessage is about one message per second per channel. Going over the limit returns 429; honour the Retry-After header.
What is Bollard AI?

Control what every AI agent can do in Slack.

Bollard AI sits between a team's AI agents and Slack. Grant each agent exactly the access it needs, read or write, channel by channel, and every call is checked and logged.

  • Set every channel to Off, Read, or Full use, per person and per agent.
  • Denied by default: an agent reaches only the channels that have been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Slack
Support Agent
#support ChannelOffReadFull use
#engineering ChannelOffReadFull use
#finance ChannelOffReadFull use
Per-agent access, set in Bollard AI, not in Slack