| name | zoom-team-chat |
| description | 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). |
| triggers | ["zoom team chat","zoom chatbot","zoom messaging","team chat api","chatbot api","zoom slash commands","zoom chat integration"] |
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:
Having issues?
OAuth endpoint sanity check:
- Authorize URL:
https://zoom.us/oauth/authorize
- Token URL:
https://zoom.us/oauth/token
- If
/oauth/token returns 404/HTML, use https://zoom.us/oauth/token.
Building Interactive Bots?
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
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, shortcut action_types, and app-owned
client_credentials scopes. 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:
const accessToken = await getOAuthToken();
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();
Complete example: Send Message Guide
Quick Start: Chatbot API
Build an interactive chatbot:
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;
}
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,
account_id: payload.accountId,
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
Key Features
Team Chat API
| 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 |
Chatbot API
| 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. |
Webhook Events (Chatbot API)
| 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
Message Card Components
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 for complete component catalog
Architecture Patterns
Chatbot Lifecycle
User types /command → Webhook receives bot_notification
↓
payload.cmd = "user's input"
↓
Process command
↓
Send response via sendChatbotMessage()
LLM Integration Pattern
case 'bot_notification': {
const { toJid, cmd, accountId } = payload;
const llmResponse = await callClaude(cmd);
await sendChatbotMessage(toJid, accountId, {
body: [{ type: 'message', text: llmResponse }]
});
}
See: LLM Integration Guide
Sample Applications
| Sample | Description | Link |
|---|
| Chatbot Quickstart | Official tutorial (recommended start) | GitHub |
| Claude Chatbot | AI chatbot with Anthropic Claude | GitHub |
| Unsplash Chatbot | Image search with database | GitHub |
| ERP Chatbot | Oracle ERP with scheduled alerts | GitHub |
| Task Manager | Full CRUD app | GitHub |
See: Sample Applications Guide for analysis of all 10 samples
Common Operations
Send Message to Channel
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'
})
});
Handle Button Click
case 'interactive_message_actions': {
const { actionItem, toJid, accountId } = payload;
if (actionItem.value === 'approve') {
await sendChatbotMessage(toJid, accountId, {
body: [{ type: 'message', text: '✅ Approved!' }]
});
}
}
Verify Webhook Signature
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}`;
}
Deployment
ngrok for Local Development
npm install -g ngrok
ngrok http 4000
Production Deployment
See: Deployment Guide for:
- Nginx reverse proxy setup
- Base path configuration
- OAuth redirect URI setup
Limitations
| Limit | Value |
|---|
| Message length | 4,096 characters |
| File size | 512 MB |
| Members per channel | 10,000 |
| Channels per user | 500 |
Security Best Practices
- Verify webhook signatures - Always validate using
x-zm-signature header
- Sanitize messages - Limit to 4096 chars, remove control characters
- Validate JIDs - Check format:
user@domain or channel@domain
- Environment variables - Never hardcode credentials
- Use HTTPS - Required for production webhooks
See: Security Best Practices
Complete Documentation Library
Core Concepts (Start Here!)
Complete Examples
References
Troubleshooting
Resources
Need help? Start with Integrated Index section below for complete navigation.
Integrated Index
This section was migrated from SKILL.md.
Complete navigation guide for the Zoom Team Chat skill.
Quick Start Paths
Path 1: Team Chat API (User-Level Messaging)
For sending messages as a user account.
- API Selection Guide - Confirm Team Chat API is right
- Environment Setup - Get credentials
- OAuth Setup Example - Implement authentication
- Send Message Example - Send your first message
Path 2: Chatbot API (Interactive Bots)
For building interactive chatbots with rich messages.
- API Selection Guide - Confirm Chatbot API is right
- Environment Setup - Get credentials (including Bot JID)
- Webhook Architecture - Understand webhook events
- Chatbot Setup Example - Build your first bot
- Message Cards Reference - Create rich messages
Core Concepts
Essential understanding for both APIs.
Complete Examples
Working code for common scenarios.
Authentication
Basic Operations
Interactive Features (Chatbot API)
Advanced Integration
References
API Documentation
Sample Applications
Field Guides
Troubleshooting
Architecture Patterns
Chatbot Lifecycle
User Action → Webhook → Process → Response
LLM Integration Pattern
User Input → Chatbot receives → Call LLM → Send response
Approval Workflow Pattern
Request → Send card with buttons → User clicks → Update status → Notify
Common Use Cases
Notifications
- CI/CD build notifications
- Server monitoring alerts
- Scheduled reports
- System health checks
Workflows
- Approval requests
- Task assignment
- Status updates
- Form submissions
Integrations
- LLM-powered assistants
- Database queries
- External API integration
- File/image sharing
Automation
- Scheduled messages
- Auto-responses
- Data collection
- Report generation
Resource Links
Official Documentation
Sample Code
Tools
Community
Documentation Status
✅ Complete
- Main skill.md entry point
- API Selection Guide
- Environment Setup
- Webhook Architecture
- Chatbot Setup Example (complete working code)
- Message Cards Reference
- Common Issues Troubleshooting
📝 Pending (High Priority)
- OAuth Setup Example
- Send Message Example
- Button Actions Example
- LLM Integration Example
- Webhook Events Reference
- API Reference
- Sample Applications Analysis
📋 Planned (Lower Priority)
- Form Submissions Example
- Channel Management Examples
- Database Integration Example
- Error Codes Reference
- Rate Limits Guide
- Deployment troubleshooting
Getting Started Checklist
For Team Chat API
For Chatbot API
Version History
- v1.0 (2026-02-09) - Initial comprehensive documentation
- Core concepts (API selection, environment setup, webhooks)
- Complete chatbot setup example
- Message cards reference
- Common issues troubleshooting
Contributing
This skill is part of the zoom-skills repository. Improvements welcome!
Support
For skill-related questions or improvements, please reference this SKILL.md for navigation.
Environment Variables