Zoom Rtms
OpenAIOfficialCreated by ZoomDistributed by OpenAI
- Skill
- Tool integration
- Automation and integrations
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The zoom-rtms skill provides the necessary protocols and architectural guidance for integrating Zoom Realtime Media Streams. It covers the WebSocket-based connection lifecycle, including signaling and media handshakes, heartbeat management, and reconnection strategies. The skill supports processing various media types such as audio, video, screen sharing, transcripts, and chat, while providing reference data for message types and event enums.
What it does
- Establishes WebSocket connections for signaling and media streams.
- Handles media handshake requests for audio, video, screen share, transcript, and chat data.
- Provides reference tables for RTMS message types and event enums.
- Defines mandatory heartbeat and reconnection logic for stream stability.
- Supports configuration for transcript language identification.
- Outlines the process for extracting stream IDs and generating HMAC-SHA256 signatures.
When to use it
- When you need to ingest raw meeting or contact center media into a backend pipeline.
- When building services for transcription, AI analysis, or recording of Zoom sessions.
- When you need to subscribe to specific meeting events or participant media streams.
- When you require programmatic access to media data without a visible participant bot.
Advantages
- Provides a structured approach to managing the complex WebSocket lifecycle.
- Includes comprehensive references for message types and event handling.
- Offers clear guidance on signature generation and security requirements.
- Enables granular control over media subscription and transcript settings.
Usage examples
- “How do I initiate a connection to an RTMS stream?”
- The agent will guide you through receiving the rtms_started webhook, generating an HMAC-SHA256 signature, and performing the signaling and media handshakes.
- “What is the correct way to handle heartbeats in RTMS?”
- The agent will explain that you must respond to msg_type 12 (Keep Alive Request) with msg_type 13 (Keep Alive Response) to maintain the connection.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/zoom-rtms/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip zoom-rtms.zip -d .agents/skills
Documentation by Zoom
Zoom Realtime Media Streams
Use this skill when the integration needs real-time meeting or contact-center media as a backend stream. If the workflow needs a visible participant bot, compare against build-zoom-bot and zoom-meeting-sdk-linux before choosing RTMS.
Workflow
Confirm the source surface: Meetings RTMS, Contact Center voice media, or another documented RTMS stream.
Decide whether RTMS is sufficient or whether a Meeting SDK bot is required for participant identity, meeting controls, or UI-visible behavior.
Implement the WebSocket lifecycle first: event subscription, connection validation, media start, heartbeat, reconnect, and shutdown.
Process media types intentionally: audio, video, screen share, chat, live transcript, and metadata have different payload and timing constraints.
Design downstream pipelines for buffering, transcription, AI analysis, recording, or tool invocation.
Debug by isolating app setup, webhook/event delivery, stream authorization, network connectivity, and media payload decoding.
References
Full preserved guide: references/full-guide.md
Connection architecture: concepts/connection-architecture.md
Lifecycle flow: concepts/lifecycle-flow.md
Media types: references/media-types.md
Data types: references/data-types.md
RTMS bot example: examples/rtms-bot.md
Common issues: troubleshooting/common-issues.md
Files
- ATTRIBUTION.mdAdded by AutoGineer860 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.6 KiB
- SKILL.md1.6 KiB
- agents/openai.yaml140 B
- concepts/connection-architecture.md9.1 KiB
- concepts/lifecycle-flow.md13.4 KiB
- examples/ai-integration.md11.3 KiB
- examples/manual-websocket.md16.8 KiB
- examples/rtms-bot.md25.9 KiB
- examples/sdk-quickstart.md9.3 KiB
- references/connection.md8.0 KiB
- references/data-types.md13.7 KiB
- references/environment-variables.md1.3 KiB
- references/full-guide.md22.9 KiB
- references/media-types.md6.0 KiB
- references/quickstart.md6.6 KiB
- references/webhooks.md7.4 KiB
- troubleshooting/common-issues.md10.4 KiB
references/media-types.md
RTMS - Media Types
Audio, video, transcript, chat, and screen share data formats.
Media Type Bitmask
Use bitwise OR to combine types:
| Type | Value | Event Name | Description |
|---|---|---|---|
| Audio | 1 | audio | PCM audio samples |
| Video | 2 | video | H.264 encoded frames |
| Screen Share | 4 | sharescreen | Separate from video! |
| Transcript | 8 | transcript | Real-time speech-to-text |
| Chat | 16 | chat | In-meeting chat messages |
| All | 32 | all events | All media types |
Example: Audio + Transcript = 1 | 8 = 9
const mediaTypes = RTMSManager.MEDIA.AUDIO | RTMSManager.MEDIA.TRANSCRIPT; // 9Audio
| Property | Options |
|---|---|
| Sample Rate | 8kHz (0), 16kHz (1), 32kHz (2), 48kHz (3) |
| Codec | L16/PCM (1), G.711 (2), G.722 (3), Opus (4) |
| Channels | Mono (1), Stereo (2) |
| Data Option | Mixed (1), Multi-stream (2) |
| Send Rate | 20ms (recommended) |
Important: Stereo is ONLY supported with Opus codec!
Audio Configuration Example
const audioParams = {
content_type: 1, // MEDIA_CONTENT_TYPE_RTP
sample_rate: 1, // 16kHz
channel: 1, // Mono
codec: 1, // L16 (PCM)
data_opt: 1, // Mixed stream (all participants)
send_rate: 20 // 20ms intervals
};Processing Audio
RTMSManager.on('audio', ({ buffer, userName, timestamp }) => {
// buffer = PCM 16-bit samples
// Send to transcription service, save to file, etc.
transcriptionService.process(buffer);
});Video
| Property | Options |
|---|---|
| Codec | H.264 (7), JPG (5), PNG (6) |
| Resolution | SD (1), HD 720p (2), FHD 1080p (3), QHD 2K (4) |
| FPS | 1-30 (typically 25) |
| Data Option | Single active (3), Speaker view (4), Gallery view (5), Single individual stream (March 2026) |
Rule: Use JPG/PNG when fps <= 5, H.264 when fps > 5
Video Configuration Example
const videoParams = {
codec: 7, // H.264
resolution: 2, // HD 720p
fps: 25,
data_opt: 3 // Single active speaker
};Single Individual Participant Video
March 2026 added a new pattern for selecting one participant camera stream at a time.
Use it when you need:
per-user vision processing
a moderator-selected camera feed
deterministic participant focus instead of active speaker switching
Configuration rules:
set the video
data_opttoVIDEO_SINGLE_INDIVIDUAL_STREAMsubscribe to
PARTICIPANT_VIDEO_ON/PARTICIPANT_VIDEO_OFFsend
VIDEO_SUBSCRIPTION_REQwith the chosenuser_ida new subscription overrides the previous participant stream
This is not a multi-participant subscription feature. RTMS currently supports only one individual participant video stream at a time.
Processing Video
RTMSManager.on('video', ({ buffer, userName, timestamp }) => {
// buffer = H.264 NAL units
// Decode with FFmpeg, save, or stream
videoDecoder.decode(buffer);
});Screen Share (SEPARATE from Video!)
Screen share has a different event from regular video (msg_type 16 vs 15).
| Property | Options |
|---|---|
| Codec | JPG (5), PNG (6), H.264 (7) |
| Resolution | SD (1), HD 720p (2), FHD 1080p (3), QHD 2K (4) |
| FPS | 1-5 for static content, 15-30 for animations |
Screen Share Configuration
const deskshareParams = {
codec: 5, // JPG (good for static slides)
resolution: 2, // HD
fps: 1 // Low FPS for slides
};Processing Screen Share
RTMSManager.on('sharescreen', ({ buffer, userName, timestamp }) => {
// buffer = JPG/PNG image or H.264 frame
saveScreenCapture(buffer);
});Transcript
| Property | Value |
|---|---|
| Format | JSON text |
| Content Type | 5 (MEDIA_CONTENT_TYPE_TEXT) |
| Languages | 36 supported (see below) |
src_language | Fixed requested language |
enable_lid | Toggle Language Identification (default enabled) |
Language IDs (Common)
| Language | ID |
|---|---|
| English | 9 |
| Chinese (Simplified) | 4 |
| Chinese (Traditional) | 5 |
| Japanese | 20 |
| Korean | 21 |
| Spanish | 28 |
| French (France) | 13 |
| German | 14 |
Tip: Use src_language plus enable_lid: false to force a fixed language. Leave enable_lid enabled when you want automatic language switching.
Transcript Structure
{
"user_id": "user_id",
"user_name": "Speaker Name",
"text": "Transcribed text content",
"timestamp": 1234567890,
"is_final": true
}Processing Transcript
RTMSManager.on('transcript', ({ text, userName, timestamp }) => {
// text = transcribed speech
// is_final = true for finalized segments
saveTranscript(userName, text);
});Chat
| Property | Value |
|---|---|
| Format | JSON text |
| Content Type | 5 (MEDIA_CONTENT_TYPE_TEXT) |
Processing Chat
RTMSManager.on('chat', ({ text, userName, timestamp }) => {
console.log(`[Chat] ${userName}: ${text}`);
saveChatMessage(userName, text);
});Complete Media Configuration
const mediaParams = {
audio: {
content_type: 1, // RTP
sample_rate: 1, // 16kHz
channel: 1, // Mono
codec: 1, // L16 (PCM)
data_opt: 1, // Mixed stream
send_rate: 20
},
video: {
codec: 7, // H.264
resolution: 2, // HD 720p
fps: 25,
data_opt: 3 // Single active speaker
},
deskshare: {
codec: 5, // JPG
resolution: 2, // HD
fps: 1
},
transcript: {
content_type: 5, // TEXT
src_language: 9, // English
enable_lid: false
},
chat: {
content_type: 5 // TEXT
}
};Resources
Data types: https://developers.zoom.us/docs/rtms/data-types/
Media params: https://developers.zoom.us/docs/rtms/media-parameter-definition/
MEDIA_PARAMETERS.md: https://github.com/zoom/rtms-samples/blob/main/MEDIA_PARAMETERS.md
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Zoom
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/zoom/skills/rtms · commit d420d13
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/zoom/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Zoom or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download zoom-rtms.zip