Back to Blog
Developers

Slack Block Kit Markdown: mrkdwn, the Markdown Block and Lists

Block Kit text objects with type mrkdwn use Slack's own syntax: *bold*, _italic_, <url|text> links and <@U123> mentions. The markdown block takes standard markdown, with lists, headings and tables, up to 12,000 characters per payload. Syntax tables, JSON you can paste, bullet lists, links and mentions.

Slack Green Team
September 28, 2026
September 28, 2026
5 min read
Share:
slack api
block kit
markdown
developers

Slack Block Kit has two kinds of markup. A text object with "type": "mrkdwn", used in section and context blocks, reads Slack's own syntax: *bold*, _italic_, ~strike~, <https://example.com|link text> and <@U012AB3CD> for a mention. The markdown block, "type": "markdown", reads standard markdown instead: **bold**, [text](url), - lists, # headings and even tables, up to 12,000 characters across all markdown blocks in one message. If your text comes from an LLM or a README, use the markdown block. If you build the message yourself and need mentions, dates or buttons, use mrkdwn.

This page covers apps, bots and webhooks. People typing in Slack's composer can now use [text](link) in markup mode, but API and bot mrkdwn still needs <url|text>.

We build Slack Green, and our free Markdown to Slack converter turns standard markdown into mrkdwn when you cannot use the markdown block.

Slack Block Kit markdown: mrkdwn text objects and the markdown block

mrkdwn vs the markdown block

mrkdwn vs the markdown block: bold, italic, strikethrough, link, list, heading, table, limit
Stylemrkdwn text objectmarkdown block
Bold*bold***bold** or __bold__
Italic_italic_*italic* or _italic_
Strikethrough~strike~~~strike~~
LinkAngle brackets, shown below[text](https://x.com)
Bullet listNot supported, type •- item
Numbered listNot supported1. item
HeadingNot supported# Heading (all levels render the same size)
TableNot supportedPipe table
Code blockThree backticksThree backticks, with a language for highlighting
Limit3,000 characters per section text12,000 per payload, all markdown blocks together

The asterisk is the trap. *this* is bold in mrkdwn and italic in the markdown block. Text written for one reads wrong in the other.

The markdown block

Slack's reference describes the markdown block as the way to post markdown from an LLM without translating it yourself. Slack does the conversion, and one markdown block may turn into several blocks in the posted message.

{
  "blocks": [
    {
      "type": "markdown",
      "text": "## Deploy report\n**Status:** passed\n\n- api: 42 s\n- web: 1 min 10 s\n\n| Service | Version |\n| --- | --- |\n| api | 3.4.1 |\n| web | 3.4.0 |\n\n[Open the run](https://github.com/acme/app/actions)"
    }
  ]
}

Things to know:

  • • block_id is ignored and not kept.
  • • Images written as ![alt](url) turn into a link with the alt text, not an image. Use an image block for pictures.
  • • Task lists (- [ ]) and horizontal rules (---) render.
  • • Escape a markdown character with a backslash, such as \*not bold\*.
  • mrkdwn in section blocks

Never appear "away" on Slack again

Cloud-based. No downloads. Works 24/7 even when your laptop is off.

Most Block Kit layouts still use section blocks with a mrkdwn text object:

{
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Build failed* on `main`\n<https://github.com/acme/app/actions|Open the run> and ping <@U012AB3CD>"
      }
    }
  ]
}

Some fields only accept plain_text, such as header blocks and button labels. In those, asterisks stay asterisks. Slack's developer docs mark which fields allow which type. The top-level text of chat.postMessage uses mrkdwn by default; set "mrkdwn": false to turn formatting off.

mrkdwn special syntax: links, email, user mention, channel, user group, here and channel, local date, escaping
Link with text          <https://slack.green|Slack Green>
Email link              <mailto:hi@example.com|Email us>
Mention a user          <@U012AB3CD>
Link a channel          <#C123ABC456>
Mention a user group    <!subteam^SAZ94GDB8>
@here, @channel         <!here>  <!channel>  <!everyone>
Date in reader's zone   <!date^1727481600^{date_short} at {time}|Sep 28>

Mentions need IDs, not names; <@jane> does not work. Slack's docs add that a user mentioned by an app is notified only if they are already in the channel. Date strings are easier to build in our Slack timestamp generator, and the full link rules are in how to add a hyperlink in Slack.

Slack treats &, < and > as control characters. Replace them with &amp;, &lt; and &gt; in any text you pass through, and only those three.

Bullet lists in Block Kit

Which one to use: LLM text in a markdown block, your own templates in section blocks with mrkdwn, rich_text for real lists

Slack's formatting docs say plainly that there is no list syntax in app-published mrkdwn. You have three options:

  • Type the bullets. "• first\n• second" in a mrkdwn text. Looks like a list, but long items do not indent when they wrap.
  • Use the markdown block. - first works there.
  • Use a rich text block, which gives real, indented lists:
  • {
      "type": "rich_text",
      "elements": [
        {
          "type": "rich_text_list",
          "style": "bullet",
          "elements": [
            { "type": "rich_text_section", "elements": [{ "type": "text", "text": "first item" }] },
            { "type": "rich_text_section", "elements": [{ "type": "text", "text": "second item" }] }
          ]
        }
      ]
    }

    Use "style": "ordered" for a numbered list. People typing in Slack get lists from the composer; see how to make bullet points in Slack.

    Test before you send

    Never appear "away" on Slack again

    Cloud-based. No downloads. Works 24/7 even when your laptop is off.

    Paste any payload into Slack's Block Kit Builder to see it rendered. For the mrkdwn part alone, our Slack message formatter previews the text. If formatting shows up as raw asterisks, Slack markdown not working lists the causes. Length limits for each field are in Slack message character limit, and tables are in how to make a table in Slack.

    To post a whole markdown file, such as a README, create a canvas from it instead; see Slack markdown file preview.

    FAQ

    Does Slack Block Kit support markdown? Yes, two ways: mrkdwn text objects with Slack's own syntax, and the markdown block with standard markdown.

    What is the difference between mrkdwn and markdown in Slack? mrkdwn is Slack's syntax: *bold*, <url|text>. The markdown block reads standard markdown: **bold**, [text](url).

    How do I make a bullet list in Block Kit? Use - item in a markdown block, or a rich_text block with a rich_text_list. mrkdwn has no list syntax.

    How do I mention a user in Block Kit? <@U012AB3CD> with the user ID, inside a mrkdwn text.

    How long can a markdown block be? 12,000 characters for all markdown blocks in one payload together.

    Always Active

    Stop Jiggling Your Mouse.

    Join hundreds of remote workers who never worry about their Slack status. Set it up once, stay green forever.

    Related Articles

    Developers

    Slack Huddle API: What Apps Can Read and Do

    Slack has no API to start, join or record a huddle. Apps can read whether a user is in one from huddle_state on the user profile, see which channel from huddle_state_channel_id, and get the user_huddle_changed event when it changes. Code for both, plus audit log events on Enterprise.

    Slack Green Team•5 min read
    Developers

    How to Create a Slack Webhook URL in 4 Steps

    Create a Slack app at api.slack.com/apps, turn on Incoming Webhooks, click Add New Webhook to Workspace and pick a channel. Slack gives you a hooks.slack.com URL that posts to that channel. Private channels, DMs, several channels, the Workflow Builder alternative, and the errors you may see.

    Slack Green Team•5 min read
    Guides

    Slack Markdown File Preview: How to Read .md Files in Slack

    Slack shows an uploaded .md file as raw text, with the # and ** characters visible. To read it formatted, paste the rendered text into a canvas, create the canvas from markdown with the API, or send it in a markdown block. HTML files and Mermaid diagrams do not render either; the workarounds are below.

    Slack Green Team•5 min read