---
title: Platform Adapters
description: Platform adapters connect your bot to messaging platforms such as Slack, Teams, and Google Chat.
docs_index: /llms.txt
lastUpdated: 2026-10-22
type: overview
prerequisites:
  - /docs/getting-started
  - /docs/adapters
---

> For an index of all documentation, see [/llms.txt](/llms.txt).

Platform adapters handle webhook verification, message parsing, and API calls for each messaging platform. Install only the adapters you need. Browse every available adapter, including community-built ones, on the [Adapters](/adapters) page.

Need a browser chat UI? See the [Web adapter](/adapters/official/web). It speaks the AI SDK UI stream protocol and works with React (`@ai-sdk/react`), Vue (`@ai-sdk/vue`), and Svelte (`@ai-sdk/svelte`), so one bot can serve Slack, Teams, and a browser chat UI.

## Feature matrix

This matrix covers Vercel-maintained [official adapters](/adapters) only. For vendor-official and community adapters, see each adapter's page.

> Partial support means the feature works with limitations. See individual adapter pages for details.

## How adapters work

Each adapter implements the `Adapter` interface, which the `Chat` class uses to route events and send messages. When a webhook arrives, the adapter:

1. Verifies the request signature.
2. Parses the platform-specific payload into a normalized `Message`.
3. Passes the message to the `Chat` class, which routes it to your handlers.

When your handler posts a reply, the adapter converts it from markdown, an AST, or a card into the platform's native format.

## Using multiple adapters

Register multiple [adapters](/adapters) and your event handlers work across all of them:

```typescript title="lib/bot.ts" lineNumbers
import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createTeamsAdapter } from "@chat-adapter/teams";
import { createGoogleChatAdapter } from "@chat-adapter/gchat";
import { createRedisState } from "@chat-adapter/state-redis";

const bot = new Chat({
  userName: "mybot",
  adapters: {
    slack: createSlackAdapter(),
    teams: createTeamsAdapter(),
    gchat: createGoogleChatAdapter(),
  },
  state: createRedisState(),
});

// This handler fires for mentions on any platform
bot.onNewMention(async (thread) => {
  await thread.subscribe();
  await thread.post("Hello!");
});
```

Each adapter reads its credentials from environment variables, so you only pass config to override them.

> This example uses Redis for state. See [State Adapters](/docs/state-adapters) for all available options.

Each adapter gets a webhook handler at `bot.webhooks.<name>`, keyed by the name you registered it under.

## Customizing an adapter via subclassing

Official adapters expose their extension points as `protected` members, so you can subclass an adapter to override or extend its behavior without forking the package. Use this to handle a payload type the built-in adapter doesn't cover, intercept verification, or wrap an existing handler.

```typescript title="lib/custom-telegram.ts" lineNumbers
import { TelegramAdapter, type TelegramUpdate } from "@chat-adapter/telegram";
import type { WebhookOptions } from "chat";

export class CustomTelegramAdapter extends TelegramAdapter {
  protected override processUpdate(
    update: TelegramUpdate,
    options?: WebhookOptions
  ): void {
    // Handle a payload type the base adapter doesn't, e.g. chat_join_request.
    if ("chat_join_request" in update) {
      this.logger.info("Received chat_join_request", { update });
      return;
    }
    super.processUpdate(update, options);
  }
}
```

Construct your subclass anywhere you'd construct the base adapter, for example `adapters: { telegram: new CustomTelegramAdapter({ ... }) }`. Members marked `private` stay inaccessible. If you need a hook that isn't `protected`, open an issue.

> `protected` members are broader than the public API and are not yet stable. Their signatures may change in minor releases. Pin the adapter version you build against, watch that adapter's changelog, and override the smallest hook that solves your problem so upgrades stay manageable. If you rely on a particular hook, open an issue so we can consider making it a stable, documented extension point.

#### [Build an adapter](/docs/contributing/building)

Implement the Adapter interface for any messaging platform.

#### [List a vendor-official adapter](/docs/contributing/vendor-official)

How platform vendors qualify and list a maintained adapter in the Vendor Official tier.

---

For a semantic overview of all documentation, see [/sitemap.md](/sitemap.md)

For an index of all available documentation, see [/llms.txt](/llms.txt)

For agent-facing discovery, including API and MCP surfaces, see [/agents.md](/agents.md)