Supports development of Zoom Team Chat apps, covering both user-level messaging and bot-level webhook integrations.
Install
mkdir -p .claude/skills/zoom-team-chat && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16412" && unzip -o skill.zip -d .claude/skills/zoom-team-chat && rm skill.zipInstalls to .claude/skills/zoom-team-chat
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Zoom Team Chat - Build messaging integrations, chatbots with rich cards/buttons, and apps. Covers Team Chat API (user-level messaging) and Chatbot API (bot-level interactions with webhooks).Key capabilities
- →Send messages as an authenticated user via Team Chat API.
- →Send messages as a bot identity via Chatbot API.
- →Build interactive chatbots with rich cards and buttons.
- →Handle user interactions and form submissions.
- →Process slash commands.
- →Configure webhooks for event reception.
How it works
The skill guides the implementation of Zoom Team Chat integrations by distinguishing between the Team Chat API (user-level) and Chatbot API (bot-level) and providing setup steps for each.
Inputs & outputs
When to use zoom-team-chat
- →Building Zoom chatbot apps
- →Implementing slash commands
- →Integrating webhooks for messaging
- →Managing team chat channel interactions
About this skill
Zoom Team Chat Development
Build powerful messaging integrations and interactive chatbots for Zoom Team Chat. This skill covers two distinct APIs - make sure to choose the right one for your use case.
For agent-driven MCP tooling that sends/edits messages or manages Team Chat channels through Zoom's hosted MCP server, use ../zoom-mcp/team-chat/SKILL.md. Keep this skill as the default for deterministic REST API implementation, chatbot apps, webhooks, retry logic, and production backend control.
Read This First (Critical)
There are two different integration types and they are not interchangeable:
-
Team Chat API (user type)
- Sends messages as a real authenticated user
- Uses User OAuth (
authorization_code) - Endpoint family:
/v2/chat/users/...
-
Chatbot API (bot type)
- Sends messages as your bot identity
- Uses Client Credentials (
client_credentials) - Endpoint family:
/v2/im/chat/messages
If you choose the wrong type early, auth/scopes/endpoints all mismatch and implementation fails.
Official Documentation: https://developers.zoom.us/docs/team-chat/
Chatbot Documentation: https://developers.zoom.us/docs/team-chat/chatbot/extend/
API Reference: https://developers.zoom.us/docs/api/rest/reference/chat/methods/#overview
Chatbot API Reference: https://developers.zoom.us/docs/api/rest/reference/chatbot/methods/#overview
The current Team Chat API Hub inventory contains 109 operations (verified 2026-07-10), including channel-owner reassignment and channel-tab migration. Use the generated Team Chat API reference for exact current paths. For the separate 20-tool hosted MCP surface, use Zoom Team Chat MCP.
Quick Links
New to Team Chat? Follow this path:
- Get Started - End-to-end fast path (user type vs bot type)
- Choose Your API - Team Chat API vs Chatbot API
- Environment Setup - Credentials, scopes, app configuration
- OAuth Setup - Complete authentication flow
- Send First Message - Working code to send messages
Reference:
- Chatbot Message Cards - Complete card component reference
- Webhook Events - All webhook event types
- API Reference - Endpoints, methods, parameters
- Sample Applications - 10+ official sample apps
- Integrated Index - see the section below in this file
Having issues?
- Authentication errors → OAuth Troubleshooting
- Webhook not receiving events → Webhook Setup Guide
- Messages not sending → Common Issues
- Start with quick checks → 5-Minute Runbook
OAuth endpoint sanity check:
- Authorize URL:
https://zoom.us/oauth/authorize - Token URL:
https://zoom.us/oauth/token - If
/oauth/tokenreturns 404/HTML, usehttps://zoom.us/oauth/token.
Building Interactive Bots?
- Button Actions - Handle button clicks
- Form Submissions - Process form data
- Slash Commands - Create custom commands
Quick Decision: Which API?
| 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 |
Team Chat API (User-Level)
- Messages appear as sent by authenticated user
- Requires User OAuth (authorization_code flow)
- Endpoint:
POST https://api.zoom.us/v2/chat/users/me/messages - Scopes:
chat_message:write,chat_channel:read
Chatbot API (Bot-Level)
- Messages appear as sent by your bot
- Requires Client Credentials grant
- Endpoint:
POST https://api.zoom.us/v2/im/chat/messages - Scopes:
imchat:bot(auto-added) - Rich cards: buttons, forms, dropdowns, images
Chatbot Message Rules (Non-Negotiable)
- Obtain the bearer token with
grant_type=client_credentials. - Do not use an authorization-code/user OAuth token for
/im/chat/messages. - Build the reply from the incoming
bot_notificationpayload. Preserve itstoJid,userJid, andaccountIdvalues:
{
"robot_jid": "<configured Bot JID>",
"to_jid": "<payload.toJid>",
"user_jid": "<payload.userJid>",
"account_id": "<payload.accountId>",
"content": {
"body": [{ "type": "message", "text": "Response text" }]
}
}
- A webhook HTTP 200 confirms event receipt only. It does not prove that the
chatbot reply succeeded. Log and inspect the outbound
/im/chat/messagesHTTP status and response body, then verify the reply is visible in Team Chat. - For HTTP 401 with code
7010, check for mixed development/production credentials, a Bot JID from the wrong environment, or credentials and Bot JID belonging to different Marketplace apps.
Prerequisites
System Requirements
- Zoom account
- Account owner, admin, or Zoom for developers role enabled
- To enable: User Management → Roles → Role Settings → Advanced features → Enable Zoom for developers
Create Zoom App
- Go to Zoom App Marketplace
- Click Develop → Build App
- Select General App (OAuth)
⚠️ Do NOT use Server-to-Server OAuth for a chatbot. S2S apps cannot enable the Team Chat chatbot/subscription feature. S2S can still call supported Team Chat admin REST APIs.
Need to create the General App by API or manifest? Use Marketplace app management first. It covers Team Chat manifest requirements such as
imchat:bot,team_chat_subscription,slash_command.development_message_url, shortcutaction_types, and app-ownedclient_credentialsscopes. Select the user, admin, S2S, or chatbot variant from the Marketplace template selector.
Required Credentials
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 for complete configuration steps.
Quick Start: Team Chat API
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
Quick Start: Chatbot API
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
user_jid: payload.userJid, // 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' }
]
}
]
}
})
});
const responseBody = await response.text();
console.log('Chatbot API response:', response.status, responseBody);
if (!response.ok) {
throw new Error(`Chatbot reply failed (${response.status}): ${responseBody}`);
}
The webhook response is separate from this outbound API response. Treat the chatbot flow as successful only after this request is accepted and the message is visible in Team Chat.
Complete example: Chatbot Setup Guide
Key Features
Team Chat API
| Feature | Description |
|---|---|
| Send Messages | Post messages to channels or direct messages |
| List Channels | Get user's ch |
Content truncated.
When not to use it
- →When using agent-driven MCP tooling for sending/editing messages or managing Team Chat channels.
- →When the task is not related to Zoom Team Chat or Chatbot API development.
Prerequisites
Limitations
- →Server-to-Server OAuth cannot enable the Team Chat chatbot/subscription feature.
- →Requires careful selection between Team Chat API and Chatbot API as they are not interchangeable.
- →Complex formatting or specific features might require consulting the official documentation.
How it compares
This workflow provides specific guidance for Zoom's two distinct messaging APIs, ensuring the correct authentication and endpoints are used for user-level or bot-level interactions.
Compared to similar skills
zoom-team-chat side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| zoom-team-chat (this skill) | 0 | 3mo | Review | Intermediate |
| telegram-bot-builder | 106 | 6mo | Review | Intermediate |
| mcp-integration | 21 | 9mo | Review | Intermediate |
| n8n-workflow-patterns | 16 | 2mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by zoom
View all by zoom →You might also like
telegram-bot-builder
davila7
Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.
mcp-integration
anthropics
This skill should be used when the user asks to "add MCP server", "integrate MCP", "configure MCP in plugin", "use .mcp.json", "set up Model Context Protocol", "connect external service", mentions "${CLAUDE_PLUGIN_ROOT} with MCP", or discusses MCP server types (SSE, stdio, HTTP, WebSocket). Provides comprehensive guidance for integrating Model Context Protocol servers into Claude Code plugins for external tool and service integration.
n8n-workflow-patterns
czlonkowski
Proven workflow architectural patterns from real n8n workflows. Use when building new workflows, designing workflow structure, choosing workflow patterns, planning workflow architecture, or asking about webhook processing, HTTP API integration, database operations, AI agent workflows, or scheduled tasks.
n8n-code-javascript
czlonkowski
Write JavaScript code in n8n Code nodes. Use when writing JavaScript in n8n, using $input/$json/$node syntax, making HTTP requests with $helpers, working with dates using DateTime, troubleshooting Code node errors, or choosing between Code node modes.
n8n-expression-syntax
czlonkowski
Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, or working with webhook data in workflows.
n8n-node-configuration
czlonkowski
Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node_essentials and get_node_info, or learning common configuration patterns by node type.