Slack API reference

Every Slack API limit, in one table

54documented limits
6groups
2026-08-20last verified

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.

WhatLimitNotesSource
Tier 1 methods1+ requests per minuteFor methods accessed infrequently. Each method's reference page states its tier.docs ↗
Tier 2 methods20+ requests per minuteOccasional bursts allowed.docs ↗
Tier 3 methods50+ requests per minuteThe tier of most paginating collection methods, including conversations.history (for Marketplace/internal apps) and chat.update.docs ↗
Tier 4 methods100+ requests per minuteGenerous burst behavior; files.getUploadURLExternal is documented as Tier 4.docs ↗
Scope of every rate limitPer API method, per workspace/team, per appTen workers posting into one workspace share one budget; a shared limiter is mandatory. All Slack plans get the same tier assignments.docs ↗
chat.postMessage (special tier)1 message per second per channelDocumented as "generally allow an app to post 1 message per second to a specific channel"; short bursts over 1/sec allowed, sustained overruns throttled with rate_limited.docs ↗
Incoming webhooks1 request per secondSame short-burst tolerance as message posting.docs ↗
Exceeding any limitHTTP 429 Too Many Requests + Retry-After header (seconds)Wait exactly Retry-After seconds before retrying; early retries extend the penalty. See the ratelimited error entry for SDK handling.docs ↗
conversations.history / conversations.replies — new non-Marketplace apps1 request per minute; limit parameter default and maximum reduced to 15 objectsDocumented on the method page: "As of May 29, 2025, for new applications and installation commercially distributed outside of the Marketplace, this method is rate limited to 1 request per minute." Existing installations of non-Marketplace apps are not subject to the new limits.docs ↗
conversations.history limit parameter (standard)Default 100, maximum 999 messages per requestApplies to Marketplace-approved and internal apps at Tier 3; paginate with cursors at high limit values to conserve rate budget.docs ↗
chat.scheduleMessage volumeMax 30 messages scheduled into the same channel per 5-minute windowExceeding it returns restricted_too_many: "Too many messages were scheduled in the channel for a given period."docs ↗

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.

WhatLimitNotesSource
Event acknowledgment deadlineHTTP 2xx within 3 seconds"Your app should respond to the event request with an HTTP 2xx within three seconds. If it does not, we'll consider the event delivery attempt failed." Acknowledge first, process asynchronously.docs ↗
Delivery retries3 retries: nearly immediately, after 1 minute, after 5 minutesRetries carry x-slack-retry-num (1-3) and x-slack-retry-reason (http_timeout, too_many_redirects, connection_failed, ssl_error, http_error, unknown_error). Deduplicate by event_id.docs ↗
Event delivery volume30,000 deliveries per workspace/team per app per 60 minutesPast the cap Slack sends an app_rate_limited event with team_id, api_app_id and minute_rate_limited; dropped events are not redelivered.docs ↗
Failure tolerance before disablementMore than 95% failed deliveries within 60 minutes"...your application's event subscriptions will be temporarily disabled." Monitor retry headers as the early-warning signal.docs ↗
Request URL verificationMust echo the url_verification challenge with HTTP 200Slack POSTs {"type":"url_verification","challenge":"..."} when you save a Request URL; respond with the challenge value as text/plain, form-encoded, or JSON. SSL certificate is validated first.docs ↗
Request signature freshnessReject timestamps more than ~5 minutes from local timeVerify X-Slack-Signature = HMAC-SHA256 over v0:timestamp:body with your signing secret, using a constant-time compare; the docs' example rejects requests more than five minutes off to block replays.docs ↗
App manifest event subscriptionsMax 100 bot event types and 100 user event typesPer the app manifest schema; subscribe narrowly — volume counts against the 30,000/hour delivery cap.docs ↗

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.

WhatLimitNotesSource
chat.postMessage text (recommended)4,000 characters"For best results, limit the number of characters in the text field to 4,000 characters."docs ↗
chat.postMessage text (truncation)40,000 characters"Slack will truncate messages containing more than 40,000 characters." Oversize can also be rejected with msg_too_long.docs ↗
chat.update text4,000 characters (hard)The msg_too_long description on chat.update: "The text field cannot exceed 4,000 characters."docs ↗
markdown_text field12,000 charactersDocumented on chat.postMessage: "Limit this field to 12,000 characters." Cannot be combined with blocks or text (markdown_text_conflict).docs ↗
Scheduled message horizonUp to 120 days into the future"You will only be able to schedule a message up to 120 days into the future." Later post_time returns time_too_far; past values return time_in_past.docs ↗
Multi-person DM participants (conversations.open)2 to 8 usersDocumented errors not_enough_users ("Needs at least 2 users to open") and too_many_users ("Needs at most 8 users to open"); exclude the calling user's own ID.docs ↗
Free workspace message usageWorkspace-level usage limits (Slack help center)When a free workspace exceeds them, sends fail with message_limit_exceeded regardless of your app's pacing.docs ↗

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.

WhatLimitNotesSource
Blocks per message50"You can include up to 50 blocks in each message..."docs ↗
Blocks per modal or Home tab100"...and 100 blocks in modals or Home tabs."docs ↗
Section block text3,000 characters (min 1)"Minimum length for the text in this field is 1 and maximum length is 3000 characters."docs ↗
Section block fields10 items, 2,000 characters each"Maximum number of items is 10. Maximum length for the text in each item is 2000 characters."docs ↗
Header block text150 characters"Maximum length for the text in this field is 150 characters." Long dynamic titles are the classic invalid_blocks trigger.docs ↗
Context block elements10 elements"An array of image elements and text objects. Maximum number of items is 10."docs ↗
Actions block elements25 elements"There is a maximum of 25 elements in each action block."docs ↗
block_id (any block)255 characters"Maximum length for this field is 255 characters" — documented identically on section, header, context, and actions blocks.docs ↗
Legacy attachments per message100too_many_attachments: "A maximum of 100 attachments are allowed on a message." Oversized attachment payloads return attachment_payload_limit_exceeded.docs ↗
Contact cards per message10too_many_contact_cards: "A maximum of 10 contact cards are allowed on a message."docs ↗

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.

WhatLimitNotesSource
Upload size declarationlength parameter, in bytes, required"Size in bytes of the file being uploaded" must be declared when requesting the upload URL.docs ↗
Snippet uploads1 MBSnippets are "limited to 1MB"; larger content returns snippet_too_large.docs ↗
Free workspace file storage5 GB totalStorage-limit failures occur "when free teams have uploaded 5GB of files".docs ↗
Team-restricted upload sizeAdmin-configured per workspacefile_upload_size_restricted: "The size of provided file is too large, as the team has restricted uploads of large files." Admins can also disable uploads (file_uploads_disabled) or allow images only.docs ↗
File alt text1,000 charactersalt_txt_too_large fires when the description exceeds the 1,000-character limit.docs ↗
files.getUploadURLExternal rateTier 4: 100+ per minuteRequired scope: files:write (bot or user token).docs ↗

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.

WhatLimitNotesSource
Slash command acknowledgmentWithin 3,000 milliseconds"This confirmation must be received by Slack within 3000 milliseconds of the original request being sent." Respond first, compute later via response_url.docs ↗
Command name32 characters"Maximum length is 32 characters, and should include the leading / character."docs ↗
Command description2,000 charactersPer the app manifest schema.docs ↗
Command usage hint1,000 charactersKeep it brief enough not to be truncated in the command picker.docs ↗
Slash commands per app50"A maximum of 50 slash commands can be included in this array."docs ↗
Modal view stack3 views"A modal can hold up to 3 views at a time in a view stack."docs ↗
Blocks per modal view100"An array of blocks that defines the content of the view. Max of 100 blocks."docs ↗
Modal title24 characters (plain_text)"...max length of 24 characters."docs ↗
trigger_id lifetime3 seconds"A trigger_id will expire 3 seconds after it's sent to your app, so you'll want to use it quickly."docs ↗
View private_metadata3,000 charactersSent back in view_submission and block_actions payloads; store a state key here, not the state itself.docs ↗
View callback_id255 charactersIdentifies interactions and submissions of the view.docs ↗
App name / descriptions (manifest)Name 35 chars; short description 140; long description 4,000Per the app manifest schema; bot user display name max 80 characters (a-z, 0-9, -, _, .).docs ↗
OAuth scopes & redirect URLs (manifest)255 bot scopes, 255 user scopes, 1,000 redirect URLsAlso: max 10 shortcuts and 5 unfurl domains per app.docs ↗

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.