I tried the new blocks of Slack Block Kit [Data Edition]

I tried the new blocks of Slack Block Kit [Data Edition]

Introducing new blocks added to Slack Block Kit. We will explain the features and implementation examples of the data table block, which allows you to create tables with sorting and pagination support, and the data visualization block, which can render charts using only JSON.
2026.08.30

This page has been translated by machine translation. View original

Since 2026, new blocks have been added one after another to Slack's Block Kit. In this series, we will introduce these new blocks while actually trying them out.

  • Part 1: Data Edition (this article)
  • Part 2: General Display Edition
  • Part 3: Agent Edition
  • Part 4: Streaming Edition
  • Part 5: Validation & CI Edition

For this first installment, we'll use the data table block and data visualization block to convert aggregated results into tables and charts and post them to a channel.

For the basics of Block Kit, please refer to the following article.

https://dev.classmethod.jp/articles/slack-building-block-kit/

Overview of the Two Blocks

The data table block is a table block added on May 20, 2026 that supports pagination, sorting, and filtering[1].

Previously, to display a table in Slack, you had to manually align columns using mrkdwn code blocks or use the table block[^2]. However, neither of these allowed for interactive operations. With the data table block, you can sort columns and paginate without complex configuration.

The data visualization block is a chart block added on June 16, 2026 that supports four chart types: pie / bar / area / line[2].

Until now, the standard approach for charts was to have the app generate an image using matplotlib or similar tools and upload it via the files.upload API. With the data visualization block, you simply pass JSON to the blocks parameter of chat.postMessage, and rendering is handled by the Slack client. This means no image generation code and no upload round trips are needed. How convenient!

data table block Specifications[3]

Item Details
Number of rows Minimum 2 including header, maximum 201
Number of columns Minimum 1, maximum 20. All rows must have the same number of elements
Cell types 3 types: rich_text / raw_text / raw_number
Header The first row is the header. rich_text cannot be used in header cells
caption Required. Used as the value of the HTML caption element
page_size 1–100. Defaults to 5 if omitted
Character limit 20,000 characters total across all cells per table and per entire message. Split the message if exceeded

Note that sorting is alphabetical by default, but numeric sorting applies only when all cells in a column are raw_number. The key point is to send numeric columns in aggregated results as raw_number rather than strings.

data visualization block Specifications[4]

Item Details
Chart types 4 types: pie / bar / area / line
Number of blocks Up to 2 blocks per message
title Required. Maximum 50 characters
pie Minimum 1, maximum 12 segments. value must be greater than 0 and is rendered as a proportion of the total of all segments
bar / area / line Minimum 1, maximum 12 series, axis_config is required. Maximum 20 data points per series
Label character limits Each element of segment label, series name, data point label, and axis_config.categories is up to 20 characters. x_label and y_label are up to 50 characters

Runtime validation rules specify that all data point label values must match one of the axis_config.categories, series cannot omit data points corresponding to categories, and series names must not be duplicated.

Trying It Out

We'll use hypothetical data showing the number of inquiries over the past 5 weeks, broken down by Web and app channels. This time, instead of building an app, we'll validate by pasting JSON into the Block Kit Builder.

For details on Block Kit Builder, please refer to the following article.

https://dev.classmethod.jp/articles/tips-slack-bot-block-kit-builder/

data table block

{
  "blocks": [
    {
      "type": "data_table",
      "caption": "週次問い合わせ件数",
      "page_size": 3,
      "rows": [
        [
          { "type": "raw_text", "text": "週" },
          { "type": "raw_text", "text": "Web" },
          { "type": "raw_text", "text": "アプリ" }
        ],
        [
          { "type": "raw_text", "text": "6/29 週" },
          { "type": "raw_number", "value": 42, "text": "42" },
          { "type": "raw_number", "value": 31, "text": "31" }
        ],
        [
          { "type": "raw_text", "text": "7/6 週" },
          { "type": "raw_number", "value": 55, "text": "55" },
          { "type": "raw_number", "value": 28, "text": "28" }
        ],
        [
          { "type": "raw_text", "text": "7/13 週" },
          { "type": "raw_number", "value": 38, "text": "38" },
          { "type": "raw_number", "value": 45, "text": "45" }
        ],
        [
          { "type": "raw_text", "text": "7/20 週" },
          { "type": "raw_number", "value": 61, "text": "61" },
          { "type": "raw_number", "value": 39, "text": "39" }
        ],
        [
          { "type": "raw_text", "text": "7/27 週" },
          { "type": "raw_number", "value": 47, "text": "47" },
          { "type": "raw_number", "value": 52, "text": "52" }
        ]
      ]
    }
  ]
}

data table block

Clicking a column header sorts the table. Also, since page_size is set to 3, the 5 rows of data are split across 2 pages, and a pagination UI is displayed. When omitted, the default is 5 rows per page.

data visualization block

Let's turn the same data into a line chart.

{
  "blocks": [
    {
      "type": "data_visualization",
      "title": "問い合わせ件数の推移",
      "chart": {
        "type": "line",
        "series": [
          {
            "name": "Web",
            "data": [
              { "label": "6/29 週", "value": 42 },
              { "label": "7/6 週", "value": 55 },
              { "label": "7/13 週", "value": 38 },
              { "label": "7/20 週", "value": 61 },
              { "label": "7/27 週", "value": 47 }
            ]
          },
          {
            "name": "アプリ",
            "data": [
              { "label": "6/29 週", "value": 31 },
              { "label": "7/6 週", "value": 28 },
              { "label": "7/13 週", "value": 45 },
              { "label": "7/20 週", "value": 39 },
              { "label": "7/27 週", "value": 52 }
            ]
          }
        ],
        "axis_config": {
          "categories": ["6/29 週", "7/6 週", "7/13 週", "7/20 週", "7/27 週"],
          "x_label": "週",
          "y_label": "件数"
        }
      }
    }
  ]
}

A line chart displayed in the Block Kit Builder preview

Hovering over the chart displays the number of inquiries for that week in a tooltip.

Differences from the Existing table block

Let me summarize the schema-level differences between the table block mentioned in the overview and the data table block.

Item table block data table block
Sorting None Available
Pagination None Available. Row count specified with page_size
Column formatting Alignment and wrapping specified via column_settings None
Character limit 10,000 characters 20,000 characters
caption None Required

Since the data table block does not have column_settings, you'll need to use the table block when column formatting such as right-alignment is required.

Summary

By leveraging the data table block and data visualization block, you can easily display sortable tables and charts in Slack simply by assembling your aggregated results into JSON.

If you have any periodic report apps that already use tables or charts, why not consider migrating to these new blocks?

In the next installment, Part 2, we'll try out general display blocks. Stay tuned!

脚注
  1. https://docs.slack.dev/changelog/2026/05/20/block-kit-more-new-blocks/ ↩︎

  2. https://docs.slack.dev/changelog/2026/06/16/block-kit-data-visualization-block/ ↩︎

  3. https://docs.slack.dev/reference/block-kit/blocks/data-table-block ↩︎

  4. https://docs.slack.dev/reference/block-kit/blocks/table-block ↩︎

Share this article