Zoom Team Chat logo

Zoom Team Chat

Organization
zoom
zoom-team-chat

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).

Overview

Publisherzoom
Repositoryskills
Skill namezoom-team-chat
Stars
78
Forks
16
Bundled files
37
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 37 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by zoom on GitHub. Read the source before you install it.

Installation

Install the Zoom Team Chat AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/zoom/skills.git /tmp/skills
mkdir -p .claude/skills
cp -r /tmp/skills/skills/team-chat .claude/skills/zoom-team-chat
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Zoom Team Chat in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Zoom Team Chat on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Zoom Team Chat is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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:

  1. Team Chat API (user type)

    • Sends messages as a real authenticated user
    • Uses User OAuth (authorization_code)
    • Endpoint family: /v2/chat/users/...
  2. 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:

  1. Get Started - End-to-end fast path (user type vs bot type)
  2. Choose Your API - Team Chat API vs Chatbot API
  3. Environment Setup - Credentials, scopes, app configuration
  4. OAuth Setup - Complete authentication flow
  5. 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 CaseAPI to Use
Send notifications from scripts/CI/CDTeam Chat API
Automate messages as a userTeam Chat API
Build an interactive chatbotChatbot API
Respond to slash commandsChatbot API
Create messages with buttons/formsChatbot API
Handle user interactionsChatbot 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_notification payload. Preserve its toJid, userJid, and accountId values:
json
{
  "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/messages HTTP 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 ManagementRolesRole SettingsAdvanced features → Enable Zoom for developers

Create Zoom App

  1. Go to Zoom App Marketplace
  2. Click DevelopBuild App
  3. 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:

CredentialLocationUsed By
Client IDApp Credentials → DevelopmentBoth APIs
Client SecretApp Credentials → DevelopmentBoth APIs
Account IDApp Credentials → DevelopmentChatbot API
Bot JIDFeatures → Chatbot → Bot CredentialsChatbot API
Secret TokenFeatures → Team Chat SubscriptionsChatbot API

See: Environment Setup Guide for complete configuration steps.

Quick Start: Team Chat API

Send a message as a user:

javascript
// 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:

javascript
// 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

FeatureDescription
Send MessagesPost messages to channels or direct messages
List ChannelsGet user's channels with metadata
Create ChannelsCreate public/private channels programmatically
Threaded RepliesReply to specific messages in threads
Edit/DeleteModify or remove messages

Chatbot API

FeatureDescription
Rich Message CardsHeaders, images, fields, buttons, forms
Slash CommandsCustom /commands trigger webhooks
Button ActionsInteractive buttons with webhook callbacks
Form SubmissionsCollect user input with forms
Dropdown SelectsChannel, member, date/time pickers
LLM IntegrationEasy integration with Claude, GPT, etc.

Webhook Events (Chatbot API)

EventTriggerUse Case
bot_notificationUser messages bot or uses slash commandProcess commands, integrate LLM
bot_installedBot added to accountInitialize bot state
interactive_message_actionsButton clickedHandle button actions
chat_message.submitForm submittedProcess form data
app_deauthorizedBot removedCleanup

See: Webhook Events Reference

Message Card Components

Build rich interactive messages with these components:

ComponentDescription
headerTitle and subtitle
messagePlain text
fieldsKey-value pairs
actionsButtons (Primary, Danger, Default styles)
sectionColored sidebar grouping
attachmentsImages with links
dividerHorizontal line
form_fieldText input
dropdownSelect menu
date_pickerDate 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

javascript
case 'bot_notification': {
  const { toJid, userJid, cmd, accountId } = payload;
  
  // 1. Call your LLM
  const llmResponse = await callClaude(cmd);
  
  // 2. Send response back
  await sendChatbotMessage(toJid, userJid, accountId, {
    body: [{ type: 'message', text: llmResponse }]
  });
}

See: LLM Integration Guide

Sample Applications

SampleDescriptionLink
Chatbot QuickstartOfficial tutorial (recommended start)GitHub
Claude ChatbotAI chatbot with Anthropic ClaudeGitHub
Unsplash ChatbotImage search with databaseGitHub
ERP ChatbotOracle ERP with scheduled alertsGitHub
Task ManagerFull CRUD appGitHub

See: Sample Applications Guide for analysis of all 10 samples

Common Operations

Send Message to Channel

javascript
// 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'
  })
});

Handle Button Click

javascript
// Webhook handler
case 'interactive_message_actions': {
  const { actionItem, toJid, userJid, accountId } = payload;
  
  if (actionItem.value === 'approve') {
    await sendChatbotMessage(toJid, userJid, accountId, {
      body: [{ type: 'message', text: '✅ Approved!' }]
    });
  }
}

Verify Webhook Signature

javascript
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

bash
# 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

Production Deployment

See: Deployment Guide for:

  • Nginx reverse proxy setup
  • Base path configuration
  • OAuth redirect URI setup

Limitations

LimitValue
Message length4,096 characters
File size512 MB
Members per channel10,000
Channels per user500

Security Best Practices

  1. Verify webhook signatures - Always validate using x-zm-signature header
  2. Sanitize messages - Limit to 4096 chars, remove control characters
  3. Validate JIDs - Check format: user@domain or channel@domain
  4. Environment variables - Never hardcode credentials
  5. 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.

  1. API Selection Guide - Confirm Team Chat API is right
  2. Environment Setup - Get credentials
  3. OAuth Setup Example - Implement authentication
  4. Send Message Example - Send your first message

Path 2: Chatbot API (Interactive Bots)

For building interactive chatbots with rich messages.

  1. API Selection Guide - Confirm Chatbot API is right
  2. Environment Setup - Get credentials (including Bot JID)
  3. Webhook Architecture - Understand webhook events
  4. Chatbot Setup Example - Build your first bot
  5. Message Cards Reference - Create rich messages

Core Concepts

Essential understanding for both APIs.

DocumentDescription
API Selection GuideChoose Team Chat API vs Chatbot API
Environment SetupComplete credentials and app configuration
Authentication FlowsOAuth vs Client Credentials
Webhook ArchitectureHow webhooks work (Chatbot API)
Message Card StructureCard component hierarchy
Deployment GuideProduction deployment strategies
Security Best PracticesSecure your integration

Complete Examples

Working code for common scenarios.

Authentication

ExampleDescription
OAuth SetupUser OAuth flow implementation
Token ManagementRefresh tokens, expiration handling

Basic Operations

ExampleDescription
Send MessageTeam Chat API message sending
Chatbot SetupComplete chatbot with webhooks
List ChannelsGet user's channels
Create ChannelCreate public/private channels

Interactive Features (Chatbot API)

ExampleDescription
Button ActionsHandle button clicks
Form SubmissionsProcess form data
Slash CommandsCreate custom commands
Dropdown SelectsChannel/member pickers

Advanced Integration

ExampleDescription
LLM IntegrationIntegrate Claude/GPT
Scheduled AlertsCron + incoming webhooks
Database IntegrationStore conversation state
Multi-Step WorkflowsComplex user interactions

References

API Documentation

ReferenceDescription
API ReferencePointers and common endpoints
Webhook EventsEvent types and handling checklist
Message CardsAll card components
Error CodesError handling guide

Sample Applications

ReferenceDescription
Sample ApplicationsSample app index/notes

Field Guides

ReferenceDescription
JID FormatsUnderstanding JID identifiers
Scopes ReferenceCommon scopes
Rate LimitsThrottling guidance

Troubleshooting

GuideDescription
Common IssuesQuick diagnostics and solutions
OAuth IssuesAuthentication failures
Webhook IssuesWebhook debugging
Message IssuesMessage sending problems
Deployment IssuesProduction problems

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

  • Read API Selection Guide
  • Complete Environment Setup
  • Obtain Client ID, Client Secret, Bot JID, Secret Token, Account ID
  • Enable Team Chat in Features
  • Configure Bot Endpoint URL and Slash Command
  • Set up ngrok for local testing
  • Implement webhook handler
  • Send first chatbot message

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

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Zoom Team Chat AI skill do?

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).

Why use Zoom Team Chat on TypingMind?

Because you install it once and use it with any model. Zoom Team Chat is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Zoom Team Chat in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/zoom/skills/tree/main/skills/team-chat. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Zoom Team Chat?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Zoom Team Chat?

As many as you like. As long as a model supports skills, you can use Zoom Team Chat with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Zoom Team Chat AI skill free?

Yes. It is published on GitHub by zoom under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇