Loading...
Loading...
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.
npx skill4agent add anthropics/knowledge-work-plugins build-zoom-team-chat-appauthorization_code/v2/chat/users/...client_credentials/v2/im/chat/messageshttps://zoom.us/oauth/authorizehttps://zoom.us/oauth/token/oauth/tokenhttps://zoom.us/oauth/token| 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:writechat_channel:readPOST https://api.zoom.us/v2/im/chat/messagesimchat:bot⚠️ Do NOT use Server-to-Server OAuth - S2S apps don't have the Chatbot/Team Chat feature. Only General App (OAuth) supports chatbots.
| 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 |
// 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" }// 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' }
]
}
]
}
})
});| 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 |
| 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 |
|---|---|---|
| User messages bot or uses slash command | Process commands, integrate LLM |
| Bot added to account | Initialize bot state |
| Button clicked | Handle button actions |
| Form submitted | Process form data |
| Bot removed | Cleanup |
| 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 |
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 }]
});
}| 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 |
// 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/webhook| Limit | Value |
|---|---|
| Message length | 4,096 characters |
| File size | 512 MB |
| Members per channel | 10,000 |
| Channels per user | 500 |
x-zm-signatureuser@domainchannel@domainSKILL.md| Document | Description |
|---|---|
| API Selection Guide | Choose Team Chat API vs Chatbot API |
| Environment Setup | Complete credentials and app configuration |
| Authentication Flows | OAuth vs Client Credentials |
| Webhook Architecture | How webhooks work (Chatbot API) |
| Message Card Structure | Card component hierarchy |
| Deployment Guide | Production deployment strategies |
| Security Best Practices | Secure your integration |
| Example | Description |
|---|---|
| OAuth Setup | User OAuth flow implementation |
| Token Management | Refresh tokens, expiration handling |
| Example | Description |
|---|---|
| Send Message | Team Chat API message sending |
| Chatbot Setup | Complete chatbot with webhooks |
| List Channels | Get user's channels |
| Create Channel | Create public/private channels |
| Example | Description |
|---|---|
| Button Actions | Handle button clicks |
| Form Submissions | Process form data |
| Slash Commands | Create custom commands |
| Dropdown Selects | Channel/member pickers |
| Example | Description |
|---|---|
| LLM Integration | Integrate Claude/GPT |
| Scheduled Alerts | Cron + incoming webhooks |
| Database Integration | Store conversation state |
| Multi-Step Workflows | Complex user interactions |
| Reference | Description |
|---|---|
| API Reference | Pointers and common endpoints |
| Webhook Events | Event types and handling checklist |
| Message Cards | All card components |
| Error Codes | Error handling guide |
| Reference | Description |
|---|---|
| Sample Applications | Sample app index/notes |
| Reference | Description |
|---|---|
| JID Formats | Understanding JID identifiers |
| Scopes Reference | Common scopes |
| Rate Limits | Throttling guidance |
| Guide | Description |
|---|---|
| Common Issues | Quick diagnostics and solutions |
| OAuth Issues | Authentication failures |
| Webhook Issues | Webhook debugging |
| Message Issues | Message sending problems |
| Deployment Issues | Production problems |
User Action → Webhook → Process → ResponseUser Input → Chatbot receives → Call LLM → Send responseRequest → Send card with buttons → User clicks → Update status → Notify.env