Skip to main content
Block Kit is the JSON format for every message your bot sends. It is the same format on all three paths: webhook response, response URL, and API key.

The standard shape

block_kit_version
string
Currently "1". Optional — leave it out and you get "1". Any other value is rejected with BLOCK_KIT_VERSION_UNSUPPORTED.
messages
array
required
1–10 messages. Each one becomes its own chat bubble group. That lets one reply arrive as a few short bubbles instead of one wall of text.
Every block can also have a block_id (same character rules as mid). Leave it out and we make one, like blk_a1b2c3d4e5f6.

Block types

Ten block types, each with its own page.

Shortcuts

You rarely need the full shape. We accept all of these and convert them into the standard shape for you. Your first try usually just works.

What we clean up for you

We trim spaces from the ends of label, title, name, action_id, and submit_label. Spaces inside text are kept, because markdown needs them.
Empty replies are fine too. An empty body or {} from a webhook means “got it, no message” — the typing dots stay on while you finish the work. But posting an empty body to a response_url is an error (422 EMPTY_BODY).

Markdown

Markdown works in text blocks, card.text, status.detail, and form help. Supported: bold, italic, strikethrough, inline code, code blocks, links, autolinks, ordered and unordered lists, quotes, headings, tables, and line breaks. A single newline makes a line break — Slack-style, not strict CommonMark. That is what most people expect. Not supported:
  • Raw HTML. It is stripped before drawing, never run.
  • Image syntax ![alt](url). It shows as a plain link — use the image block instead.
  • Footnotes and task-list checkboxes.
Links can only use https: or mailto:. Anything else — including javascript: and data: — shows as plain text. Every link opens in a new tab.
Unicode emoji pass through untouched. :shortcode: emoji are not translated.

Versions

block_kit_version is a string. New things are added inside "1" — new block types, new optional fields, higher limits. They will not break you. Unknown block types do not crash anything. They show as a placeholder in the app and are skipped on public pages. An old widget will not break when a new block ships.

Next

Every block type

All ten, with full schemas.

Limits and errors

Every limit, and what happens when you cross one.