Живые медиа встреч Zoom (RTMS)
Справочник по Zoom RTMS: приём звука, видео, расшифровки и чата встреч и вебинаров в реальном времени без ботов-участников.
- Что делает
- Справочник по Zoom RTMS: приём звука, видео, расшифровки и чата встреч и вебинаров в реальном времени без ботов-участников.
- Когда брать
- Когда нужно получать живой звук, видео, чат или расшифровку встречи на сервер для ИИ-помощника, записи или аналитики.
- Когда не брать
- Если нужна расшифровка готовых файлов (для этого есть scribe) или бот-участник (для этого есть build-zoom-bot).
- Пример запроса
- Сделай сервис, который в реальном времени получает расшифровку наших встреч в Zoom и готовит резюме.
- Нужно подключить
- терминал, Node.js или Python
Входит в плагин zoom-plugin. В Cowork и Claude Code можно поставить плагин целиком.
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
zoom-rtmsв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: zoom-rtms
description: Справочный скилл по Zoom RTMS. Используй после выбора процесса работы с живыми медиа при обработке звука, видео, чата, расшифровок, демонстрации экрана и голосовых потоков контакт-центра в реальном времени.
user-invocable: false
triggers:
- "real-time media"
- "rtms"
- "live audio stream"
- "live video stream"
- "meeting transcription"
- "raw audio"
- "raw video"
- "websocket media"
- "live transcript"
- "streaming audio"
- "streaming video"
- "meeting bot media"
- "contact center voice media"
- "participant video on"
- "participant video off"
- "single individual video stream"
---
Zoom Realtime Media Streams (RTMS)
Справочный материал по конвейерам живых медиа Zoom. Сначала предпочитай build-zoom-bot, а затем используй этот скилл для типов потоков, возможностей и ограничений реализации, специфичных для RTMS.
Zoom Realtime Media Streams (RTMS)
Экспертное руководство по получению в реальном времени живых данных звука, видео, расшифровки, чата и демонстрации экрана из встреч, вебинаров, сеансов Video SDK и голосовых каналов Zoom Contact Center. RTMS работает по протоколу на основе WebSocket с открытыми стандартами и не требует бота-участника, чтобы забирать медиаданные.
Прочитай это в первую очередь (критично)
RTMS — это прежде всего серверная служба приёма медиа.
- Твой бэкенд получает и обрабатывает живые медиа: звук, видео, демонстрацию экрана, чат, расшифровку.
- RTMS сам по себе — не SDK для пользовательского интерфейса.
- Обработка запускается событием: бэкенд ждёт вебхуков о старте RTMS, и только потом начинает работать с потоком.
Необязательная архитектура (встречается часто):
- Добавь фронтенд на Zoom App SDK для интерфейса и элементов управления внутри клиента.
- Передавай результаты RTMS с бэкенда на фронтенд по WebSocket (или через SSE, gRPC, очереди рабочих процессов и т. п.).
Используй RTMS для плоскости медиа и данных, а фронтенд-фреймворки и приложения Zoom — для отображения и действий пользователя.
Официальная документация: https://developers.zoom.us/docs/rtms/ Справочник по SDK (JS): https://zoom.github.io/rtms/js/ Справочник по SDK (Python): https://zoom.github.io/rtms/py/ Репозиторий с примерами: https://github.com/zoom/rtms-samples
Быстрые ссылки
Впервые работаешь с RTMS? Иди по этому пути:
- [Архитектура соединения](concepts/connection-architecture.md) — двухфазная схема WebSocket
- [Быстрый старт с SDK](examples/sdk-quickstart.md) — самый быстрый способ получать медиа (рекомендуется)
- [WebSocket вручную](examples/manual-websocket.md) — полный контроль над протоколом без SDK
- [Типы медиа](references/media-types.md) — звук, видео, расшифровка, чат, демонстрация экрана
Полная реализация:
- [RTMS-бот](examples/rtms-bot.md) — пошаговое руководство по созданию бота от начала до конца
Справочные материалы:
- [Жизненный цикл](concepts/lifecycle-flow.md) — полный путь от вебхука до потоковой передачи
- [Типы данных](references/data-types.md) — все перечисления и константы
- [Вебхуки](references/webhooks.md) — подробности подписки на события
- [Переменные окружения](references/environment-variables.md) — режимы учётных данных и параметры времени выполнения
- [Заметки к быстрому старту](references/quickstart.md) — дополнительное руководство по быстрому старту
- Сводный указатель — см. раздел ниже в этом файле
Что-то не работает?
- Соединение не устанавливается -> [Частые проблемы](troubleshooting/common-issues.md)
- Дублирующиеся соединения -> [Подводные камни вебхуков](troubleshooting/common-issues.md#webhook-response-timing)
- Нет звука или видео -> [Настройка медиа](references/media-types.md)
- Начни с предварительных проверок -> [Пятиминутный чек-лист](RUNBOOK.md)
Поддерживаемые продукты
| Продукт | Событие вебхука | Идентификатор в данных | Тип приложения |
|---|---|---|---|
| Встречи (Meetings) | meeting.rtms_started / meeting.rtms_stopped | meeting_uuid | General App |
| Вебинары (Webinars) | webinar.rtms_started / webinar.rtms_stopped | meeting_uuid (тот же!) | General App |
| Video SDK | session.rtms_started / session.rtms_stopped | session_id | Video SDK App |
| Zoom Contact Center Voice | События RTMS/ZCC Voice, свои для продукта | Идентификаторы потоков и сеансов, свои для продукта | Contact Center / одобренная интеграция RTMS |
После подключения базовая модель сокетов сигнализации и медиа общая для всех продуктов. Встречи, вебинары и сеансы Video SDK используют привычные вебхуки старта и остановки. У Zoom Contact Center Voice свой набор событий RTMS/ZCC Voice; относись к нему как к той же транспортной модели, но с собственными данными событий.
Обзор RTMS
RTMS — это конвейер данных, который даёт твоему приложению доступ к живым медиа из встреч, вебинаров и сеансов Video SDK без ботов-участников. Вместо того чтобы подключать к встречам автоматических клиентов, используй RTMS и забирай медиаданные прямо из инфраструктуры Zoom.
Что даёт RTMS
| Тип медиа | Формат | Сценарии использования |
|---|---|---|
| Звук | PCM (L16), G.711, G.722, Opus | Расшифровка, анализ голоса, запись |
| Видео | H.264, JPG, PNG | Запись, ИИ-зрение, миниатюры, выбор активного участника |
| Демонстрация экрана | H.264, JPG, PNG | Захват содержимого, извлечение слайдов |
| Расшифровка | Текст JSON | Заметки по встречам, поиск, соответствие требованиям |
| Чат | Текст JSON | Архив, анализ тональности |
Изменения протокола в марте 2026 года
- Поддержка Zoom Contact Center Voice: RTMS теперь охватывает сценарии звука и расшифровки в Contact Center Voice.
- Управление определением языка расшифровки (Language Identification): рукопожатия медиа для расшифровки теперь поддерживают
src_languageиenable_lid. По умолчанию определение языка включено. Чтобы зафиксировать язык, задайenable_lid: false. - Подписка на видеопоток одного участника: RTMS теперь может передавать видео с камеры одного участника за раз, если
data_optравенVIDEO_SINGLE_INDIVIDUAL_STREAM. - Корректное завершение по инициативе клиента: бэкенды могут отправить
STREAM_CLOSE_REQпо сокету сигнализации и дождатьсяSTREAM_CLOSE_RESP. - Допуск по keep-alive для медиа увеличен: тайм-аут keep-alive медиасокета теперь 65 секунд, а не 35.
Два подхода
| Подход | Лучше всего подходит для | Сложность |
|---|---|---|
SDK (@zoom/rtms) | Большинства случаев | Низкая — сложности WebSocket берёт на себя SDK |
| WebSocket вручную | Собственных протоколов, других языков | Высокая — полная реализация протокола |
Предварительные требования
- Node.js 20.3.0+ (рекомендуется 24 LTS) для JavaScript SDK
- Python 3.10+ для Python SDK
- Zoom General App (для встреч и вебинаров) или Video SDK App (для Video SDK) с включённой функцией RTMS
- Конечная точка вебхука для событий RTMS
- Сервер для приёма потоков WebSocket
Нужен доступ к RTMS? Напиши на форуме разработчиков Zoom с запросом доступа к RTMS и описанием своего сценария.
Быстрый старт (SDK — рекомендуется)
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);
});
Быстрый старт (WebSocket вручную)
Для полного контроля или языков без SDK реализуй двухфазный протокол WebSocket:
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
}
См.: [руководство по WebSocket вручную](examples/manual-websocket.md) — полная реализация.
Битовая маска типов медиа
Комбинируй типы побитовым ИЛИ:
| Тип | Значение | Описание |
|---|---|---|
| Звук | 1 | Отсчёты PCM-звука |
| Видео | 2 | Кадры видео H.264/JPG |
| Демонстрация экрана | 4 | Отдельно от видео! |
| Расшифровка | 8 | Преобразование речи в текст в реальном времени |
| Чат | 16 | Сообщения чата во время встречи |
| Все | 32 | Все типы медиа |
Пример: звук + расшифровка = 1 | 8 = 9
Критичные подводные камни
| Проблема | Решение |
|---|---|
| Разрешено только 1 соединение | Новые соединения выбивают существующие. Отслеживай активные сеансы! |
| Отвечай 200 сразу | Если вебхук задерживается, Zoom повторяет запрос и создаёт дублирующиеся соединения |
| Heartbeat обязателен | Отвечай на msg_type 12 сообщением msg_type 13, иначе соединение оборвётся |
| Переподключение — твоя забота | RTMS не переподключается сам. Допуск по keep-alive для медиа теперь около 65 с, для сигнализации остаётся около 60 с |
| Дрейф языка расшифровки | Используй src_language вместе с enable_lid: false, если нужна расшифровка на фиксированном языке вместо автоматического переключения языков |
| Видео только одного участника | VIDEO_SINGLE_INDIVIDUAL_STREAM поддерживает одного участника за раз. Новый VIDEO_SUBSCRIPTION_REQ отменяет предыдущий выбор |
| Корректное закрытие теперь явное | Используй STREAM_CLOSE_REQ / STREAM_CLOSE_RESP, когда бэкенд хочет завершить поток чисто |
Переменные окружения
Переменные окружения SDK
# 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
Переменные для реализации вручную
ZOOM_CLIENT_ID=your_client_id
ZOOM_CLIENT_SECRET=your_client_secret
ZOOM_SECRET_TOKEN=your_webhook_token # For webhook validation
Настройка приложения Zoom
Для встреч и вебинаров (General App)
- Открой marketplace.zoom.us -> Develop -> Build App
- Выбери General App -> User-Managed
- Features -> Access -> Enable Event Subscription
- Add Events -> найди «rtms» -> выбери:
meeting.rtms_startedmeeting.rtms_stoppedwebinar.rtms_started(если используешь вебинары)webinar.rtms_stopped(если используешь вебинары)- Scopes -> Add Scopes -> найди «rtms» -> добавь:
meeting:read:meeting_audiomeeting:read:meeting_videomeeting:read:meeting_transcriptmeeting:read:meeting_chatwebinar:read:webinar_audio(если используешь вебинары)webinar:read:webinar_video(если используешь вебинары)webinar:read:webinar_transcript(если используешь вебинары)webinar:read:webinar_chat(если используешь вебинары)
Для Video SDK (Video SDK App)
- Открой marketplace.zoom.us -> Develop -> Build App
- Выбери Video SDK App
- Используй свои SDK Key и SDK Secret (а не OAuth Client ID/Secret)
- Добавь события:
session.rtms_startedsession.rtms_stopped
Репозитории с примерами
Официальные примеры
| Репозиторий | Описание |
|---|---|
| rtms-samples | RTMSManager, заготовки, примеры с ИИ |
| rtms-quickstart-js | Быстрый старт с JavaScript SDK |
| rtms-quickstart-py | Быстрый старт с Python SDK |
| rtms-sdk-cpp | C++ SDK |
| zoom-rtms | Основной репозиторий SDK |
Примеры интеграции с ИИ
| Пример | Описание |
|---|---|
| rtms-meeting-assistant-starter-kit | ИИ-помощник для встреч с резюме |
| arlo-meeting-assistant | Промышленный помощник для встреч с базой данных |
| videosdk-rtms-transcribe-audio | Расшифровка через Whisper |
Полная документация
Концепции
- [Архитектура соединения](concepts/connection-architecture.md) — двухфазная схема WebSocket
- [Жизненный цикл](concepts/lifecycle-flow.md) — путь от вебхука до потоковой передачи
Примеры
- [Быстрый старт с SDK](examples/sdk-quickstart.md) — работа с SDK @zoom/rtms
- [WebSocket вручную](examples/manual-websocket.md) — реализация «сырого» протокола
- [RTMS-бот](examples/rtms-bot.md) — полное руководство по реализации бота
- [Интеграция с ИИ](examples/ai-integration.md) — шаблоны расшифровки и анализа
Справочные материалы
- [Типы медиа](references/media-types.md) — звук, видео, расшифровка, чат, демонстрация экрана
- [Типы данных](references/data-types.md) — все перечисления и константы
- [Соединение](references/connection.md) — подробности протокола WebSocket
- [Вебхуки](references/webhooks.md) — подписка на события
Устранение неполадок
- [Частые проблемы](troubleshooting/common-issues.md) — вопросы и ответы, решения
Ресурсы
- Официальная документация: https://developers.zoom.us/docs/rtms/
- Типы данных: https://developers.zoom.us/docs/rtms/data-types/
- Параметры медиа: https://developers.zoom.us/docs/rtms/media-parameter-definition/
- Форум разработчиков: https://devforum.zoom.us/
Нужна помощь? Начни с раздела «Сводный указатель» ниже — там полная навигация.
Сводный указатель
_Этот раздел перенесён из SKILL.md._
RTMS даёт доступ в реальном времени к живому звуку, видео, расшифровке, чату и демонстрации экрана из встреч, вебинаров и сеансов Video SDK.
Критичное позиционирование
Относись к RTMS как к серверной службе для приёма и обработки медиапотоков.
- Роль бэкенда: принимать звук, видео, демонстрацию экрана, чат и расшифровку, запускать ИИ и аналитику, сохранять или пересылать данные.
- Необязательная роль фронтенда: Zoom App SDK или веб-панель, которая использует обработанные данные потока, полученные от бэкенда по транспорту (WebSocket, SSE или другому).
- Модель запуска: бэкенд ждёт вебхуков о старте RTMS и только затем начинает обработку потока.
Не проектируй RTMS как SDK, работающий только на фронтенде.
Путь быстрого старта
Если ты впервые работаешь с RTMS, иди в таком порядке:
- Сначала выполни предварительные проверки -> [RUNBOOK.md](RUNBOOK.md)
- Пойми архитектуру -> [concepts/connection-architecture.md](concepts/connection-architecture.md)
- Двухфазный WebSocket: сигнализация + медиа
- Почему RTMS не использует ботов
- Выбери подход -> SDK или вручную
- SDK (рекомендуется): [examples/sdk-quickstart.md](examples/sdk-quickstart.md)
- WebSocket вручную: [examples/manual-websocket.md](examples/manual-websocket.md)
- Пойми жизненный цикл -> [concepts/lifecycle-flow.md](concepts/lifecycle-flow.md)
- Вебхук -> сигнализация -> медиа -> потоковая передача
- Настрой типы медиа -> [references/media-types.md](references/media-types.md)
- Звук, видео, расшифровка, чат, демонстрация экрана
- Устрани проблемы -> [troubleshooting/common-issues.md](troubleshooting/common-issues.md)
- Проблемы с соединением, дублирующиеся вебхуки, отсутствующие данные
Структура документации
rtms/
├── SKILL.md # Обзор основного скилла
├── SKILL.md # Этот файл — навигационное руководство
│
├── concepts/ # Основные архитектурные шаблоны
│ ├── connection-architecture.md # Двухфазная схема WebSocket
│ └── lifecycle-flow.md # Путь от вебхука до потоковой передачи
│
├── examples/ # Полные рабочие примеры кода
│ ├── sdk-quickstart.md # Работа с SDK @zoom/rtms
│ ├── manual-websocket.md # Реализация «сырого» протокола
│ ├── rtms-bot.md # Полная реализация RTMS-бота
│ └── ai-integration.md # Расшифровка и анализ
│
├── references/ # Справочная документация
│ ├── media-types.md # Звук, видео, расшифровка, чат, демонстрация экрана
│ ├── data-types.md # Все перечисления и константы
│ ├── connection.md # Подробности протокола WebSocket
│ └── webhooks.md # Подписка на события
│
└── troubleshooting/ # Руководства по устранению проблем
└── common-issues.md # Вопросы и ответы, решения
По сценариям использования
Хочу получать расшифровки встреч
- [Быстрый старт с SDK](examples/sdk-quickstart.md) — самый быстрый способ
- [Типы медиа](references/media-types.md#transcript) — настройка расшифровки
- [Интеграция с ИИ](examples/ai-integration.md) — Whisper, Deepgram, AssemblyAI
Хочу записывать встречи
- [Типы медиа](references/media-types.md) — настройка звука и видео
- [Быстрый старт с SDK](examples/sdk-quickstart.md) — получение медиа
- [Интеграция с ИИ](examples/ai-integration.md#audio-recording) — запись с заполнением пропусков
Хочу создать ИИ-помощника для встреч
- [Интеграция с ИИ](examples/ai-integration.md) — готовые шаблоны
- [Быстрый старт с SDK](examples/sdk-quickstart.md) — приём медиа
- [Жизненный цикл](concepts/lifecycle-flow.md) — обработка событий
Хочу создать полноценного RTMS-бота
- [RTMS-бот](examples/rtms-bot.md) — полное руководство по реализации
- [Жизненный цикл](concepts/lifecycle-flow.md) — путь от вебхука до потоковой передачи
- [Архитектура соединения](concepts/connection-architecture.md) — двухфазная схема
Мне нужен полный контроль над протоколом
- [WebSocket вручную](examples/manual-websocket.md) — НАЧНИ ЗДЕСЬ
- [Архитектура соединения](concepts/connection-architecture.md) — двухфазная схема
- [Типы данных](references/data-types.md) — все типы сообщений и перечисления
- [Соединение](references/connection.md) — подробности протокола
Получаю ошибки соединения
- [Частые проблемы](troubleshooting/common-issues.md) — диагностический чек-лист
- [Архитектура соединения](concepts/connection-architecture.md) — проверь последовательность
- [Вебхуки](references/webhooks.md) — проверка и тайминг
Хочу разобраться в архитектуре
- [Архитектура соединения](concepts/connection-architecture.md) — двухфазный WebSocket
- [Жизненный цикл](concepts/lifecycle-flow.md) — полная схема потока
- [Типы данных](references/data-types.md) — константы протокола
По продуктам
Я разрабатываю для Zoom Meetings
- Стандартная настройка RTMS. Событие вебхука:
meeting.rtms_started. Используется General App с OAuth. - Начни с [быстрого старта с SDK](examples/sdk-quickstart.md) или [WebSocket вручную](examples/manual-websocket.md).
Я разрабатываю для Zoom Webinars
- То же, что для встреч, но событие вебхука —
webinar.rtms_started. В данных по-прежнему используетсяmeeting_uuid(НЕwebinar_uuid). - Добавь области доступа и подписки на события для вебинаров. См. [Вебхуки](references/webhooks.md).
- Подтверждена доступность только потоков докладчиков (panelist). Потоки зрителей могут быть не отдельными.
Я разрабатываю для Zoom Video SDK
- Событие вебхука:
session.rtms_started. В данных используетсяsession_id(НЕmeeting_uuid). - Нужен Video SDK App с SDK Key/Secret (а не OAuth Client ID/Secret).
- После подключения протокол идентичен протоколу встреч.
- Подробности о данных — в разделе [Вебхуки](references/webhooks.md).
Ключевые документы
1. Архитектура соединения (КРИТИЧНО)
[concepts/connection-architecture.md](concepts/connection-architecture.md)
RTMS использует два отдельных соединения WebSocket:
- WebSocket сигнализации: авторизация, управление, heartbeat
- WebSocket медиа: сами данные звука, видео и расшифровки
2. SDK или вручную (ТОЧКА РЕШЕНИЯ)
[examples/sdk-quickstart.md](examples/sdk-quickstart.md) или [examples/manual-websocket.md](examples/manual-websocket.md)
| SDK | Вручную |
|---|---|
| Берёт на себя сложности WebSocket | Полный контроль над протоколом |
| Автоматическое переподключение | Переподключение своими силами |
| Меньше кода | Больше кода |
| Лучше всего для большинства случаев | Лучше всего для особых требований |
3. Критичные подводные камни (САМЫЕ ЧАСТЫЕ ПРОБЛЕМЫ)
[troubleshooting/common-issues.md](troubleshooting/common-issues.md)
- Отвечай 200 сразу — задержка ответа вебхука приводит к дублям
- Только 1 соединение на поток — новые соединения выбивают существующие
- Heartbeat обязателен — нужно отвечать на keep-alive, иначе соединение оборвётся
- Отслеживай активные сеансы — предотвращай повторные попытки подключения
Ключевые выводы
Критичные открытия:
- Двухфазная схема WebSocket
- Сигнализация: плоскость управления (рукопожатие, heartbeat, старт и остановка)
- Медиа: плоскость данных (звук, видео, расшифровка, чат, демонстрация экрана)
- См.: [Архитектура соединения](concepts/connection-architecture.md)
- Тайминг ответа на вебхук
- ОБЯЗАТЕЛЬНО отвечай 200 ДО любой обработки
- Задержка ответа -> Zoom повторяет запрос -> дублирующиеся соединения
- См.: [Частые проблемы](troubleshooting/common-issues.md#webhook-response-timing)
- Heartbeat обязателен
- Сигнализация: получаешь msg_type 12, отвечаешь msg_type 13
- Медиа: тот же порядок
- Нет ответа = соединение закрывается
- См.: [Соединение](references/connection.md#heartbeat)
- Формирование подписи
- Формат:
HMAC-SHA256(clientSecret, "clientId,meetingUuid,streamId") - Для Video SDK используй
session_idвместоmeetingUuid - Для вебинаров по-прежнему используется
meeting_uuid(неwebinar_uuid) - Нужна и для рукопожатия сигнализации, и для рукопожатия медиа
- См.: [WebSocket вручную](examples/manual-websocket.md#signature-generation)
- Типы медиа — это битовые маски
- Звук=1, Видео=2, Демонстрация экрана=4, Расшифровка=8, Чат=16, Все=32
- Комбинируй через ИЛИ: звук + расшифровка = 1|8 = 9
- См.: [Типы медиа](references/media-types.md)
- Демонстрация экрана — ОТДЕЛЬНО от видео
- Другой msg_type (16 против 15)
- Другой флаг медиа (4 против 2)
- Подписываться нужно отдельно
- См.: [Типы медиа](references/media-types.md#screen-share)
Краткий справочник
«Соединение не устанавливается»
-> [Частые проблемы](troubleshooting/common-issues.md)
«Дублирующиеся соединения»
-> [Тайминг вебхука](troubleshooting/common-issues.md#webhook-response-timing)
«Нет данных звука или видео»
-> [Типы медиа](references/media-types.md) — проверь настройку
«Как реализовать вручную?»
-> [WebSocket вручную](examples/manual-websocket.md)
«Какие бывают типы сообщений?»
-> [Типы данных](references/data-types.md)
«Как подключить ИИ?»
-> [Интеграция с ИИ](examples/ai-integration.md)
Версия документа
Основано на Zoom RTMS SDK v1.x и официальной документации по состоянию на 2026 год.
Приятной разработки!
Помни: начни с [быстрого старта с SDK](examples/sdk-quickstart.md) — это самый быстрый путь, или с [WebSocket вручную](examples/manual-websocket.md), если нужен полный контроль.
Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/knowledge-work-plugins/tree/main/partner-built/zoom-plugin/skills/rtms, лицензия MIT. Изменения: перевод на русский язык.
Оригинал на английском
---
name: zoom-rtms
description: 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.
user-invocable: false
triggers:
- "real-time media"
- "rtms"
- "live audio stream"
- "live video stream"
- "meeting transcription"
- "raw audio"
- "raw video"
- "websocket media"
- "live transcript"
- "streaming audio"
- "streaming video"
- "meeting bot media"
- "contact center voice media"
- "participant video on"
- "participant video off"
- "single individual video stream"
---
# 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**.
- Your backend receives and processes live media: **audio, video, screen share, chat, transcript**.
- RTMS is not a frontend UI SDK by itself.
- Processing is **event-triggered**: backend waits for RTMS start webhook events before stream handling begins.
Optional architecture (common):
- Add a **Zoom App SDK** frontend for in-client UI/controls.
- Stream backend RTMS outputs to frontend via **WebSocket** (or SSE, gRPC, queue workers, etc.).
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:**
1. **[Connection Architecture](concepts/connection-architecture.md)** - Two-phase WebSocket design
2. **[SDK Quickstart](examples/sdk-quickstart.md)** - Fastest way to receive media (recommended)
3. **[Manual WebSocket](examples/manual-websocket.md)** - Full protocol control without SDK
4. **[Media Types](references/media-types.md)** - Audio, video, transcript, chat, screen share
**Complete Implementation:**
- **[RTMS Bot](examples/rtms-bot.md)** - End-to-end bot implementation guide
**Reference:**
- **[Lifecycle Flow](concepts/lifecycle-flow.md)** - Complete webhook-to-streaming flow
- **[Data Types](references/data-types.md)** - All enums and constants
- **[Webhooks](references/webhooks.md)** - Event subscription details
- **[Environment Variables](references/environment-variables.md)** - credential modes and runtime knobs
- **[Quickstart Notes](references/quickstart.md)** - Secondary quickstart guide
- **Integrated Index** - see the section below in this file
**Having issues?**
- Connection fails -> [Common Issues](troubleshooting/common-issues.md)
- Duplicate connections -> [Webhook Gotchas](troubleshooting/common-issues.md#webhook-response-timing)
- No audio/video -> [Media Configuration](references/media-types.md)
- Start with preflight checks -> [5-Minute Runbook](RUNBOOK.md)
## 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
- **Zoom Contact Center Voice support**: RTMS now covers Contact Center Voice audio and transcript scenarios.
- **Transcript Language Identification control**: transcript media handshakes now support `src_language` and `enable_lid`. Default behavior is LID enabled. Set `enable_lid: false` to force a fixed language.
- **Single individual video stream subscription**: RTMS can now stream one participant's camera feed at a time when `data_opt` is set to `VIDEO_SINGLE_INDIVIDUAL_STREAM`.
- **Graceful client-initiated shutdown**: backends can send `STREAM_CLOSE_REQ` over the signaling socket and wait for `STREAM_CLOSE_RESP`.
- **Media keep-alive tolerance increased**: media socket keep-alive timeout is now **65 seconds**, not 35.
### 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
- **Node.js 20.3.0+** (24 LTS recommended) for JavaScript SDK
- **Python 3.10+** for Python SDK
- Zoom General App (for meetings/webinars) or Video SDK App (for Video SDK) with RTMS feature enabled
- Webhook endpoint for RTMS events
- Server to receive WebSocket streams
> **Need RTMS access?** Post in [Zoom Developer Forum](https://devforum.zoom.us/) requesting RTMS access with your use case.
## Quick Start (SDK - Recommended)
```javascript
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:
```javascript
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
```bash
# 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
```bash
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)
1. Go to [marketplace.zoom.us](https://marketplace.zoom.us) -> Develop -> Build App
2. Choose **General App** -> **User-Managed**
3. Features -> Access -> **Enable Event Subscription**
4. Add Events -> Search "rtms" -> Select:
- `meeting.rtms_started`
- `meeting.rtms_stopped`
- `webinar.rtms_started` (if using webinars)
- `webinar.rtms_stopped` (if using webinars)
5. Scopes -> Add Scopes -> Search "rtms" -> Add:
- `meeting:read:meeting_audio`
- `meeting:read:meeting_video`
- `meeting:read:meeting_transcript`
- `meeting:read:meeting_chat`
- `webinar:read:webinar_audio` (if using webinars)
- `webinar:read:webinar_video` (if using webinars)
- `webinar:read:webinar_transcript` (if using webinars)
- `webinar:read:webinar_chat` (if using webinars)
### For Video SDK (Video SDK App)
1. Go to [marketplace.zoom.us](https://marketplace.zoom.us) -> Develop -> Build App
2. Choose **Video SDK App**
3. Use your SDK Key and SDK Secret (not OAuth Client ID/Secret)
4. Add Events:
- `session.rtms_started`
- `session.rtms_stopped`
## 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
- **[Connection Architecture](concepts/connection-architecture.md)** - Two-phase WebSocket design
- **[Lifecycle Flow](concepts/lifecycle-flow.md)** - Webhook to streaming flow
### Examples
- **[SDK Quickstart](examples/sdk-quickstart.md)** - Using @zoom/rtms SDK
- **[Manual WebSocket](examples/manual-websocket.md)** - Raw protocol implementation
- **[RTMS Bot](examples/rtms-bot.md)** - Complete bot implementation guide
- **[AI Integration](examples/ai-integration.md)** - Transcription and analysis patterns
### References
- **[Media Types](references/media-types.md)** - Audio, video, transcript, chat, screen share
- **[Data Types](references/data-types.md)** - All enums and constants
- **[Connection](references/connection.md)** - WebSocket protocol details
- **[Webhooks](references/webhooks.md)** - Event subscription
### Troubleshooting
- **[Common Issues](troubleshooting/common-issues.md)** - FAQ and solutions
## Resources
- **Official docs**: https://developers.zoom.us/docs/rtms/
- **Data types**: https://developers.zoom.us/docs/rtms/data-types/
- **Media params**: https://developers.zoom.us/docs/rtms/media-parameter-definition/
- **Developer forum**: https://devforum.zoom.us/
---
**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.
- Backend role: ingest audio/video/share/chat/transcript, run AI/analytics, persist/forward data.
- Optional frontend role: Zoom App SDK or web dashboard that consumes processed stream data from backend transport (WebSocket/SSE/other).
- Kickoff model: backend waits for RTMS start webhook events, then starts stream processing.
Do not model RTMS as a frontend-only SDK.
## Quick Start Path
**If you're new to RTMS, follow this order:**
1. **Run preflight checks first** -> [RUNBOOK.md](RUNBOOK.md)
2. **Understand the architecture** -> [concepts/connection-architecture.md](concepts/connection-architecture.md)
- Two-phase WebSocket: Signaling + Media
- Why RTMS doesn't use bots
3. **Choose your approach** -> SDK or Manual
- SDK (recommended): [examples/sdk-quickstart.md](examples/sdk-quickstart.md)
- Manual WebSocket: [examples/manual-websocket.md](examples/manual-websocket.md)
4. **Understand the lifecycle** -> [concepts/lifecycle-flow.md](concepts/lifecycle-flow.md)
- Webhook -> Signaling -> Media -> Streaming
5. **Configure media types** -> [references/media-types.md](references/media-types.md)
- Audio, video, transcript, chat, screen share
6. **Troubleshoot issues** -> [troubleshooting/common-issues.md](troubleshooting/common-issues.md)
- Connection problems, duplicate webhooks, missing data
---
## 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
1. [SDK Quickstart](examples/sdk-quickstart.md) - Fastest approach
2. [Media Types](references/media-types.md#transcript) - Transcript configuration
3. [AI Integration](examples/ai-integration.md) - Whisper, Deepgram, AssemblyAI
### I want to record meetings
1. [Media Types](references/media-types.md) - Audio + Video configuration
2. [SDK Quickstart](examples/sdk-quickstart.md) - Receiving media
3. [AI Integration](examples/ai-integration.md#audio-recording) - Gap-filled recording
### I want to build an AI meeting assistant
1. [AI Integration](examples/ai-integration.md) - Complete patterns
2. [SDK Quickstart](examples/sdk-quickstart.md) - Media ingestion
3. [Lifecycle Flow](concepts/lifecycle-flow.md) - Event handling
### I want to build a complete RTMS bot
1. [RTMS Bot](examples/rtms-bot.md) - **Complete implementation guide**
2. [Lifecycle Flow](concepts/lifecycle-flow.md) - Webhook to streaming flow
3. [Connection Architecture](concepts/connection-architecture.md) - Two-phase design
### I need full protocol control
1. [Manual WebSocket](examples/manual-websocket.md) - **START HERE**
2. [Connection Architecture](concepts/connection-architecture.md) - Two-phase design
3. [Data Types](references/data-types.md) - All message types and enums
4. [Connection](references/connection.md) - Protocol details
### I'm getting connection errors
1. [Common Issues](troubleshooting/common-issues.md) - Diagnostic checklist
2. [Connection Architecture](concepts/connection-architecture.md) - Verify flow
3. [Webhooks](references/webhooks.md) - Validation and timing
### I want to understand the architecture
1. [Connection Architecture](concepts/connection-architecture.md) - Two-phase WebSocket
2. [Lifecycle Flow](concepts/lifecycle-flow.md) - Complete flow diagram
3. [Data Types](references/data-types.md) - Protocol constants
---
## By Product
### I'm building for Zoom Meetings
- Standard RTMS setup. Webhook event: `meeting.rtms_started`. Uses General App with OAuth.
- Start with [SDK Quickstart](examples/sdk-quickstart.md) or [Manual WebSocket](examples/manual-websocket.md).
### I'm building for Zoom Webinars
- Same as meetings, but webhook event is `webinar.rtms_started`. Payload still uses `meeting_uuid` (NOT `webinar_uuid`).
- Add webinar scopes and event subscriptions. See [Webhooks](references/webhooks.md).
- Only **panelist** streams are confirmed available. Attendee streams may not be individual.
### I'm building for Zoom Video SDK
- Webhook event: `session.rtms_started`. Payload uses `session_id` (NOT `meeting_uuid`).
- Requires a **Video SDK App** with SDK Key/Secret (not OAuth Client ID/Secret).
- Once connected, the protocol is **identical** to meetings.
- See [Webhooks](references/webhooks.md) for payload details.
---
## Key Documents
### 1. Connection Architecture (CRITICAL)
**[concepts/connection-architecture.md](concepts/connection-architecture.md)**
RTMS uses **two separate WebSocket connections**:
- **Signaling WebSocket**: Authentication, control, heartbeats
- **Media WebSocket**: Actual audio/video/transcript data
### 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)**
1. **Respond 200 immediately** - Delayed webhook responses cause duplicates
2. **Only 1 connection per stream** - New connections kick out existing
3. **Heartbeat required** - Must respond to keep-alive or connection dies
4. **Track active sessions** - Prevent duplicate join attempts
---
## Key Learnings
### Critical Discoveries:
1. **Two-Phase WebSocket Design**
- Signaling: Control plane (handshake, heartbeat, start/stop)
- Media: Data plane (audio, video, transcript, chat, share)
- See: [Connection Architecture](concepts/connection-architecture.md)
2. **Webhook Response Timing**
- MUST respond 200 BEFORE any processing
- Delayed response -> Zoom retries -> duplicate connections
- See: [Common Issues](troubleshooting/common-issues.md#webhook-response-timing)
3. **Heartbeat is Mandatory**
- Signaling: Receive msg_type 12, respond with msg_type 13
- Media: Same pattern
- Failure to respond = connection closed
- See: [Connection](references/connection.md#heartbeat)
4. **Signature Generation**
- Format: `HMAC-SHA256(clientSecret, "clientId,meetingUuid,streamId")`
- For Video SDK, use `session_id` in place of `meetingUuid`
- Webinars still use `meeting_uuid` (not `webinar_uuid`)
- Required for both signaling and media handshakes
- See: [Manual WebSocket](examples/manual-websocket.md#signature-generation)
5. **Media Types are Bitmasks**
- Audio=1, Video=2, Share=4, Transcript=8, Chat=16, All=32
- Combine with OR: Audio+Transcript = 1|8 = 9
- See: [Media Types](references/media-types.md)
6. **Screen Share is SEPARATE from Video**
- Different msg_type (16 vs 15)
- Different media flag (4 vs 2)
- Must subscribe separately
- See: [Media Types](references/media-types.md#screen-share)
---
## 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.
Источник: anthropics/knowledge-work-plugins / zoom-plugin / zoom-rtms ↗. Ссылка проверена 2026-10-10.