Every Slack API limit, in one table
Last verified against Slack API rate limits documentation
Slack's limits are spread across the rate-limit guide, each method's reference page, the Block Kit reference, the Events API documentation, and the app manifest schema. This page collects them with the documented wording and a link to the page that states each one. Values were verified on 2026-08-20 against Slack's current developer documentation (now hosted at docs.slack.dev; api.slack.com URLs redirect there).
Three limit systems matter most in practice. First, Web API rate limits: four tiers from 1+ to 100+ requests per minute, applied "per API method per workspace/team per app", plus a special rule for message posting — about 1 message per second per channel. Exceed any of them and you get HTTP 429 with a Retry-After header stating how many seconds to wait; the error strings are ratelimited and rate_limited. Since May 29, 2025 there is also a much stricter documented limit on conversations.history and conversations.replies for new apps distributed outside the Slack Marketplace — 1 request per minute and 15 objects per request — which changes the economics of history-reading integrations.
Second, Events API delivery rules: acknowledge every event with an HTTP 2xx within 3 seconds, or Slack retries up to three times and — at sustained failure rates above 95% over an hour — temporarily disables your event subscriptions. Deliveries cap at 30,000 per workspace per app per hour, past which you receive app_rate_limited instead of your events.
Third, content budgets: 4,000 characters of recommended message text (hard truncation above 40,000), 50 blocks per message with per-block caps like 3,000 characters of section text and 150 of header text, 100 attachments, and the modal stack's 3 views of 100 blocks each. Exceeding these produces the deterministic errors cataloged in Slack API errors; for diagnosing a bot that has gone quiet, start with Slack bot not responding.
Jump to: Web API rate limits · Events API delivery limits · Message text & sending limits · Block Kit & attachment limits · File upload limits · Slash commands, modals & app manifest
Web API rate limits
Slack rate limits "per API method per workspace/team per app": each method belongs to a tier, and every workspace-app pair gets its own budget for it. The documentation recommends designing around "a limit of 1 request per second for any given API call", with temporary bursts tolerated. Exceeding a limit returns HTTP 429 with a Retry-After header in seconds — the handling contract is on the ratelimited page, and message-posting overruns surface as rate_limited. Note the 2025 change: new non-Marketplace commercial apps face a documented 1-request-per-minute limit on the two history-reading methods, with responses capped at 15 objects.
| What | Limit |
|---|---|
| Tier 1 methods | 1+ requests per minute |
| Tier 2 methods | 20+ requests per minute |
| Tier 3 methods | 50+ requests per minute |
| Tier 4 methods | 100+ requests per minute |
| Scope of every rate limit | Per API method, per workspace/team, per app |
| chat.postMessage (special tier) | 1 message per second per channel |
| Incoming webhooks | 1 request per second |
| Exceeding any limit | HTTP 429 Too Many Requests + Retry-After header (seconds) |
| conversations.history / conversations.replies — new non-Marketplace apps | 1 request per minute; limit parameter default and maximum reduced to 15 objects |
| conversations.history limit parameter (standard) | Default 100, maximum 999 messages per request |
| chat.scheduleMessage volume | Max 30 messages scheduled into the same channel per 5-minute window |
Events API delivery limits
The Events API inverts responsibility — Slack calls you — so its limits govern your endpoint's behavior. The contract: respond with an HTTP 2xx within 3 seconds or the delivery counts as failed; failures are retried three times with x-slack-retry-num/x-slack-retry-reason headers; sustained failure gets subscriptions disabled. Volume caps at 30,000 deliveries per workspace per app per hour, past which Slack sends app_rate_limited instead of events. New Request URLs must first pass the url_verification challenge, and every request should be verified against the X-Slack-Signature header.
| What | Limit |
|---|---|
| Event acknowledgment deadline | HTTP 2xx within 3 seconds |
| Delivery retries | 3 retries: nearly immediately, after 1 minute, after 5 minutes |
| Event delivery volume | 30,000 deliveries per workspace/team per app per 60 minutes |
| Failure tolerance before disablement | More than 95% failed deliveries within 60 minutes |
| Request URL verification | Must echo the url_verification challenge with HTTP 200 |
| Request signature freshness | Reject timestamps more than ~5 minutes from local time |
| App manifest event subscriptions | Max 100 bot event types and 100 user event types |
Message text & sending limits
Message-size limits are enforced with specific error strings, so each row here has a failure page: oversized text returns msg_too_long, empty content returns no_text, and free-workspace ceilings surface as message_limit_exceeded. Note the two-level text rule on chat.postMessage: 4,000 characters is the documented "for best results" budget, while 40,000 is the point past which Slack truncates outright — and chat.update enforces 4,000 as a hard cap. Nothing is chunked for you; splitting and summarizing are your job.
| What | Limit |
|---|---|
| chat.postMessage text (recommended) | 4,000 characters |
| chat.postMessage text (truncation) | 40,000 characters |
| chat.update text | 4,000 characters (hard) |
| markdown_text field | 12,000 characters |
| Scheduled message horizon | Up to 120 days into the future |
| Multi-person DM participants (conversations.open) | 2 to 8 users |
| Free workspace message usage | Workspace-level usage limits (Slack help center) |
Block Kit & attachment limits
Block Kit budgets exist at two levels — per surface and per block — and violating either returns invalid_blocks (or msg_blocks_too_long for oversized block payloads), while structurally broken JSON returns invalid_blocks_format. The per-surface rule from the Block Kit reference: "You can include up to 50 blocks in each message, and 100 blocks in modals or Home tabs." The per-block numbers below come from each block's own reference page; dynamic content (customer names, descriptions) is what pushes past them in production, so clamp strings before they enter a block. Legacy attachments have count and payload-size ceilings of their own — too_many_attachments documents the count.
| What | Limit |
|---|---|
| Blocks per message | 50 |
| Blocks per modal or Home tab | 100 |
| Section block text | 3,000 characters (min 1) |
| Section block fields | 10 items, 2,000 characters each |
| Header block text | 150 characters |
| Context block elements | 10 elements |
| Actions block elements | 25 elements |
| block_id (any block) | 255 characters |
| Legacy attachments per message | 100 |
| Contact cards per message | 10 |
File upload limits
Modern uploads go through files.getUploadURLExternal (you declare the byte size, receive an upload URL, then finalize with files.completeUploadExternal); the method sits in Tier 4, so throughput is rarely the constraint — size and workspace policy are. Slack documents per-team restrictions rather than one universal byte ceiling: admins can restrict large uploads (file_upload_size_restricted) or disable uploads entirely, and free workspaces have a documented 5 GB storage pool. Files are the correct escape hatch when content outgrows message text budgets: upload, then post a short message linking the file.
| What | Limit |
|---|---|
| Upload size declaration | length parameter, in bytes, required |
| Snippet uploads | 1 MB |
| Free workspace file storage | 5 GB total |
| Team-restricted upload size | Admin-configured per workspace |
| File alt text | 1,000 characters |
| files.getUploadURLExternal rate | Tier 4: 100+ per minute |
Slash commands, modals & app manifest
Interactivity has its own clocks and caps. Slash commands must be acknowledged fast — the documentation requires the confirmation "within 3000 milliseconds of the original request being sent" — and a trigger_id from any interaction expires 3 seconds after issue, so opening a modal is always a race you must win before doing slow work. The structural caps below come from the app manifest schema and the modals guide; command definitions that exceed them fail at configuration time rather than at runtime, which at least makes them easy to catch. Modal contents obey the same Block Kit budgets as messages, with the higher 100-block ceiling and failures surfacing as invalid_blocks.
| What | Limit |
|---|---|
| Slash command acknowledgment | Within 3,000 milliseconds |
| Command name | 32 characters |
| Command description | 2,000 characters |
| Command usage hint | 1,000 characters |
| Slash commands per app | 50 |
| Modal view stack | 3 views |
| Blocks per modal view | 100 |
| Modal title | 24 characters (plain_text) |
| trigger_id lifetime | 3 seconds |
| View private_metadata | 3,000 characters |
| View callback_id | 255 characters |
| App name / descriptions (manifest) | Name 35 chars; short description 140; long description 4,000 |
| OAuth scopes & redirect URLs (manifest) | 255 bot scopes, 255 user scopes, 1,000 redirect URLs |
Slack guides and tools
Other platforms
Frequently asked questions
What are Slack's API rate limit tiers?
Web API methods are grouped into four tiers applied per method, per workspace, per app: Tier 1 allows 1+ requests per minute, Tier 2 20+, Tier 3 50+, and Tier 4 100+, each tolerating short bursts. A handful of methods sit in a special tier with unique conditions — chat.postMessage's 1 message per second per channel is the important one. Each method's reference page states its tier.
How fast can a Slack bot post messages to one channel?
Slack documents that it will "generally allow an app to post 1 message per second to a specific channel", with short bursts above that tolerated. Sustained overruns return HTTP 429 with rate_limited or ratelimited and a Retry-After header. The scope is per channel, so an app can post to many channels concurrently — but parallel workers hitting one channel share the same 1/sec budget.
What should I do when Slack returns HTTP 429?
Read the Retry-After header — it contains the number of seconds to wait — sleep exactly that long, then retry once while pausing upstream traffic. Retrying early typically extends the penalty. The official SDKs handle this: @slack/web-api retries automatically and exposes ErrorCode.RateLimitedError with a retryAfter property, and Python's slack_sdk offers RateLimitErrorRetryHandler.
What changed for non-Marketplace Slack apps in 2025?
As of May 29, 2025, new applications and installations commercially distributed outside the Slack Marketplace are rate limited to 1 request per minute on conversations.history and conversations.replies, with the limit parameter's default and maximum reduced to 15 objects. Slack's method pages state that existing installations of non-Marketplace apps are not subject to the new posted limits.
How quickly must my app acknowledge a Slack event?
Within 3 seconds, with an HTTP 2xx, or the delivery is considered failed. Slack then retries up to three times — nearly immediately, after 1 minute, and after 5 minutes — marking retries with x-slack-retry-num and x-slack-retry-reason headers. Acknowledge immediately and process asynchronously; if more than 95% of deliveries fail over 60 minutes, event subscriptions are temporarily disabled.
How many events can my Slack app receive per hour?
Event deliveries max out at 30,000 per workspace per app per 60 minutes. Beyond that, Slack sends an app_rate_limited event identifying the workspace, app, and the minute limiting began, and drops the excess events rather than queueing them. Trim event subscriptions to what you actually consume and backfill gaps with Web API reads.
How long can a Slack message be?
chat.postMessage documents 4,000 characters as the "for best results" budget for the text field and truncates messages containing more than 40,000 characters; chat.update enforces 4,000 as a hard cap. The optional markdown_text field is limited to 12,000 characters. Content beyond these budgets belongs in a file upload with a short summary message, or split across a thread.
How many blocks can a Slack message or modal contain?
Up to 50 blocks in a message and 100 in a modal or Home tab view. Per-block caps apply on top: 3,000 characters of section text, 10 section fields of 2,000 characters each, 150 characters of header text, 10 context elements, 25 actions elements, and 255-character block_ids. Exceeding any of them returns invalid_blocks.
What are the limits on Slack modals and trigger_ids?
A modal holds up to 3 views in its stack, each view up to 100 blocks, with a 24-character plain_text title, 3,000-character private_metadata, and 255-character callback_id. The trigger_id needed to open a modal expires 3 seconds after Slack sends it, so open the view before doing any slow work and update it afterwards.
How far ahead can I schedule Slack messages, and how many?
chat.scheduleMessage accepts a post_time up to 120 days in the future (beyond that: time_too_far; in the past: time_in_past), and you cannot schedule more than 30 messages to post within a 5-minute window to the same channel — exceeding that returns restricted_too_many. The method itself is Tier 3, 50+ requests per minute.
Build on Slack without tracking every limit yourself
Conferbot paces sends, queues retries and surfaces limit errors as readable status.