Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
anthropics avatar

Setup Zoom Websockets

  • 1.4k installs
  • 23.1k repo stars
  • Updated July 28, 2026
  • anthropics/knowledge-work-plugins

setup-zoom-websockets is an agent skill for reference skill for zoom websockets. use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make.

About

The setup-zoom-websockets skill is designed for reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make. /setup-zoom-websockets Background reference for persistent Zoom event streams. Prefer workflow routing first, then use this file when WebSockets are plausibly better than webhooks. Invoke when the user asks about setup zoom websockets or related SKILL.md workflows.

  • Real-time, low-latency updates are critical.
  • Security is paramount (banking, healthcare, finance).
  • You don't want to expose a public endpoint.
  • You need bidirectional communication.
  • Simpler setup is preferred.

Setup Zoom Websockets by the numbers

  • 1,412 all-time installs (skills.sh)
  • +84 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #326 of 2,209 Security skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

setup-zoom-websockets capabilities & compatibility

Capabilities
real time, low latency updates are critical · security is paramount (banking, healthcare, fina · you don't want to expose a public endpoint · you need bidirectional communication
From the docs

What setup-zoom-websockets says it does

Reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make WebSockets p
SKILL.md
Reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constrain
SKILL.md
npx skills add https://github.com/anthropics/knowledge-work-plugins --skill setup-zoom-websockets

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.4k
repo stars23.1k
Security audit2 / 3 scanners passed
Last updatedJuly 28, 2026
Repositoryanthropics/knowledge-work-plugins

How do I reference skill for zoom websockets. use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make?

Reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make.

Who is it for?

Developers using setup zoom websockets workflows documented in SKILL.md.

Skip if: Skip when the task falls outside setup-zoom-websockets scope or needs a different stack.

When should I use this skill?

User asks about setup zoom websockets or related SKILL.md workflows.

What you get

Completed setup-zoom-websockets workflow with documented commands, files, and expected deliverables.

  • WebSocket client setup
  • Token exchange function

By the numbers

  • Documents a 5-step WebSocket connection lifecycle

Files

SKILL.mdMarkdownGitHub ↗

/setup-zoom-websockets

Background reference for persistent Zoom event streams. Prefer workflow routing first, then use this file when WebSockets are plausibly better than webhooks.

WebSockets vs Webhooks

AspectWebSocketsWebhooks
ConnectionPersistent, bidirectionalOne-time HTTP POST
LatencyLower (no HTTP overhead)Higher (new connection per event)
SecurityDirect connection, no exposed endpointRequires endpoint validation, IP whitelisting
ModelPull (you connect to Zoom)Push (Zoom connects to you)
StateStateful (maintains connection)Stateless (each event independent)
SetupMore complex (access token, connection)Simpler (just endpoint URL)

Choose WebSockets when:

  • Real-time, low-latency updates are critical
  • Security is paramount (banking, healthcare, finance)
  • You don't want to expose a public endpoint
  • You need bidirectional communication

Choose Webhooks when:

  • Simpler setup is preferred
  • Small number of event notifications
  • Existing HTTP infrastructure

Prerequisites

  • Server-to-Server OAuth app in Zoom Marketplace
  • Account ID, Client ID, and Client Secret
  • WebSocket subscription with events enabled
Need help with S2S OAuth? See the [zoom-oauth](../oauth/SKILL.md) skill for complete authentication flows.
Start troubleshooting fast: Use the [5-Minute Runbook](RUNBOOK.md) before deep debugging.

Quick Start

1. Create Server-to-Server OAuth App

1. Go to Zoom Marketplace 2. Create a Server-to-Server OAuth app 3. Copy Account ID, Client ID, Client Secret

2. Enable WebSocket Subscription

1. In your app, go to FeatureEvent Subscriptions 2. Add an Event Subscription 3. Select WebSockets as the method type 4. Select events to subscribe to (e.g., meeting.created, meeting.started) 5. Save - an endpoint URL will be generated

3. Connect via WebSocket

const WebSocket = require('ws');
const axios = require('axios');

// Step 1: Get access token
async function getAccessToken() {
  const credentials = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64');
  
  const response = await axios.post(
    'https://zoom.us/oauth/token',
    new URLSearchParams({
      grant_type: 'account_credentials',
      account_id: ACCOUNT_ID
    }),
    {
      headers: {
        'Authorization': `Basic ${credentials}`,
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    }
  );
  
  return response.data.access_token;
}

// Step 2: Connect to WebSocket
async function connectWebSocket() {
  const accessToken = await getAccessToken();
  
  // WebSocket URL from your subscription settings
  const wsUrl = `wss://ws.zoom.us/ws?subscriptionId=${SUBSCRIPTION_ID}&access_token=${accessToken}`;
  
  const ws = new WebSocket(wsUrl);
  
  ws.on('open', () => {
    console.log('WebSocket connection established');
  });
  
  ws.on('message', (data) => {
    const event = JSON.parse(data);
    console.log('Event received:', event.event);
    
    // Handle different event types
    switch (event.event) {
      case 'meeting.started':
        console.log(`Meeting started: ${event.payload.object.topic}`);
        break;
      case 'meeting.ended':
        console.log(`Meeting ended: ${event.payload.object.uuid}`);
        break;
      case 'meeting.participant_joined':
        console.log(`Participant joined: ${event.payload.object.participant.user_name}`);
        break;
    }
  });
  
  ws.on('close', (code, reason) => {
    console.log(`Connection closed: ${code} - ${reason}`);
    // Implement reconnection logic
  });
  
  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
  
  return ws;
}

connectWebSocket();

Event Format

Events received via WebSocket have the same format as webhook events:

{
  "event": "meeting.started",
  "event_ts": 1706123456789,
  "payload": {
    "account_id": "abcD3ojkdbjfg",
    "object": {
      "id": 1234567890,
      "uuid": "abcdefgh-1234-5678-abcd-1234567890ab",
      "host_id": "xyz789",
      "topic": "Team Standup",
      "type": 2,
      "start_time": "2024-01-25T10:00:00Z",
      "timezone": "America/Los_Angeles"
    }
  }
}

Common Events

EventDescription
meeting.createdMeeting scheduled
meeting.updatedMeeting settings changed
meeting.deletedMeeting deleted
meeting.startedMeeting begins
meeting.endedMeeting ends
meeting.participant_joinedParticipant joins meeting
meeting.participant_leftParticipant leaves meeting
recording.completedCloud recording ready
user.createdNew user added
user.updatedUser details changed

Connection Management

Keep-Alive

WebSocket connections require periodic heartbeats. Zoom will close idle connections.

// Send ping every 30 seconds
setInterval(() => {
  if (ws.readyState === WebSocket.OPEN) {
    ws.ping();
  }
}, 30000);

Reconnection

Implement automatic reconnection for reliability:

function connectWithReconnect() {
  const ws = connectWebSocket();
  
  ws.on('close', () => {
    console.log('Connection lost. Reconnecting in 5 seconds...');
    setTimeout(connectWithReconnect, 5000);
  });
  
  return ws;
}

Single Connection Limit

Important: Only ONE WebSocket connection can be open per subscription at a time. Opening a new connection will close the existing one.

Detailed References

  • [references/connection.md](references/connection.md) - Connection lifecycle, authentication, error handling
  • [references/events.md](references/events.md) - Complete event types reference

Troubleshooting

  • [troubleshooting/common-issues.md](troubleshooting/common-issues.md) - Subscription URL confusion, disconnects, no-events debugging

Sample Repositories

Official / Community

TypeRepositoryDescription
Node.jsjust-zoomit/zoom-websocketsWebSocket sample with S2S OAuth

WebSockets vs RTMS

Don't confuse WebSockets with RTMS (Realtime Media Streams):

FeatureWebSocketsRTMS
PurposeEvent notificationsMedia streams
DataMeeting events, user eventsAudio, video, transcripts
Use caseReact to Zoom eventsAI/ML, live transcription
SkillThis skillrtms

For real-time audio/video/transcript data, use the rtms skill instead.

Resources

  • WebSockets docs: https://developers.zoom.us/docs/api/websockets/
  • Webhooks comparison: https://www.zoom.com/en/blog/a-guide-to-webhooks-and-websockets/
  • Developer forum: https://devforum.zoom.us/

Environment Variables

  • See references/environment-variables.md for standardized .env keys and where to find each value.

Related skills

FAQ

What does setup-zoom-websockets do?

Reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make.

When should I use setup-zoom-websockets?

User asks about setup zoom websockets or related SKILL.md workflows.

Is setup-zoom-websockets safe to install?

Review the Security Audits panel on this page before installing in production.

Securityappsec

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.