Slack error ratelimited: Request was rate limited (HTTP 429)
Last verified against Slack API reference - chat.postMessage errors
The request has been ratelimited. Refer to the Retry-After header for when to retry the request.What error ratelimited means
Your app called this method too often and Slack throttled it. This is the one common Slack error that changes the HTTP status line: the response arrives as HTTP 429 Too Many Requests, and — as the documented description says — you should "Refer to the Retry-After header for when to retry the request." The header value is a number of seconds; the contract is to wait exactly that long, not a guess of your own.
Slack's Web API limits are organized in tiers, applied "per API method per workspace/team per app": Tier 1 allows 1+ per minute, Tier 2 20+, Tier 3 50+, Tier 4 100+, each with some tolerance for short bursts. Each method's reference page states its tier. Because the scope is per-method-per-workspace, a burst of conversations.history calls does not throttle your chat.postMessage traffic — but ten workers all posting to one workspace share one budget, which is why per-worker rate limiters multiply your real rate and fail. Message posting adds its own special rule: about 1 message per second per channel, with short bursts tolerated. Newer non-Marketplace apps face stricter documented limits on conversations.history and conversations.replies (1 request per minute, 15 objects per request) — see the full table in Slack rate limits.
Handling is mechanical. On 429: read Retry-After, sleep that many seconds, retry the same request once, and feed back pressure upstream (pause the queue rather than letting it pile onto the next request). Retrying early is the classic own-goal — it keeps you inside the penalty. The official SDKs do much of this for you: @slack/web-api retries rate-limited calls automatically and emits WebClientEvent.RATE_LIMITED, only surfacing an error with code === ErrorCode.RateLimitedError (which carries a retryAfter property in seconds) if you set rejectRateLimitedCalls: true; Python's slack_sdk raises SlackApiError where e.response.status_code == 429 and e.response.headers['Retry-After'] holds the wait, and ships a RateLimitErrorRetryHandler you can append to client.retry_handlers.
If throttling is chronic rather than incidental, the fix is architectural: batch reads with cursors and larger limit values, cache what you re-fetch, coalesce notifications per channel, and spread bulk sends. A related documented string, rate_limited, appears specifically for message-posting overruns.
What it looks like
HTTP/1.1 429 Too Many Requests
Retry-After: 30
{"ok": false, "error": "ratelimited"}Why it happens
- A burst of calls to one method in one workspace exceeded its tier allowance.
- Multiple workers each apply their own limiter, multiplying the aggregate rate against the shared per-workspace budget.
- Posting faster than about 1 message per second to a single channel.
- Polling loops (history, presence, membership) re-fetching data that events would push for free.
- A newer non-Marketplace app calling conversations.history/replies above its documented 1-per-minute limit.
- Immediate retries on 429 that never let the penalty window expire.
How to fix Slack error ratelimited
- 1Read the Retry-After header and sleep exactly that many seconds before a single retry.
- 2Centralize rate limiting: one shared limiter (token bucket keyed per method+workspace, plus per-channel for posting), not one per process.
- 3Enable/keep SDK handling: default automatic retries in @slack/web-api, RateLimitErrorRetryHandler in slack_sdk.
- 4Replace polling with Events API subscriptions where an event exists for the data.
- 5Batch pagination with cursor + limit at the method's maximum instead of many small pages.
- 6Queue and pace bulk broadcasts (per-channel pacing at 1/sec) rather than fanning out in parallel.
How to stop it recurring
Design to the documented tiers from the start: look up each method's tier, provision a shared limiter, and alert on 429 rate rather than on single occurrences (occasional 429s are normal at scale; sustained ones mean the architecture is polling or fanning out too hard). The complete tier table, the per-channel posting rule and the 2025 non-Marketplace changes are collected in Slack API limits, with background in Slack bot not responding.
Official reference: Slack API reference - chat.postMessage errors. See all Slack error codes or the Slack limits and quotas.
Related codes
- rate_limited: Posting messages too quicklyApplication has posted too many messages, read the Rate Limit documentation…
- app_rate_limited: Events API deliveries rate limited"type": "app_rate_limited"
- message_limit_exceeded: Workspace message usage limit reachedMembers on this team are sending too many messages. For more details, see…
- service_unavailable: Service temporarily unavailableThe service is temporarily unavailable
Error ratelimited - quick answers
What does Slack error ratelimited mean?
Your app called this method too often and Slack throttled it. This is the one common Slack error that changes the HTTP status line: the response arrives as HTTP 429 Too Many Requests , and — as the documented description says — you should "Refer to the Retry-After header for when to retry the request." The header value is a number of seconds; the contract is to wait exactly that long, not a guess of your own.
How do I fix Slack error ratelimited?
1. Read the Retry-After header and sleep exactly that many seconds before a single retry. 2. Centralize rate limiting: one shared limiter (token bucket keyed per method+workspace, plus per-channel for posting), not one per process. 3. Enable/keep SDK handling: default automatic retries in @slack/web-api, RateLimitErrorRetryHandler in slack_sdk. 4. Replace polling with Events API subscriptions where an event exists for the data. 5. Batch pagination with cursor + limit at the…
Can I retry after error ratelimited?
Yes - this is a retryable condition. Back off (start around one second and double on each attempt, with jitter) and watch for a retry-after hint from the platform before resending.
Stop debugging Slack by hand
Connect the channel through Conferbot: tokens, webhooks and retries are handled, failures show as readable status.