Generated banner for Zoom Rtms
Generated logo for Zoom Rtms

Zoom Rtms

OpenAIOfficialCreated by ZoomDistributed by OpenAI

  • Skill
  • Tool integration
  • Automation and integrations
  • MIT
  • No issues found

From the author

Use when using RTMS.
— the description by Zoom

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/zoom-rtms/download
  2. Unzip 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

  1. Confirm the source surface: Meetings RTMS, Contact Center voice media, or another documented RTMS stream.

  2. Decide whether RTMS is sufficient or whether a Meeting SDK bot is required for participant identity, meeting controls, or UI-visible behavior.

  3. Implement the WebSocket lifecycle first: event subscription, connection validation, media start, heartbeat, reconnect, and shutdown.

  4. Process media types intentionally: audio, video, screen share, chat, live transcript, and metadata have different payload and timing constraints.

  5. Design downstream pipelines for buffering, transcription, AI analysis, recording, or tool invocation.

  6. Debug by isolating app setup, webhook/event delivery, stream authorization, network connectivity, and media payload decoding.

References

Files

references/data-types.md

RTMS Data Types

Complete reference for all RTMS enums and constants.

Message Types (RTMS_MESSAGE_TYPE)

ValueNameDirectionDescription
0UNDEFINED-Default
1SIGNALING_HAND_SHAKE_REQClient -> ServerSignaling handshake request
2SIGNALING_HAND_SHAKE_RESPServer -> ClientSignaling handshake response
3DATA_HAND_SHAKE_REQClient -> ServerMedia handshake request
4DATA_HAND_SHAKE_RESPServer -> ClientMedia handshake response
5EVENT_SUBSCRIPTIONClient -> ServerSubscribe/unsubscribe events
6EVENT_UPDATEServer -> ClientEvent notification
7CLIENT_READY_ACKClient -> ServerReady to receive media
8STREAM_STATE_UPDATEServer -> ClientStream state changed
9SESSION_STATE_UPDATEServer -> ClientSession state changed
10SESSION_STATE_REQClient -> ServerRequest session state
11SESSION_STATE_RESPServer -> ClientSession state response
12KEEP_ALIVE_REQServer -> ClientHeartbeat ping
13KEEP_ALIVE_RESPClient -> ServerHeartbeat pong
14MEDIA_DATA_AUDIOServer -> ClientAudio data
15MEDIA_DATA_VIDEOServer -> ClientVideo data
16MEDIA_DATA_SHAREServer -> ClientScreen share data
17MEDIA_DATA_TRANSCRIPTServer -> ClientTranscript data
18MEDIA_DATA_CHATServer -> ClientChat data
19STREAM_STATE_REQClient -> ServerRequest stream state
20STREAM_STATE_RESPServer -> ClientStream state response
21STREAM_CLOSE_REQClient -> ServerRequest graceful stream shutdown
22STREAM_CLOSE_RESPServer -> ClientResponse to close stream request
23META_DATA_AUDIOServer -> ClientAudio metadata
24META_DATA_VIDEOServer -> ClientReserved video metadata
25META_DATA_SHAREServer -> ClientReserved share metadata
26META_DATA_TRANSCRIPTServer -> ClientReserved transcript metadata
27META_DATA_CHATServer -> ClientReserved chat metadata
28VIDEO_SUBSCRIPTION_REQClient -> ServerSubscribe or unsubscribe one participant video stream
29VIDEO_SUBSCRIPTION_RESPServer -> ClientResponse to participant video subscription

Event Types (RTMS_EVENT_TYPE)

ValueNameDescription
0UNDEFINEDDefault
1FIRST_PACKET_TIMESTAMPFirst packet received
2ACTIVE_SPEAKER_CHANGEActive speaker changed
3PARTICIPANT_JOINParticipant joined
4PARTICIPANT_LEAVEParticipant left
5SHARING_STARTScreen sharing started
6SHARING_STOPScreen sharing stopped
7MEDIA_CONNECTION_INTERRUPTEDConnection interrupted
8PARTICIPANT_VIDEO_ONParticipant camera turned on
9PARTICIPANT_VIDEO_OFFParticipant camera turned off

Zoom Contact Center Voice Event Types (RTMS_ZCC_VOICE_EVENT_TYPE)

ValueNameDescription
0UNDEFINEDDefault
8CONSUMER_ANSWEREDConsumer answered the call
9CONSUMER_ENDConsumer ended the call
10USER_ANSWEREDUser or agent answered the call
11USER_ENDUser or agent ended the call
12USER_HOLDUser placed the call on hold
13USER_UNHOLDUser resumed the call
14MONITOR_STARTEDMonitoring started
15MONITOR_TRANSITIONEDMonitoring transitioned
16MONITOR_ENDEDMonitoring ended
17TAKEOVER_STARTEDTakeover started
18TRANSFER_INITIATEDTransfer initiated
19TRANSFER_CANCELEDTransfer canceled
20TRANSFER_ACCEPTEDTransfer accepted
21TRANSFER_COMPLETEDTransfer completed
22TRANSFER_REJECTEDTransfer rejected
23TRANSFER_TIMEOUTTransfer timed out
24CONFERENCE_CANCELEDConference canceled
25CONFERENCE_PARTICIPANT_CANCELEDConference participant canceled
26CONFERENCE_PARTICIPANT_INVITEDConference participant invited
27CONFERENCE_PARTICIPANT_REJECTEDConference participant rejected
28CONFERENCE_PARTICIPANT_TIMEOUTConference participant timed out

Status Codes (RTMS_STATUS_CODE)

ValueNameDescription
0STATUS_OKSuccess
1STATUS_INVALID_MESSAGE_TYPEInvalid message type
2STATUS_INVALID_RTMS_STREAM_IDInvalid RTMS stream ID
3STATUS_INVALID_SIGNATUREInvalid signature
4STATUS_INVALID_PAYLOADInvalid payload
5STATUS_INVALID_EVENTSInvalid event list
6STATUS_INVALID_EVENT_TYPEInvalid event type
7STATUS_INVALID_MEDIA_TYPEInvalid media type
8STATUS_DUPLICATE_SIGNAL_REQUESTDuplicate signaling connection
9STATUS_MEDIA_TYPE_AUDIO_NOT_SUPPORTAudio stream not supported
10STATUS_MEDIA_TYPE_VIDEO_NOT_SUPPORTVideo stream not supported
11STATUS_MEDIA_TYPE_DESKSHARE_NOT_SUPPORTScreen share stream not supported
12STATUS_MEDIA_TYPE_TRANSCRIPT_NOT_SUPPORTTranscript stream not supported
13STATUS_MEDIA_TYPE_CHAT_NOT_SUPPORTChat stream not supported
14STATUS_MEDIA_TYPE_INVALID_VALUEInvalid media type value
15STATUS_MEDIA_DATA_ALL_CONNECTION_EXISTAll media data connections already exist
16STATUS_DUPLICATE_MEDIA_DATA_CONNECTIONDuplicate media data connection
17STATUS_INVALID_MEDIA_PARAMSInvalid media params
18STATUS_INVALID_MEDIA_AUDIO_PARAMSInvalid audio params
19STATUS_INVALID_MEDIA_AUDIO_CONTENT_TYPEInvalid audio content type
20STATUS_INVALID_MEDIA_AUDIO_SAMPLE_RATEInvalid audio sample rate
21STATUS_INVALID_MEDIA_AUDIO_CHANNELInvalid audio channel count
22STATUS_INVALID_MEDIA_AUDIO_CODECInvalid audio codec
23STATUS_INVALID_MEDIA_AUDIO_DATA_OPTInvalid audio data option
24STATUS_INVALID_MEDIA_AUDIO_SEND_RATEInvalid audio send rate
25STATUS_INVALID_MEDIA_VIDEO_PARAMSInvalid video params
26STATUS_INVALID_MEDIA_VIDEO_CONTENT_TYPEInvalid video content type
27STATUS_INVALID_MEDIA_VIDEO_CODECInvalid video codec
28STATUS_INVALID_MEDIA_VIDEO_RESOLUTIONInvalid video resolution
29STATUS_INVALID_MEDIA_VIDEO_DATA_OPTInvalid video data option
30STATUS_INVALID_MEDIA_VIDEO_FPSInvalid video FPS
31STATUS_INVALID_MEDIA_DESKSHARE_PARAMSInvalid deskshare params
32STATUS_INVALID_MEDIA_DESKSHARE_CONTENT_TYPEInvalid deskshare content type
33STATUS_INVALID_MEDIA_DESKSHARE_CODECInvalid deskshare codec
34STATUS_INVALID_MEDIA_DESKSHARE_RESOLUTIONInvalid deskshare resolution
35STATUS_INVALID_MEDIA_DESKSHARE_FPSInvalid deskshare FPS
36STATUS_INVALID_MEDIA_TRANSCRIPT_PARAMSInvalid transcript params
37STATUS_INVALID_MEDIA_TRANSCRIPT_CONTENT_TYPEInvalid transcript content type
38STATUS_INVALID_MEDIA_CHAT_PARAMSInvalid chat params
39STATUS_INVALID_MEDIA_CHAT_CONTENT_TYPEInvalid chat content type
40STATUS_INVALID_RTMS_SESSION_IDInvalid RTMS session ID
41STATUS_INVALID_CLIENT_READY_ACKInvalid client ready ack
42STATUS_INVALID_EVENT_SUBSCRIBEInvalid event subscription payload
43STATUS_INVALID_MEDIA_TRANSCRIPT_SROUCE_LANGUAGEInvalid transcript source language

Media Data Types (MEDIA_DATA_TYPE)

Use bitwise OR to combine:

ValueNameConstant
1AUDIO0x01
2VIDEO0x01 << 1
4DESKSHARE0x01 << 2
8TRANSCRIPT0x01 << 3
16CHAT0x01 << 4
32ALL0x01 << 5

Common combinations:

  • Audio + Transcript: 1 | 8 = 9

  • Audio + Video: 1 | 2 = 3

  • All media: 32

Content Types (MEDIA_CONTENT_TYPE)

ValueNameDescription
0UNDEFINEDDefault
1RTPReal-time audio/video
2RAW_AUDIORaw audio data
3RAW_VIDEORaw video data
4FILE_STREAMFile stream
5TEXTText (transcript, chat)

Payload Types / Codecs (MEDIA_PAYLOAD_TYPE)

ValueNameUse
0UNDEFINED-
1L16Audio - PCM uncompressed
2G711Audio - compressed
3G722Audio - compressed
4OPUSAudio - compressed
5JPGVideo/Share - when fps <= 5
6PNGVideo/Share - when fps <= 5
7H264Video/Share - when fps > 5

Media Data Options (MEDIA_DATA_OPTION)

ValueNameDescription
0UNDEFINED-
1AUDIO_MIXED_STREAMAll audio combined
2AUDIO_MULTI_STREAMSPer-participant audio
3VIDEO_SINGLE_ACTIVE_STREAMActive speaker video
4VIDEO_SINGLE_INDIVIDUAL_STREAMOne manually selected participant video stream

Media Resolution (MEDIA_RESOLUTION)

ValueNamePixels
1SD854x480 or 640x360
2HD1280x720
3FHD1920x1080
4QHD2560x1440

Audio Sample Rate (AUDIO_SAMPLE_RATE)

ValueNameRate
0SR_8K8000 Hz
1SR_16K16000 Hz
2SR_32K32000 Hz
3SR_48K48000 Hz

Audio Channel (AUDIO_CHANNEL)

ValueNameNote
1MONODefault
2STEREOOnly with OPUS codec!

Session State (RTMS_SESSION_STATE)

ValueNameDescription
0INACTIVEDefault
1INITIALIZESession initializing
2STARTEDSession started
3PAUSEDSession paused
4RESUMEDSession resumed
5STOPPEDSession stopped

Stream State (RTMS_STREAM_STATE)

ValueNameDescription
0INACTIVEDefault
1ACTIVEStreaming
2INTERRUPTEDConnection problem
3TERMINATINGEnding
4TERMINATEDEnded
5PAUSEDPaused
6RESUMEDResumed

Stop Reasons (RTMS_STOP_REASON)

ValueNameDescription
0UNDEFINEDDefault
1STOP_BC_HOST_TRIGGEREDHost stopped
2STOP_BC_USER_TRIGGEREDUser stopped
3STOP_BC_USER_LEFTUser left meeting
4STOP_BC_USER_EJECTEDUser ejected by host
5STOP_BC_HOST_DISABLED_APPHost disabled app
6STOP_BC_MEETING_ENDEDMeeting ended
7STOP_BC_STREAM_CANCELEDStream canceled
8STOP_BC_STREAM_REVOKEDStream revoked (delete assets!)
9STOP_BC_ALL_APPS_DISABLEDAll apps disabled
10STOP_BC_INTERNAL_EXCEPTIONInternal error
11STOP_BC_CONNECTION_TIMEOUTConnection timeout
12STOP_BC_INSTANCE_CONNECTION_INTERRUPTEDInstance/media connection interrupted
13STOP_BC_SIGNAL_CONNECTION_INTERRUPTEDSignaling issue
14STOP_BC_DATA_CONNECTION_INTERRUPTEDData connection issue
15STOP_BC_SIGNAL_CONNECTION_CLOSED_ABNORMALLYAbnormal close
16STOP_BC_DATA_CONNECTION_CLOSED_ABNORMALLYAbnormal close
17STOP_BC_EXIT_SIGNALExit signal received
18STOP_BC_AUTHENTICATION_FAILUREAuth failed
19STOP_BC_AWAIT_RECONNECTION_TIMEOUTAwaited reconnection timed out
20STOP_BC_RECEIVER_REQUEST_CLOSEReceiver requested stream close
21STOP_BC_CUSTOMER_DISCONNECTEDContact Center customer disconnected
22STOP_BC_AGENT_DISCONNECTEDContact Center agent disconnected
23STOP_BC_ADMIN_DISABLED_APPAdmin disabled app
24STOP_BC_KEEP_ALIVE_TIMEOUTThree keep-alive requests missed
25STOP_BC_MANUAL_API_TRIGGEREDZCC Voice API triggered stop
26STOP_BC_STREAMING_NOT_SUPPORTEDQueue does not support streaming

Transcript Languages (RTMS_TRANSCRIPT_LANGUAGE)

ValueNameLanguage
-1LANGUAGE_ID_NONENone/Auto-detect
0LANGUAGE_ID_ARABICArabic
1LANGUAGE_ID_BENGALIBengali
2LANGUAGE_ID_CANTONESECantonese
3LANGUAGE_ID_CATALANCatalan
4LANGUAGE_ID_CHINESE_SIMPLIFIEDChinese (Simplified)
5LANGUAGE_ID_CHINESE_TRADITIONALChinese (Traditional)
6LANGUAGE_ID_CZECHCzech
7LANGUAGE_ID_DANISHDanish
8LANGUAGE_ID_DUTCHDutch
9LANGUAGE_ID_ENGLISHEnglish (Default)
10LANGUAGE_ID_ESTONIANEstonian
11LANGUAGE_ID_FINNISHFinnish
12LANGUAGE_ID_FRENCH_CANADAFrench (Canada)
13LANGUAGE_ID_FRENCH_FRANCEFrench (France)
14LANGUAGE_ID_GERMANGerman
15LANGUAGE_ID_HEBREWHebrew
16LANGUAGE_ID_HINDIHindi
17LANGUAGE_ID_HUNGARIANHungarian
18LANGUAGE_ID_INDONESIANIndonesian
19LANGUAGE_ID_ITALIANItalian
20LANGUAGE_ID_JAPANESEJapanese
21LANGUAGE_ID_KOREANKorean
22LANGUAGE_ID_MALAYMalay
23LANGUAGE_ID_PERSIANPersian
24LANGUAGE_ID_POLISHPolish
25LANGUAGE_ID_PORTUGUESEPortuguese
26LANGUAGE_ID_ROMANIANRomanian
27LANGUAGE_ID_RUSSIANRussian
28LANGUAGE_ID_SPANISHSpanish
29LANGUAGE_ID_SWEDISHSwedish
30LANGUAGE_ID_TAGALOGTagalog
31LANGUAGE_ID_TAMILTamil
32LANGUAGE_ID_TELUGUTelugu
33LANGUAGE_ID_THAIThai
34LANGUAGE_ID_TURKISHTurkish
35LANGUAGE_ID_UKRAINIANUkrainian
36LANGUAGE_ID_VIETNAMESEVietnamese

Transcript Handshake Controls

Transcript media handshakes now use:

  • src_language: fixed requested transcription language

  • enable_lid: boolean switch for Language Identification

Behavior:

  • enable_lid: true or omitted: RTMS can automatically switch languages during transcription

  • enable_lid: false: RTMS stays on src_language and does not auto-switch

Next Steps

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