Skip to content
Esc
↑↓navigate↵open⌘Jpreview
On this page

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.

Where to go next

Was this page helpful?