setup-zoom-websockets
This skill sets up persistent WebSocket connections to Zoom for low-latency event delivery instead of webhooks.
Identity proven by GitHub's verified organisation badge (zoom)
- Agents
- Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode
- License
- MIT (permissive)
- Pin
- 86e2592pinned Oct 9, 2026
- Context cost
- about 2,000 tokenswhen the skill loads
- GitHub stars
- 7on zoom/zoom-plugin-claude
- Scripts
- None found
What 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 preferable to webhooks.”
Generated summary from the skill's own text
This skill sets up persistent WebSocket connections to Zoom for low-latency event delivery instead of webhooks. It handles Server-to-Server OAuth authentication, WebSocket subscription configuration, and event parsing for meeting and user lifecycle events. Use this when real-time updates, security constraints, or avoiding public endpoints make WebSockets preferable to the simpler webhook approach.
When to use it
- Need low-latency Zoom event delivery without HTTP overhead
- Security-critical applications like banking or healthcare
- No public endpoint available for webhook callbacks
- Bidirectional communication required with Zoom
When not to
- Simpler webhook setup is preferred
- Small number of infrequent event notifications
- Need real-time audio, video, or transcript data (use RTMS instead)
Install
These commands install from the publisher's repository and need no account.
skills CLI
npx skills add zoom/zoom-plugin-claude --skill setup-zoom-websocketsInstalls from the repository's default branch, which may have changed since the commit we checked.
GitHub CLI 2.90 or later
gh skill install zoom/zoom-plugin-claude setup-zoom-websockets@86e2592334f5fb563ed273e26035844004e66165Installs the commit we checked (86e2592).
Copy by hand
Download the folder at 86e2592 and put it in .claude/skills/setup-zoom-websockets for Claude Code and in .agents/skills/setup-zoom-websockets for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.
Claude Code plugin
/plugin install zoom-plugin@claude-plugins-officialThe publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.
Copy for your agent
A prompt for any coding agent. It installs this skill from GitHub at the pinned commit, copies the files as they are, and runs nothing unless you ask.
Prompt
Install the agent skill "setup-zoom-websockets" by Zoom. Source, pinned to commit 86e2592334f5fb563ed273e26035844004e66165: https://github.com/zoom/zoom-plugin-claude/tree/86e2592334f5fb563ed273e26035844004e66165/skills/websockets 1. Download that folder at exactly this commit. Do not use the default branch. 2. Copy every file unchanged, keeping the folder structure, into .claude/skills/setup-zoom-websockets/ for Claude Code and .agents/skills/setup-zoom-websockets/ for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. Create the folders if they do not exist. 3. Do not edit the files, and do not run any script in the folder unless I ask you to. 4. When you are done, list the files you copied and where you put them. Listing and checks: https://www.agentnative.dev/skills/zoom/setup-zoom-websockets
SKILL.md at the pin
---
name: setup-zoom-websockets
description: 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 preferable to webhooks.
triggers:
- "zoom websockets"
- "websocket event subscription"
- "persistent zoom events"
- "low latency zoom events"
- "zoom websocket connection"
---
# /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
| Aspect | WebSockets | Webhooks |
|--------|------------|----------|
| **Connection** | Persistent, bidirectional | One-time HTTP POST |
| **Latency** | Lower (no HTTP overhead) | Higher (new connection per event) |
| **Security** | Direct connection, no exposed endpoint | Requires endpoint validation, IP whitelisting |
| **Model** | Pull (you connect to Zoom) | Push (Zoom connects to you) |
| **State** | Stateful (maintains connection) | Stateless (each event independent) |
| **Setup** | More 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 or admin-managed General App in [Zoom Marketplace](https://marketplace.zoom.us/)
- Client ID and Client Secret; S2S also requires the Account ID
- WebSocket subscription with events enabled
> **Need to create/configure the app first?** Use
> [Marketplace app management](../rest-api/references/marketplace-apps.md) for app creation,
> manifest validation, app-owned WebSocket/event subscription scopes, and the `WEB_SOCKET`
> subscription enum before connecting. Start from the
> [General admin](../rest-api/assets/marketplace-apps/marketplace-manifest-template-for-general-admin-websocket.json) or
> [S2S](../rest-api/assets/marketplace-apps/marketplace-app-creation-template-for-s2s-websocket.json) WebSocket base, then
> select the WebSocket delivery method under Features > Access.
> **Need help with S2S OAuth?** See the **[zoom-oauth](../oauth/SKILL.md)** skill for complete authentication flows.
For a General App WebSocket subscription, use the app-owned token flow documented for that app.
Do not copy the S2S `account_credentials` example below into a General App implementation.
> **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](https://marketplace.zoom.us/develop/create)
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 **Feature** → **Event 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
```javascript
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:
```json
{
"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
| Event | Description |
|-------|-------------|
| `meeting.created` | Meeting scheduled |
| `meeting.updated` | Meeting settings changed |
| `meeting.deleted` | Meeting deleted |
| `meeting.started` | Meeting begins |
| `meeting.ended` | Meeting ends |
| `meeting.participant_joined` | Participant joins meeting |
| `meeting.participant_left` | Participant leaves meeting |
| `recording.completed` | Cloud recording ready |
| `user.created` | New user added |
| `user.updated` | User details changed |
## Connection Management
### Keep-Alive
WebSocket connections require periodic heartbeats. Zoom will close idle connections.
```javascript
// Send ping every 30 seconds
setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.ping();
}
}, 30000);
```
### Reconnection
Implement automatic reconnection for reliability:
```javascript
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
| Type | Repository | Description |
|------|------------|-------------|
| Node.js | [just-zoomit/zoom-websockets](https://github.com/just-zoomit/zoom-websockets) | WebSocket sample with S2S OAuth |
## WebSockets vs RTMS
Don't confuse WebSockets with RTMS (Realtime Media Streams):
| Feature | WebSockets | RTMS |
|---------|------------|------|
| **Purpose** | Event notifications | Media streams |
| **Data** | Meeting events, user events | Audio, video, transcripts |
| **Use case** | React to Zoom events | AI/ML, live transcription |
| **Skill** | This skill | **rtms** |
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](references/environment-variables.md) for standardized `.env` keys and where to find each value.
From zoom/zoom-plugin-claude at 86e2592, shown as plain text under its license: MIT (permissive). The license text is in LICENSE.
View SKILL.md on GitHub at 86e2592Files
- SKILL.md8.4 KB · 284c2c72d432
- RUNBOOK.md3.0 KB · a8d30d330784
- references/
- connection.md11 KB · 7b3896d0d7ee
- environment-variables.md827 B · 8677572b6901
- events.md11 KB · f2af93850371
- troubleshooting/
- common-issues.md1.1 KB · e3619602011d
6 files, 35 KB in total. Each file has a sha256 in the pin's manifest; the first 12 characters are shown.
Skill folder on GitHub at 86e2592More from Zoom
build-zoom-bot
This skill guides building Zoom bots that join meetings, capture media, or process live transcripts using Meeting SDK and RTMS.
Claude Code, Codex, Cursor +4 · about 300 tokens · pinned 6 days ago
build-zoom-contact-center-app
This skill provides implementation guidance for Zoom Contact Center integrations across desktop apps, web embeds, and native mobile platforms.
Claude Code, Codex, Cursor +3 · about 1.2K tokens · pinned 6 days ago
build-zoom-meeting-app
This skill guides agents in building embedded Zoom meeting applications by helping select appropriate SDKs, plan authentication flows, and route to Meeting…
Claude Code, Codex, Cursor +4 · about 310 tokens · pinned 6 days ago
build-zoom-meeting-sdk-app
This skill provides reference guidance for implementing Zoom Meeting SDK across web, mobile, desktop, and Linux platforms.
Claude Code, Codex, Cursor +3 · about 2.7K tokens · pinned 6 days ago
build-zoom-phone-integration
This skill provides reference guidance for implementing Zoom Phone integrations using OAuth, REST APIs, webhooks, Smart Embed iframe components, URI schemes…
Claude Code, Codex, Cursor +3 · about 1.1K tokens · pinned 6 days ago
build-zoom-rest-api-app
This skill provides comprehensive reference documentation and examples for building server-side integrations with the Zoom REST API, covering 600+ endpoints…
Claude Code, Codex, Cursor +3 · about 6.7K tokens · pinned 6 days ago
Related in Backend and APIs
nvflare-orient
Routes NVFLARE requests to appropriate downstream skills based on user intent and preliminary source inspection findings.
by NVIDIAOfficial publisher
Claude Code, Codex, Cursor +4 · about 600 tokens · pinned 6 days ago
cloudflare-email-service
This skill enables agents to send transactional emails and route incoming emails using Cloudflare's Email Service platform.
by CloudflareOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.6K tokens · pinned 6 days ago
durable-objects
Build and debug Cloudflare Durable Objects applications for stateful coordination and persistent storage on the edge.
by CloudflareOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.5K tokens · pinned 6 days ago
workers-best-practices
This skill guides code review and development of Cloudflare Workers by applying best practices for production readiness.
by CloudflareOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.3K tokens · pinned 6 days ago
supabase
This skill enables the agent to work with Supabase products including Database, Auth, Edge Functions, Realtime, Storage, and Vectors.
by SupabaseOfficial publisher
Claude Code, Codex, Cursor +4 · about 3.3K tokens · pinned 6 days ago
apple
This skill emulates Apple's OAuth and OIDC services for local development and testing.
by VercelOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.9K tokens · pinned 6 days ago