Chat SDK now ships the Slack adapter's primitives as standalone imports for apps that already handle their own routing, state, or workflow execution.

Use only what you need:

  • Request verification and payload parsing (@chat-adapter/slack/webhook)

  • Markdown formatting (@chat-adapter/slack/format)

  • Fetch-based Web API calls (@chat-adapter/slack/api)

  • Block Kit conversion (@chat-adapter/slack/blocks)

Each subpath skips the full Chat runtime, so your imports stay clean.

import { readSlackWebhook } from "@chat-adapter/slack/webhook";

import { postSlackMessage } from "@chat-adapter/slack/api";

export async function POST(request: Request) {

const payload = await readSlackWebhook(request, {

signingSecret: process.env.SLACK_SIGNING_SECRET!,

});

if (payload.kind === "app_mention") {

await postSlackMessage({

channel: payload.continuation.channelId,

markdownText: `received: ${payload.text}`,

token: process.env.SLACK_BOT_TOKEN!,

});

}

return new Response(null, { status: 200 });

}

Verifying a webhook and posting a reply with the low-level subpaths.

To get started, read the Slack primitives documentation.

The Complete Guide to Chat SDK

Learn how Chat SDK works end-to-end: from core concepts to building your first bot to deploying it across platforms.

Read the guide