Zoom Plugin
Skill 139 of 200
Reference skill for Zoom Team Chat.
7 minutes · 1,481 words · 74 sections
Install
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-team-chat-appnpx skills add anthropics/knowledge-work-plugins/plugin marketplace add anthropics/knowledge-work-pluginsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Background reference for Zoom Team Chat integrations. Use this after the workflow is clear, especially when the Team Chat API versus Chatbot API distinction matters.
There are two different integration types and they are not interchangeable:
Team Chat API (user type)
authorization_code)/v2/chat/users/...Chatbot API (bot type)
client_credentials)/v2/im/chat/messagesIf you choose the wrong type early, auth/scopes/endpoints all mismatch and implementation fails.
Official Documentation: https://developers.zoom.us/docs/team-chat/ (opens in a new tab)
Chatbot Documentation: https://developers.zoom.us/docs/team-chat/chatbot/extend/ (opens in a new tab)
API Reference: https://developers.zoom.us/docs/api/rest/reference/chatbot/ (opens in a new tab)
New to Team Chat? Follow this path:
Reference:
Having issues?
OAuth endpoint sanity check:
https://zoom.us/oauth/authorizehttps://zoom.us/oauth/token/oauth/token returns 404/HTML, use https://zoom.us/oauth/token.Building Interactive Bots?
| Use Case | API to Use |
|---|---|
| Send notifications from scripts/CI/CD | Team Chat API |
| Automate messages as a user | Team Chat API |
| Build an interactive chatbot | Chatbot API |
| Respond to slash commands | Chatbot API |
| Create messages with buttons/forms | Chatbot API |
| Handle user interactions | Chatbot API |
POST https://api.zoom.us/v2/chat/users/me/messageschat_message:write, chat_channel:readPOST https://api.zoom.us/v2/im/chat/messagesimchat:bot (auto-added)⚠️ Do NOT use Server-to-Server OAuth - S2S apps don’t have the Chatbot/Team Chat feature. Only General App (OAuth) supports chatbots.
From Zoom Marketplace → Your App:
| Credential | Location | Used By |
|---|---|---|
| Client ID | App Credentials → Development | Both APIs |
| Client Secret | App Credentials → Development | Both APIs |
| Account ID | App Credentials → Development | Chatbot API |
| Bot JID | Features → Chatbot → Bot Credentials | Chatbot API |
| Secret Token | Features → Team Chat Subscriptions | Chatbot API |
See: Environment Setup Guide (opens in a new tab) for complete configuration steps.
Send a message as a user:
// 1. Get access token via OAuth
const accessToken = await getOAuthToken(); // See examples/oauth-setup.md
// 2. Send message to channel
const response = await fetch('https://api.zoom.us/v2/chat/users/me/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
message: 'Hello from CI/CD pipeline!',
to_channel: 'CHANNEL_ID'
})
});
const data = await response.json();
// { "id": "msg_abc123", "date_time": "2024-01-15T10:30:00Z" }Complete example: Send Message Guide (opens in a new tab)
Build an interactive chatbot:
// 1. Get chatbot token (client_credentials)
async function getChatbotToken() {
const credentials = Buffer.from(
`${CLIENT_ID}:${CLIENT_SECRET}`
).toString('base64');
const response = await fetch('https://zoom.us/oauth/token', {
method: 'POST',
headers: {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'grant_type=client_credentials'
});
return (await response.json()).access_token;
}
// 2. Send chatbot message with buttons
const response = await fetch('https://api.zoom.us/v2/im/chat/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
robot_jid: process.env.ZOOM_BOT_JID,
to_jid: payload.toJid, // From webhook
account_id: payload.accountId, // From webhook
content: {
head: {
text: 'Build Notification',
sub_head: { text: 'CI/CD Pipeline' }
},
body: [
{ type: 'message', text: 'Deployment successful!' },
{
type: 'fields',
items: [
{ key: 'Branch', value: 'main' },
{ key: 'Commit', value: 'abc123' }
]
},
{
type: 'actions',
items: [
{ text: 'View Logs', value: 'view_logs', style: 'Primary' },
{ text: 'Dismiss', value: 'dismiss', style: 'Default' }
]
}
]
}
})
});Complete example: Chatbot Setup Guide (opens in a new tab)
| Feature | Description |
|---|---|
| Send Messages | Post messages to channels or direct messages |
| List Channels | Get user’s channels with metadata |
| Create Channels | Create public/private channels programmatically |
| Threaded Replies | Reply to specific messages in threads |
| Edit/Delete | Modify or remove messages |
| Feature | Description |
|---|---|
| Rich Message Cards | Headers, images, fields, buttons, forms |
| Slash Commands | Custom /commands trigger webhooks |
| Button Actions | Interactive buttons with webhook callbacks |
| Form Submissions | Collect user input with forms |
| Dropdown Selects | Channel, member, date/time pickers |
| LLM Integration | Easy integration with Claude, GPT, etc. |
| Event | Trigger | Use Case |
|---|---|---|
bot_notification | User messages bot or uses slash command | Process commands, integrate LLM |
bot_installed | Bot added to account | Initialize bot state |
interactive_message_actions | Button clicked | Handle button actions |
chat_message.submit | Form submitted | Process form data |
app_deauthorized | Bot removed | Cleanup |
See: Webhook Events Reference (opens in a new tab)
Build rich interactive messages with these components:
| Component | Description |
|---|---|
| header | Title and subtitle |
| message | Plain text |
| fields | Key-value pairs |
| actions | Buttons (Primary, Danger, Default styles) |
| section | Colored sidebar grouping |
| attachments | Images with links |
| divider | Horizontal line |
| form_field | Text input |
| dropdown | Select menu |
| date_picker | Date selection |
See: Message Cards Reference (opens in a new tab) for complete component catalog
User types /command → Webhook receives bot_notification
↓
payload.cmd = "user's input"
↓
Process command
↓
Send response via sendChatbotMessage()case 'bot_notification': {
const { toJid, cmd, accountId } = payload;
// 1. Call your LLM
const llmResponse = await callClaude(cmd);
// 2. Send response back
await sendChatbotMessage(toJid, accountId, {
body: [{ type: 'message', text: llmResponse }]
});
}See: LLM Integration Guide (opens in a new tab)
| Sample | Description | Link |
|---|---|---|
| Chatbot Quickstart | Official tutorial (recommended start) | GitHub (opens in a new tab) |
| Claude Chatbot | AI chatbot with Anthropic Claude | GitHub (opens in a new tab) |
| Unsplash Chatbot | Image search with database | GitHub (opens in a new tab) |
| ERP Chatbot | Oracle ERP with scheduled alerts | GitHub (opens in a new tab) |
| Task Manager | Full CRUD app | GitHub (opens in a new tab) |
See: Sample Applications Guide (opens in a new tab) for analysis of all 10 samples
// Team Chat API
await fetch('https://api.zoom.us/v2/chat/users/me/messages', {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` },
body: JSON.stringify({
message: 'Hello!',
to_channel: 'CHANNEL_ID'
})
});// Webhook handler
case 'interactive_message_actions': {
const { actionItem, toJid, accountId } = payload;
if (actionItem.value === 'approve') {
await sendChatbotMessage(toJid, accountId, {
body: [{ type: 'message', text: '✅ Approved!' }]
});
}
}function verifyWebhook(req) {
const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`;
const hash = crypto.createHmac('sha256', process.env.ZOOM_VERIFICATION_TOKEN)
.update(message)
.digest('hex');
return req.headers['x-zm-signature'] === `v0=${hash}`;
}# Install ngrok
npm install -g ngrok
# Expose local server
ngrok http 4000
# Use HTTPS URL as Bot Endpoint URL in Zoom Marketplace
# Example: https://abc123.ngrok.io/webhookSee: Deployment Guide (opens in a new tab) for:
| Limit | Value |
|---|---|
| Message length | 4,096 characters |
| File size | 512 MB |
| Members per channel | 10,000 |
| Channels per user | 500 |
x-zm-signature headeruser@domain or channel@domainSee: Security Best Practices (opens in a new tab)
Need help? Start with Integrated Index section below for complete navigation.
This section was migrated from SKILL.md.
Complete navigation guide for the Zoom Team Chat skill.
For sending messages as a user account.
For building interactive chatbots with rich messages.
Essential understanding for both APIs.
| Document | Description |
|---|---|
| API Selection Guide (opens in a new tab) | Choose Team Chat API vs Chatbot API |
| Environment Setup (opens in a new tab) | Complete credentials and app configuration |
| Authentication Flows (opens in a new tab) | OAuth vs Client Credentials |
| Webhook Architecture (opens in a new tab) | How webhooks work (Chatbot API) |
| Message Card Structure (opens in a new tab) | Card component hierarchy |
| Deployment Guide (opens in a new tab) | Production deployment strategies |
| Security Best Practices (opens in a new tab) | Secure your integration |
Working code for common scenarios.
| Example | Description |
|---|---|
| OAuth Setup (opens in a new tab) | User OAuth flow implementation |
| Token Management (opens in a new tab) | Refresh tokens, expiration handling |
| Example | Description |
|---|---|
| Send Message (opens in a new tab) | Team Chat API message sending |
| Chatbot Setup (opens in a new tab) | Complete chatbot with webhooks |
| List Channels (opens in a new tab) | Get user’s channels |
| Create Channel (opens in a new tab) | Create public/private channels |
| Example | Description |
|---|---|
| Button Actions (opens in a new tab) | Handle button clicks |
| Form Submissions (opens in a new tab) | Process form data |
| Slash Commands (opens in a new tab) | Create custom commands |
| Dropdown Selects (opens in a new tab) | Channel/member pickers |
| Example | Description |
|---|---|
| LLM Integration (opens in a new tab) | Integrate Claude/GPT |
| Scheduled Alerts (opens in a new tab) | Cron + incoming webhooks |
| Database Integration (opens in a new tab) | Store conversation state |
| Multi-Step Workflows (opens in a new tab) | Complex user interactions |
| Reference | Description |
|---|---|
| API Reference (opens in a new tab) | Pointers and common endpoints |
| Webhook Events (opens in a new tab) | Event types and handling checklist |
| Message Cards (opens in a new tab) | All card components |
| Error Codes (opens in a new tab) | Error handling guide |
| Reference | Description |
|---|---|
| Sample Applications (opens in a new tab) | Sample app index/notes |
| Reference | Description |
|---|---|
| JID Formats (opens in a new tab) | Understanding JID identifiers |
| Scopes Reference (opens in a new tab) | Common scopes |
| Rate Limits (opens in a new tab) | Throttling guidance |
| Guide | Description |
|---|---|
| Common Issues (opens in a new tab) | Quick diagnostics and solutions |
| OAuth Issues (opens in a new tab) | Authentication failures |
| Webhook Issues (opens in a new tab) | Webhook debugging |
| Message Issues (opens in a new tab) | Message sending problems |
| Deployment Issues (opens in a new tab) | Production problems |
User Action → Webhook → Process → ResponseUser Input → Chatbot receives → Call LLM → Send responseRequest → Send card with buttons → User clicks → Update status → NotifyUse this SKILL.md as the navigation hub for Team Chat API selection, setup, examples, and troubleshooting.
.env keys and where to find each value.Reference skill for Zoom Team Chat. Use after routing to a chat workflow when building user-scoped messaging integrations, chatbot experiences, rich cards, buttons, slash commands, or chat webhooks.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 23 September 2026.SKILL.md, not by matching a directory convention. 27 distinct layouts observed: bio-research/skills/*/SKILL.md, cowork-plugin-management/skills/*/SKILL.md, customer-support/skills/*/SKILL.md, data/skills/*/SKILL.md, design/skills/*/SKILL.md, engineering/skills/*/SKILL.md, enterprise-search/skills/*/SKILL.md, finance/skills/*/SKILL.md, human-resources/skills/*/SKILL.md, legal/skills/*/SKILL.md, marketing/skills/*/SKILL.md, operations/skills/*/SKILL.md, partner-built/apollo/skills/*/SKILL.md, partner-built/brand-voice/skills/*/SKILL.md, partner-built/common-room/skills/*/SKILL.md, partner-built/slack/skills/*/SKILL.md, partner-built/zoom-plugin/skills/*/SKILL.md, partner-built/zoom-plugin/skills/contact-center/*/SKILL.md, partner-built/zoom-plugin/skills/meeting-sdk/*/SKILL.md, partner-built/zoom-plugin/skills/meeting-sdk/web/*/SKILL.md, partner-built/zoom-plugin/skills/video-sdk/*/SKILL.md, partner-built/zoom-plugin/skills/virtual-agent/*/SKILL.md, partner-built/zoom-plugin/skills/zoom-mcp/*/SKILL.md, pdf-viewer/skills/*/SKILL.md, product-management/skills/*/SKILL.md, productivity/skills/*/SKILL.md, sales/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Anthropic, declaring 120 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./anthropics/knowledge-work-plugins.md, and each skill at its own .md URL.37 files · 91 KB
Everything this skill ships beside its prose. All of it is set here, as subchapters of skill 139.
Documentation the agent loads on demand, rather than up front.
Everything else published alongside the skill.
concepts/7 files · 31 KBexamples/13 files · 18 KBtroubleshooting/5 files · 12 KB