Developer portal
Credentials, a minimal app, where to try the interactive demos, and the machine-readable copies of these docs for agents and tooling.
Everything needed to build against zoom-chat-adapter in one place. For the full
walkthrough, start with the Quickstart.
Credentials
The adapter authenticates to Zoom with your own Server-to-Server OAuth app and needs five values. Marketplace setup shows where each one lives in the Zoom dashboard.
| Environment variable | Where it comes from |
|---|---|
ZOOM_CLIENT_ID |
App Credentials |
ZOOM_CLIENT_SECRET |
App Credentials |
ZOOM_ACCOUNT_ID |
App Credentials |
ZOOM_ROBOT_JID |
Team Chat Subscription → Bot JID |
ZOOM_WEBHOOK_SECRET_TOKEN |
Features → Access → Token |
createZoomAdapter() reads all five from the environment. A missing one throws a
ValidationError naming the variable as soon as the adapter is constructed. To
supply them another way, see Configuration.
A minimal app
pnpm add zoom-chat-adapter chat @chat-adapter/state-memory
import { createMemoryState } from "@chat-adapter/state-memory";
import { Chat } from "chat";
import { createZoomAdapter } from "zoom-chat-adapter";
export const bot = new Chat({
userName: "mybot",
adapters: { zoom: createZoomAdapter() },
state: createMemoryState(),
});
bot.onNewMention(async (thread) => {
await thread.post("Hello from Zoom!");
});
import { after } from "next/server";
import { bot } from "@/lib/bot";
export async function POST(request: Request) {
return bot.webhooks.zoom(request, { waitUntil: after });
}
Pass the Request through untouched: reading the body first breaks the signature
check for every event. Chat also needs a state adapter, because it connects to
one during initialization.
Try it in the browser
The interactive demos run entirely in the page, with no Zoom account or credentials, and each sits beside the documentation it illustrates.
- Webhooks — what arrives at the endpoint and what the adapter returns.
- Thread IDs — decode a thread ID and see whether it is a channel or a DM.
- Formatting — the Markdown that goes over the wire, and what Zoom will not render.
For agents and tooling
The docs site publishes the same content in machine-readable forms, so nothing has
to be scraped out of HTML. Every URL below is relative to
https://zoom-chat-adapter.vercel.app.
| URL | What it returns |
|---|---|
/llms.txt |
An index of every page, with one-line descriptions |
/llms-full.txt |
The full Markdown of every page in one file |
/<route>.md |
Any page as raw Markdown, for example /quickstart.md |
/<route> with Accept: text/markdown |
The same Markdown at the page’s own URL |
/api/docs/pages.json |
Every page with its route, title, and description |
/openapi.json |
An OpenAPI description of the JSON API |
/agent-readability.json |
Every agent-facing artifact on this site |
/sitemap.xml, /robots.txt |
The crawlable URL set and the crawl policy |
A request for a page that does not exist answers 404 in the format the Accept
header asks for, so a broken link returns a short Markdown or JSON explanation
instead of a page of chrome.