openclaw/docs/channels/zoom.md
Pranav Katariya 737ae1cdec fix: improve Zoom onboarding UX and add defensive null handling
- Add defensive String(value ?? '') wrapper to trim() calls in channel.ts
- Show both webhook and OAuth redirect URLs after credential entry
- Update docs with clear URL configuration (removed confusing :3001 port)
- Match Slack's URL pattern with gateway-host placeholder
- Clarify local dev (ngrok) vs production (reverse proxy) setup
2026-01-27 19:40:57 -08:00

6.5 KiB

summary read_when
Zoom Team Chat plugin support status, capabilities, and configuration
Working on Zoom Team Chat integration
Setting up Zoom bot webhooks

Zoom Team Chat

Status: production-ready plugin for Zoom Team Chat direct messages via Team Chat Bot API and webhooks.

Quick setup

  1. Create a 'General App' in Zoom App Marketplace
  2. Enable the Team Chat surface and note your credentials (Client ID, Client Secret, Bot JID, Webhook Secret Token)
  3. Install the plugin: pnpm install (the zoom extension is included in the workspace)
  4. Configure URLs (see URL Configuration below):
    • Webhook URL: https://gateway-host/webhooks/zoom
    • OAuth Redirect URL: https://gateway-host/api/zoomapp/auth
  5. Set credentials in config:
    {
      channels: {
        zoom: {
          enabled: true,
          clientId: "YOUR_CLIENT_ID",
          clientSecret: "YOUR_CLIENT_SECRET",
          botJid: "YOUR_BOT_JID@xmppdev.zoom.us",
          secretToken: "YOUR_SECRET_TOKEN",
          dm: { policy: "open" }
        }
      }
    }
    
  6. Start the gateway
  7. Message the bot in Zoom Team Chat

What it is

  • A Zoom Team Chat channel plugin that receives messages via webhooks
  • Direct message support (groups not currently supported)
  • Webhook server runs on port 3001 (Gateway Control UI uses 3000)
  • OAuth 2.0 client credentials flow for API authentication

Setup (detailed)

1. Create Zoom Team Chat App

  1. Go to Zoom App Marketplace
  2. Click "Create" and select "Team Chat App"
  3. Enable the Bot feature
  4. Note your credentials from the app settings:
    • Client ID
    • Client Secret
    • Bot JID (e.g., bot@xmppdev.zoom.us)
    • Secret Token (for webhook verification)

2. Configure URLs

Configure these URLs in your Zoom app settings:

Webhook URL (for receiving messages):

https://gateway-host/webhooks/zoom

OAuth Redirect URL (for app installation):

https://gateway-host/api/zoomapp/auth

Replace gateway-host with:

  • Local development: Use ngrok (ngrok http 3001) or another tunnel service to expose port 3001
  • Production: Your server's public domain (configure reverse proxy to forward to port 3001)

Subscribe to these event types:

  • bot_notification - Required for receiving messages

3. Install App to Your Account

  1. In app settings, click "Install"
  2. Authorize the app
  3. The bot will appear in your Zoom Team Chat

4. Configure Moltbot

Add to moltbot.yaml:

channels:
  zoom:
    enabled: true
    clientId: YOUR_CLIENT_ID
    clientSecret: YOUR_CLIENT_SECRET
    botJid: YOUR_BOT_JID@xmppdev.zoom.us
    secretToken: YOUR_SECRET_TOKEN
    apiHost: https://zoomdev.us          # Use https://api.zoom.us for production
    oauthHost: https://zoomdev.us        # Use https://zoom.us for production
    dm:
      policy: open                        # open | closed | allowlist

5. Start Gateway

moltbot gateway run

The webhook server will start on port 3001.

6. Test

Send a direct message to your bot in Zoom Team Chat. The bot should respond with context-aware replies.

Configuration Options

DM Policies

Open (default):

dm:
  policy: open

Anyone can message the bot.

Closed:

dm:
  policy: closed

Bot rejects all DMs.

Allowlist:

dm:
  policy: allowlist
  allowFrom:
    - user1@xmppdev.zoom.us
    - user2@xmppdev.zoom.us

Only specified users can message the bot.

Development vs Production

Development (zoomdev.us):

channels:
  zoom:
    apiHost: https://zoomdev.us
    oauthHost: https://zoomdev.us
    botJid: bot@xmppdev.zoom.us

Production (zoom.us):

channels:
  zoom:
    apiHost: https://api.zoom.us
    oauthHost: https://zoom.us
    botJid: bot@xmpp.zoom.us

Features

  • Direct Messages: One-on-one conversations
  • Conversation History: Full context retention across messages
  • Streaming Responses: Real-time message updates
  • Tool Execution: All standard Moltbot tools are available
  • Session Management: Persistent sessions per user

Session Keys

Session keys follow the format:

zoom:default:user@xmppdev.zoom.us

Sessions are stored at:

~/.moltbot/agents/{agentId}/sessions/{session-id}.jsonl

Capabilities

  • Chat types: Direct messages only (groups not supported)
  • Reactions: Not supported
  • Threads: Not supported
  • Media: Not currently supported
  • Streaming: Supported (coalesced with 1500 char minimum, 1000ms idle)

Troubleshooting

Port 3000 Conflict

If you see "port 3000 already in use":

  • Gateway Control UI runs on port 3000
  • Zoom webhook server uses port 3001
  • This is expected and correct

Webhook Not Receiving Messages

  1. Check tunnel is running (if using FRP or similar)
  2. Verify webhook URL in Zoom app settings matches your tunnel/domain
  3. Check gateway logs for errors
  4. Verify secretToken matches your app configuration

Bot Not Responding

  1. Verify credentials in moltbot.yaml are correct
  2. Check Anthropic API key is valid
  3. Ensure botJid matches your app's Bot JID exactly
  4. Confirm app is installed to your Zoom account
  5. Check gateway logs for authentication errors

OAuth Issues

If you see authentication errors:

  • Verify clientId and clientSecret are correct
  • Check oauthHost matches your environment (dev vs prod)
  • Review gateway logs for OAuth token errors

Architecture

The Zoom plugin follows Moltbot's standard channel plugin architecture:

  • Extension: extensions/zoom/ - Plugin registration and metadata
  • Core: src/zoom/ - Webhook server, message handling, API client
  • Monitor: Starts Express server on port 3001, handles webhook events
  • Message Handler: Integrates with dispatchInboundMessage() for AI routing

For implementation details, see the plugin source code.

Security

Never commit credentials!

Store sensitive values in moltbot.yaml (gitignored) and use moltbot-example.yaml for documentation templates.

Webhook events are verified using the secretToken from your Zoom app configuration.

Limitations

  • Groups are not currently supported
  • Media uploads not yet implemented
  • Reactions not supported
  • Thread support not available

See Also