Bodega

Skills › Productividad

zoom-rtms

Reference skill for Zoom RTMS. Use after routing to a live-media workflow when processing real-time audio, video, chat, transcripts, screen share, or contact-center voice streams.

Descargar .zipVer en GitHub
Departamento
Productividad
Fuente
Oficial · anthropics/knowledge-work-plugins › zoom-plugin
Autor
Anthropic
Licencia
Apache-2.0
Idioma
Inglés
Riesgo
Medio

Señales de riesgo

Cómo instalarla en Claude

  1. Descargue el .zip sin descomprimirlo.
  2. En Claude active Configuración › Capacidades › Crear y editar archivos.
  3. Vaya a Personalizar › Skills › Crear skill › Subir una skill y elija el archivo.

Instrucciones completas (SKILL.md)

Zoom Realtime Media Streams (RTMS)

Background reference for live Zoom media pipelines. Prefer build-zoom-bot first, then use this skill for stream types, capabilities, and RTMS-specific implementation constraints.

Zoom Realtime Media Streams (RTMS)

Expert guidance for accessing live audio, video, transcript, chat, and screen share data from Zoom meetings, webinars, Video SDK sessions, and Zoom Contact Center Voice in real-time. RTMS uses a WebSocket-based protocol with open standards and does not require a meeting bot to capture the media plane.

Read This First (Critical)

RTMS is primarily a backend media ingestion service.

Optional architecture (common):

Use RTMS for media/data plane, and use frontend frameworks/Zoom Apps for presentation + user interactions.

Official Documentation: https://developers.zoom.us/docs/rtms/ SDK Reference (JS): https://zoom.github.io/rtms/js/ SDK Reference (Python): https://zoom.github.io/rtms/py/ Sample Repository: https://github.com/zoom/rtms-samples

Quick Links

New to RTMS? Follow this path:

Complete Implementation:

Reference:

Having issues?

Supported Products

| Product | Webhook Event | Payload ID | App Type | |---------|--------------|------------|----------| | Meetings | meeting.rtms_started / meeting.rtms_stopped | meeting_uuid | General App | | Webinars | webinar.rtms_started / webinar.rtms_stopped | meeting_uuid (same!) | General App | | Video SDK | session.rtms_started / session.rtms_stopped | session_id | Video SDK App | | Zoom Contact Center Voice | Product-specific RTMS/ZCC Voice events | Product-specific stream/session identifiers | Contact Center / approved RTMS integration |

Once connected, the core signaling/media socket model is shared across products. Meetings, webinars, and Video SDK sessions use the familiar start/stop webhooks. Zoom Contact Center Voice adds its own RTMS/ZCC Voice event family and should be treated as the same transport model with product-specific event payloads.

RTMS Overview

RTMS is a data pipeline that gives your app access to live media from Zoom meetings, webinars, and Video SDK sessions without participant bots. Instead of having automated clients join meetings, use RTMS to collect media data directly from Zoom's infrastructure.

What RTMS Provides

| Media Type | Format | Use Cases | |------------|--------|-----------| | Audio | PCM (L16), G.711, G.722, Opus | Transcription, voice analysis, recording | | Video | H.264, JPG, PNG | Recording, AI vision, thumbnails, active participant selection | | Screen Share | H.264, JPG, PNG | Content capture, slide extraction | | Transcript | JSON text | Meeting notes, search, compliance | | Chat | JSON text | Archive, sentiment analysis |

March 2026 Protocol Changes

Two Approaches

| Approach | Best For | Complexity | |----------|----------|------------| | SDK (@zoom/rtms) | Most use cases | Low - handles WebSocket complexity | | Manual WebSocket | Custom protocols, other languages | High - full protocol implementation |

Prerequisites

> Need RTMS access? Post in [Zoom Developer Forum](https://devforum.zoom.us/) requesting RTMS access with your use case.

Quick Start (SDK - Recommended)

import rtms from "@zoom/rtms";

// All RTMS start/stop events across products
const RTMS_EVENTS = ["meeting.rtms_started", "webinar.rtms_started", "session.rtms_started"];

// Handle webhook events
rtms.onWebhookEvent(({ event, payload }) => {
  if (!RTMS_EVENTS.includes(event)) return;

  const client = new rtms.Client();

  client.onAudioData((data, timestamp, metadata) => {
    console.log(`Audio from ${metadata.userName}: ${data.length} bytes`);
  });

  client.onTranscriptData((data, timestamp, metadata) => {
    const text = data.toString('utf8');
    console.log(`${metadata.userName}: ${text}`);
  });

  client.onJoinConfirm((reason) => {
    console.log(`Joined session: ${reason}`);
  });

  // SDK handles all WebSocket connections automatically
  // Accepts both meeting_uuid and session_id transparently
  client.join(payload);
});

Quick Start (Manual WebSocket)

For full control or non-SDK languages, implement the two-phase WebSocket protocol:

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

const RTMS_EVENTS = ['meeting.rtms_started', 'webinar.rtms_started', 'session.rtms_started'];

// 1. Generate signature
// For meetings/webinars: uses meeting_uuid. For Video SDK: uses session_id.
function generateSignature(clientId, idValue, streamId, clientSecret) {
  const message = `${clientId},${idValue},${streamId}`;
  return crypto.createHmac('sha256', clientSecret).update(message).digest('hex');
}

// 2. Handle webhook
app.post('/webhook', (req, res) => {
  res.status(200).send();  // CRITICAL: Respond immediately!
  
  const { event, payload } = req.body;
  if (RTMS_EVENTS.includes(event)) {
    connectToRTMS(payload);
  }
});

// 3. Connect to signaling WebSocket
function connectToRTMS(payload) {
  const { server_urls, rtms_stream_id } = payload;
  // meeting_uuid for meetings/webinars, session_id for Video SDK
  const idValue = payload.meeting_uuid || payload.session_id;
  const signature = generateSignature(CLIENT_ID, idValue, rtms_stream_id, CLIENT_SECRET);
  
  const signalingWs = new WebSocket(server_urls);
  
  signalingWs.on('open', () => {
    signalingWs.send(JSON.stringify({
      msg_type: 1,  // Handshake request
      protocol_version: 1,
      meeting_uuid: idValue,
      rtms_stream_id,
      signature,
      media_type: 9  // AUDIO(1) | TRANSCRIPT(8)
    }));
  });
  
  // ... handle responses, connect to media WebSocket
}

See: [Manual WebSocket Guide](examples/manual-websocket.md) for complete implementation.

Media Type Bitmask

Combine types with bitwise OR:

| Type | Value | Description | |------|-------|-------------| | Audio | 1 | PCM audio samples | | Video | 2 | H.264/JPG video frames | | Screen Share | 4 | Separate from video! | | Transcript | 8 | Real-time speech-to-text | | Chat | 16 | In-meeting chat messages | | All | 32 | All media types |

Example: Audio + Transcript = 1 | 8 = 9

Critical Gotchas

| Issue | Solution | |-------|----------| | Only 1 connection allowed | New connections kick out existing ones. Track active sessions! | | Respond 200 immediately | If webhook delays, Zoom retries creating duplicate connections | | Heartbeat mandatory | Respond to msg_type 12 with msg_type 13, or connection dies | | Reconnection is YOUR job | RTMS doesn't auto-reconnect. Media keep-alive tolerance is now about 65s; signaling remains around 60s | | Transcript language drift | Use src_language plus enable_lid: false when you want fixed-language transcription instead of automatic language switching | | Single participant video only | VIDEO_SINGLE_INDIVIDUAL_STREAM supports one participant at a time. A new VIDEO_SUBSCRIPTION_REQ overrides the previous selection | | Graceful close is explicit now | Use STREAM_CLOSE_REQ / STREAM_CLOSE_RESP when your backend wants to terminate the stream cleanly |

Environment Variables

SDK Environment Variables

# Required - Authentication
ZM_RTMS_CLIENT=your_client_id          # Zoom OAuth Client ID
ZM_RTMS_SECRET=your_client_secret      # Zoom OAuth Client Secret

# Optional - Webhook server
ZM_RTMS_PORT=8080                      # Default: 8080
ZM_RTMS_PATH=/webhook                  # Default: /

# Optional - Logging
ZM_RTMS_LOG_LEVEL=info                 # error, warn, info, debug, trace
ZM_RTMS_LOG_FORMAT=progressive         # progressive or json
ZM_RTMS_LOG_ENABLED=true

Manual Implementation Variables

ZOOM_CLIENT_ID=your_client_id
ZOOM_CLIENT_SECRET=your_client_secret
ZOOM_SECRET_TOKEN=your_webhook_token   # For webhook validation

Zoom App Setup

For Meetings and Webinars (General App)

For Video SDK (Video SDK App)

Sample Repositories

Official Samples

| Repository | Description | |------------|-------------| | [rtms-samples](https://github.com/zoom/rtms-samples) | RTMSManager, boilerplates, AI samples | | [rtms-quickstart-js](https://github.com/zoom/rtms-quickstart-js) | JavaScript SDK quickstart | | [rtms-quickstart-py](https://github.com/zoom/rtms-quickstart-py) | Python SDK quickstart | | [rtms-sdk-cpp](https://github.com/zoom/rtms-sdk-cpp) | C++ SDK | | [zoom-rtms](https://github.com/zoom/rtms) | Main SDK repository |

AI Integration Samples

| Sample | Description | |--------|-------------| | [rtms-meeting-assistant-starter-kit](https://github.com/zoom/rtms-meeting-assistant-starter-kit) | AI meeting assistant with summaries | | [arlo-meeting-assistant](https://github.com/zoom/arlo-meeting-assistant) | Production meeting assistant with DB | | [videosdk-rtms-transcribe-audio](https://github.com/zoom/videosdk-rtms-transcribe-audio) | Whisper transcription |

Complete Documentation

Concepts

Examples

References

Troubleshooting

Resources

---

Need help? Start with Integrated Index section below for complete navigation.

---

Integrated Index

_This section was migrated from SKILL.md._

RTMS provides real-time access to live audio, video, transcript, chat, and screen share from Zoom meetings, webinars, and Video SDK sessions.

Critical Positioning

Treat RTMS as a backend service for receiving and processing media streams.

Do not model RTMS as a frontend-only SDK.

Quick Start Path

If you're new to RTMS, follow this order:

---

Documentation Structure

rtms/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── connection-architecture.md     # Two-phase WebSocket design
│   └── lifecycle-flow.md              # Webhook to streaming flow
│
├── examples/                          # Complete working code
│   ├── sdk-quickstart.md              # Using @zoom/rtms SDK
│   ├── manual-websocket.md            # Raw protocol implementation
│   ├── rtms-bot.md                    # Complete RTMS bot implementation
│   └── ai-integration.md              # Transcription and analysis
│
├── references/                        # Reference documentation
│   ├── media-types.md                 # Audio, video, transcript, chat, share
│   ├── data-types.md                  # All enums and constants
│   ├── connection.md                  # WebSocket protocol details
│   └── webhooks.md                    # Event subscription
│
└── troubleshooting/                   # Problem solving guides
    └── common-issues.md               # FAQ and solutions

---

By Use Case

I want to get meeting transcripts

I want to record meetings

I want to build an AI meeting assistant

I want to build a complete RTMS bot

I need full protocol control

I'm getting connection errors

I want to understand the architecture

---

By Product

I'm building for Zoom Meetings

I'm building for Zoom Webinars

I'm building for Zoom Video SDK

---

Key Documents

1. Connection Architecture (CRITICAL)

[concepts/connection-architecture.md](concepts/connection-architecture.md)

RTMS uses two separate WebSocket connections:

2. SDK vs Manual (DECISION POINT)

[examples/sdk-quickstart.md](examples/sdk-quickstart.md) vs [examples/manual-websocket.md](examples/manual-websocket.md)

| SDK | Manual | |-----|--------| | Handles WebSocket complexity | Full protocol control | | Automatic reconnection | DIY reconnection | | Less code | More code | | Best for most use cases | Best for custom requirements |

3. Critical Gotchas (MOST COMMON ISSUES)

[troubleshooting/common-issues.md](troubleshooting/common-issues.md)

---

Key Learnings

Critical Discoveries:

---

Quick Reference

"Connection fails"

-> [Common Issues](troubleshooting/common-issues.md)

"Duplicate connections"

-> [Webhook timing](troubleshooting/common-issues.md#webhook-response-timing)

"No audio/video data"

-> [Media Types](references/media-types.md) - Check configuration

"How do I implement manually?"

-> [Manual WebSocket](examples/manual-websocket.md)

"What message types exist?"

-> [Data Types](references/data-types.md)

"How do I integrate AI?"

-> [AI Integration](examples/ai-integration.md)

---

Document Version

Based on Zoom RTMS SDK v1.x and official documentation as of 2026.

---

Happy coding!

Remember: Start with [SDK Quickstart](examples/sdk-quickstart.md) for the fastest path, or [Manual WebSocket](examples/manual-websocket.md) if you need full control.