Back to blog
April 24, 2025 · LithoBlocks Team

Slack Block Kit Limits: What to Know and How to Work Around Them

Block Kit has hard limits on blocks, characters, and elements that will silently truncate or reject your messages. Here's what they are and how to design around them.

#slack#block kit#limits#api

Block Kit has a set of hard limits that can break your messages in ways that are surprisingly easy to miss. Some are soft (Slack truncates silently), some are hard (the API returns an error), and some depend on where you’re sending the message. Here’s the complete picture.

Block limits per message

A single message can contain a maximum of 50 blocks. This sounds generous until you’re building a rich notification with sections, dividers, context blocks, and action rows: at which point 50 goes faster than you’d expect.

What happens if you exceed it: Slack returns an invalid_blocks error and the message doesn’t send at all.

How to work around it: Audit your block structure. divider blocks are often overused: visual separation can usually be achieved with context blocks or spacing inside section blocks. If you genuinely need more than 50 blocks, paginate: send the first portion and follow up with a threaded reply or a “Load more” button that links to a full view.

Character limits

LocationLimit
text in a section block (mrkdwn)3,000 characters
text in a header block150 characters
Button text75 characters
action_id255 characters
value on a button2,000 characters
Option text in a static_select75 characters
Option value in a static_select150 characters
placeholder text150 characters
Message text fallback field4,000 characters

What happens if you exceed them: Character limits on most fields return an API error. The header block limit is enforced strictly: it will reject your payload if the text is over 150 characters.

How to work around them: The section block’s 3,000-character limit is the most commonly hit in practice. If you need to include long content (a full error message, a large diff, a verbose log), truncate with a “View full output →” link rather than trying to include it inline. A Slack message is a notification, not a log viewer.

Element limits in action blocks

An actions block can contain a maximum of 5 elements. This includes buttons, select menus, date pickers, and overflow menus.

What happens if you exceed it: API returns an error.

How to work around it: If you legitimately need more than 5 actions, use an overflow menu (the ... element) to house secondary actions. Primary actions should be 1–3 buttons at most anyway: if you’re approaching 5, you likely have a design problem, not a limit problem.

Blocks per modal

Modals support up to 100 blocks in a single view. Modal views also support a title of up to 24 characters and a submit button label up to 24 characters.

The combined character limit for all text in a modal’s blocks is not explicitly documented, but in practice you’ll hit the per-block character limits before a global limit.

Attachment limits (legacy)

If you’re still using the legacy attachments API (the older colored-sidebar format), those have their own limits: 100 attachments per message, 8,000 characters per attachment. Legacy attachments are deprecated: if you’re still using them, it’s worth migrating to Block Kit.

The text fallback field

Every message sent via the API should include a top-level text field alongside your blocks. This field is the fallback for:

  • Push notifications (iOS/Android)
  • Desktop notifications
  • Email digests
  • Accessibility tools and screen readers

The text field is limited to 4,000 characters but in practice should be a short summary of the message content: 1–2 sentences. If you omit it, Slack still sends the message, but you’ll see a warning and notifications will show as empty.

Rate limits

Slack enforces rate limits on message sending:

  • Tier 3 API methods (including chat.postMessage): 1 call per second per workspace, bursting to higher rates
  • Exceeding rate limits returns a ratelimited error with a Retry-After header

For high-volume notification systems, batch messages where possible and implement exponential backoff when you hit rate limit responses.

Designing within the limits

The easiest way to stay within limits:

  • Keep section block text under 500 characters in practice: shorter is better
  • Use 1–3 action buttons per message, never more than 5
  • Use a threaded reply or linked external page for verbose content
  • Always include a text fallback
  • Validate your Block Kit JSON with Slack’s Block Kit Builder or a validator before sending, especially when building templates that will be populated with variable-length data at runtime

LithoBlocks takes a different approach to Block Kit limits. The template editor shows a live block allowance — you can see exactly how many blocks you’ve used and how many remain as you build. For list and bullet-heavy templates, LithoBlocks automatically handles truncation via an overflow block when a directive renders more items than the remaining allowance allows. And for content length limits — section text, header characters, button labels — truncation happens during template compilation when real data is injected, so your messages never silently fail or get rejected by the API. Try it free →

// try lithoblocks

Stop hand-writing Block Kit.

Build Slack message templates visually. Send them with one REST call. Update them after a click with a built-in action archive.