Python wrapper for the Slack Blocks API
Project description
slackblocks 
Build Slack messages in Python — without writing JSON by hand.
slackblocks is a typed, validating Python wrapper around the Slack Block Kit API. It exists because Block Kit JSON is verbose, easy to get subtly wrong, and unpleasant to maintain in source control.
Why slackblocks?
- Concise —
SectionBlock("Hello, *world*!")instead of a 10-line JSON object. - Validated — character limits, required fields, mutually-exclusive options, and element-type restrictions are enforced at construction time, so you find out before hitting Slack's API.
- Drop-in compatible with both the official
slack-sdkand the legacyslackclient— unpack aMessagedirectly intoclient.chat_postMessage(**message). - Typed — full type hints; ships
py.typed. - Zero runtime dependencies.
Installation
pip install slackblocks
Requires Python 3.8.1 or newer.
Quickstart
from slackblocks import (
ActionsBlock,
Button,
DividerBlock,
HeaderBlock,
Message,
SectionBlock,
)
message = Message(
channel="#general",
text="Build #482 passed", # plain-text fallback for notifications
blocks=[
HeaderBlock("Build #482 passed :white_check_mark:"),
SectionBlock(
fields=[
"*Branch*\n`main`",
"*Author*\n@nick",
"*Duration*\n3m 12s",
"*Tests*\n1,247 passed",
],
),
DividerBlock(),
ActionsBlock(
elements=[
Button(text="View build", action_id="view", url="https://ci.example.com/482"),
Button(text="Re-run", action_id="rerun", value="482", style="primary"),
],
),
],
)
message can be sent in one line with the official Slack SDK:
import os
from slack_sdk import WebClient
client = WebClient(token=os.environ["SLACK_API_TOKEN"])
client.chat_postMessage(**message)
The ** operator unpacks slackblocks Message objects directly into the SDK call — no to_dict() boilerplate required.
What's supported
| Surface | Status |
|---|---|
| Blocks | ✅ All current block types (Section, Header, Divider, Image, Context, Actions, Input, RichText, File, Table) |
| Elements | ✅ Buttons, all select menus, date/time pickers, checkboxes, radio groups, all input types, overflow menus, workflow buttons |
| Composition Objects | ✅ Text, Option, Confirm, Conversation/Dispatch filters, Workflow, Trigger |
| Rich Text | ✅ Sections, lists, quotes, code blocks, inline links/users/channels/emoji |
| Modals & Home Tabs | ✅ Full views API |
| Messages | ✅ chat.postMessage, webhook messages, slash-command/interaction responses, threaded replies, ephemeral messages |
| Attachments | ⚠️ Supported but deprecated by Slack |
Documentation
- Full docs: https://nicklambourne.github.io/slackblocks/
- Installation
- Using Blocks — every block type with code, JSON, and screenshots.
- Sending Messages
- Cookbook — end-to-end recipes for build notifications, approval requests, modals, and more.
- Troubleshooting & FAQ
Comparison with slack-sdk block classes
The official slack-sdk ships its own block classes. slackblocks predates them and offers a more concise API, stricter up-front validation, and independent versioning. They produce equivalent JSON; pick whichever you find more ergonomic.
# slackblocks
SectionBlock("Hello, *world*!")
# slack-sdk equivalent
from slack_sdk.models.blocks import SectionBlock as SDKSectionBlock
from slack_sdk.models.blocks.basic_components import MarkdownTextObject
SDKSectionBlock(text=MarkdownTextObject(text="Hello, *world*!"))
Licensing
slackblocks is dual-licensed under MIT and BSD-3-Clause. Use whichever fits your project — this makes it safe to vendor into projects under either license.
Contributing
Contributions are welcome. Quick start (the project uses uv for dependency management):
git clone https://github.com/nicklambourne/slackblocks.git
cd slackblocks
uv sync --all-groups
uv run pytest test/unit
uv run black . --check
uv run flake8 slackblocks
uv run mypy slackblocks
Preview the documentation locally with uv run mkdocs serve.
For the full development guide — testing conventions, validation patterns, docstring style, release process, and a PR checklist — see the Contributing page.
Bug reports and feature requests: https://github.com/nicklambourne/slackblocks/issues.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file slackblocks-1.2.5.tar.gz.
File metadata
- Download URL: slackblocks-1.2.5.tar.gz
- Upload date:
- Size: 1.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f2842bf25c5ce427fdacf6799891fba6667c9a336a2bb8379185cd3abde00ba
|
|
| MD5 |
f0239dc907ab99a349bd7b6054563fa6
|
|
| BLAKE2b-256 |
789eb8e144a18bef620d5455acb8952ad3f3112ca8093b913bb8222ff0e56439
|
File details
Details for the file slackblocks-1.2.5-py3-none-any.whl.
File metadata
- Download URL: slackblocks-1.2.5-py3-none-any.whl
- Upload date:
- Size: 39.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
531e4ec8ad4dbfa5f67f547eea1a35ac77091d68fe6b28aaa8b2533fd70a86a1
|
|
| MD5 |
46f89629c22ad1b9297a2edc906d5c45
|
|
| BLAKE2b-256 |
852fc4bca639b3748712d80d9dba633863da857fcc54c58ca2454cce408c2fa7
|