Своё видеоприложение на Zoom Video SDK
Справочник разработчика: как создать приложение с собственной видеосессией на инфраструктуре Zoom, с полностью своим интерфейсом и брендингом.
- Что делает
- Справочник разработчика: как создать приложение с собственной видеосессией на инфраструктуре Zoom, с полностью своим интерфейсом и брендингом.
- Когда брать
- Когда нужен полный контроль над видеоинтерфейсом: свои видеокомнаты, аудиокомнаты, телемедицина, а не обычная встреча Zoom.
- Когда не брать
- Если нужна обычная встреча Zoom с её интерфейсом: для этого есть Meeting SDK.
- Пример запроса
- Сделай веб-приложение с видеозвонком между двумя людьми на Zoom Video SDK с моим дизайном.
- Нужно подключить
- терминал
Входит в плагин zoom-plugin. В Cowork и Claude Code можно поставить плагин целиком.
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
build-zoom-video-sdk-appв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: build-zoom-video-sdk-app
description: Справочный скилл по Zoom Video SDK. Используй после выбора сценария с собственной видеосессией, когда пользователю нужен полный контроль над видеоинтерфейсом, а не обычная встреча Zoom.
triggers:
- "custom video"
- "video sdk"
- "build video app"
- "video session"
- "video chat"
- "video call"
- "video conferencing"
- "custom video ui"
- "twitter spaces"
- "clubhouse alternative"
- "audio-only room"
- "screen sharing"
- "virtual background"
- "native video sdk"
---
/build-zoom-video-sdk-app
Справочный материал для продуктов с полностью собственной видеосессией. Если граница между Meeting SDK и Video SDK ещё неясна, сначала предпочти plan-zoom-product.
Создавай собственные видеорешения на инфраструктуре Zoom.
Жёсткое правило маршрутизации (прочитай сначала)
- Если пользователь просит собственное приложение с видео в реальном времени (вход по теме/сессии, своя отрисовка, подключение и отключение видео), направляй на Video SDK.
- Не переключайся на REST-эндпоинты встреч для сценариев входа через Video SDK.
- Video SDK не использует идентификаторы встреч,
join_urlи поля входа Meeting SDK (meetingNumber,passWord).
Meeting SDK и Video SDK
| Характеристика | Meeting SDK | Video SDK |
|---|---|---|
| Интерфейс | Стандартный интерфейс Zoom или собственный | Полностью собственный интерфейс (создаёшь сам) |
| Формат | Встречи Zoom | Видеосессии |
| Брендинг | Ограниченная настройка | Полный контроль над брендингом |
| Функции | Все функции Zoom | Основные функции видео |
Варианты интерфейса (веб)
Video SDK даёт полный контроль над интерфейсом:
| Вариант | Описание |
|---|---|
| UI Toolkit | Готовые компоненты React (минимум кода) |
| Собственный интерфейс | Создаёшь свой интерфейс через API SDK |
Предварительные требования
- Учётные данные Zoom Video SDK из Marketplace
- Ключ и секрет SDK
- Среда веб-разработки
Нужна помощь с OAuth или подписями? Процессы аутентификации описаны в скилле [zoom-oauth](../oauth/SKILL.md).
Нужна диагностика перед входом в вебе? Используй [probe-sdk](../probe-sdk/SKILL.md) перед вызовом
join()в Video SDK, чтобы снизить число сбоев в первую минуту.
Быстро начать поиск неполадок: воспользуйся [пятиминутной памяткой](RUNBOOK.md) до глубокой отладки.
Быстрый старт (веб)
Использование через NPM (сборщик вроде Vite/Webpack)
import ZoomVideo from '@zoom/videosdk';
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
Использование через CDN (без сборщика)
**ВНИМАНИЕ: блокировщики рекламы блокируют
source.zoom.us**. Размести SDK у себя, чтобы избежать проблем.
# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-1.12.0.min.js" -o js/zoom-video-sdk.min.js
<script src="js/zoom-video-sdk.min.js"></script>
// CDN exports as WebVideoSDK, NOT ZoomVideo
// Must use .default property
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
ES-модуль с CDN (исправление состояния гонки)
При использовании <script type="module"> с CDN SDK может быть ещё не загружен:
// Wait for SDK to load before using
function waitForSDK(timeout = 10000) {
return new Promise((resolve, reject) => {
if (typeof WebVideoSDK !== 'undefined') {
resolve();
return;
}
const start = Date.now();
const check = setInterval(() => {
if (typeof WebVideoSDK !== 'undefined') {
clearInterval(check);
resolve();
} else if (Date.now() - start > timeout) {
clearInterval(check);
reject(new Error('SDK failed to load'));
}
}, 100);
});
}
// Usage
await waitForSDK();
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
Жизненный цикл SDK (ВАЖЕН ПОРЯДОК)
У SDK строгий жизненный цикл. Нарушение порядка приводит к тихим сбоям.
1. Создать клиент: client = ZoomVideo.createClient()
2. Инициализировать: await client.init('en-US', 'Global', options)
3. Войти в сессию: await client.join(topic, signature, userName, password)
4. Получить поток: stream = client.getMediaStream() ← ТОЛЬКО ПОСЛЕ ВХОДА
5. Запустить медиа: await stream.startVideo() / await stream.startAudio()
Типичная ошибка (тихий сбой):
// ❌ WRONG: Getting stream before joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
const stream = client.getMediaStream(); // Returns undefined!
await client.join(...);
// ✅ CORRECT: Get stream after joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
await client.join(...);
const stream = client.getMediaStream(); // Works!
Отрисовка видео (на событиях)
SDK работает на событиях. Нужно слушать события и отрисовывать видео в ответ на них.
Используй attachVideo(), а НЕ renderVideo()
import { VideoQuality } from '@zoom/videosdk';
// Start your camera
await stream.startVideo();
// Attach video - returns element to append to DOM
const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(element);
// Detach when done
await stream.detachVideo(userId);
Обязательные события
// When other participant's video turns on/off
client.on('peer-video-state-change', async (payload) => {
const { action, userId } = payload;
if (action === 'Start') {
const el = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(el);
} else {
await stream.detachVideo(userId);
}
});
// When participants join/leave
client.on('user-added', (payload) => { /* check bVideoOn */ });
client.on('user-removed', (payload) => { stream.detachVideo(payload.userId); });
Полные шаблоны обработки событий смотри в [web/references/web.md](web/references/web.md).
Ключевые понятия
| Понятие | Описание |
|---|---|
| Session (сессия) | Видеосессия (не встреча) |
| Topic (тема) | Идентификатор сессии (любая строка по твоему выбору) |
| Signature (подпись) | JWT для авторизации |
| MediaStream | Управление аудио- и видеопотоком |
Модель создания сессий
Важно: сессии Video SDK создаются в момент входа, а не заранее.
| Аспект | Video SDK | Meeting SDK |
|---|---|---|
| Предварительное создание | НЕ требуется | Сначала создай встречу через API |
| Начало сессии | Первый участник входит по теме | Вход в существующую встречу по её ID |
| Тема | Любая строка (определяешь сам) | ID встречи из API |
| Планирование | Не применяется - сессии создаются «на лету» | Встречи можно планировать |
Как работают сессии
- Предварительное создание не нужно: сессий не существует, пока кто-то в них не войдёт
- Topic = ID сессии: все участники, входящие с одной и той же строкой
topic, попадают в одну сессию - Первый вход создаёт сессию: сессия создаётся, когда входит первый участник
- Нет ID встречи: числового ID встречи, как в Zoom Meetings, не существует
// Session is created on-the-fly when first user joins
// Any string can be the topic - it becomes the session identifier
await client.join('my-custom-session-123', signature, 'User Name');
// Other participants join the SAME session by using the SAME topic
await client.join('my-custom-session-123', signature, 'Another User');
Настройка конечной точки подписи
Конечная точка подписи должна быть доступна из твоего фронтенда без проблем с CORS.
Вариант 1: прокси того же источника (рекомендуется)
# Nginx config
location /api/ {
proxy_pass http://YOUR_BACKEND_HOST:3005/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
// Frontend uses relative URL (same origin)
const response = await fetch('/api/signature', { ... });
Вариант 2: настройка CORS
// Express.js backend
const cors = require('cors');
app.use(cors({
origin: ['https://your-domain.com'],
credentials: true
}));
ВНИМАНИЕ: смешанное содержимое (страница по HTTPS → API по HTTP) браузеры блокируют.
Сценарии использования
| Сценарий | Описание |
|---|---|
| [Video SDK BYOS (Bring Your Own Storage, «своё хранилище»)](../general/use-cases/video-sdk-bring-your-own-storage.md) | Сохранение записей прямо в твой бакет S3 |
BYOS (Bring Your Own Storage, «своё хранилище»)
Функция Video SDK: Zoom сохраняет облачные записи напрямую в твой бакет Amazon S3. Скачивать ничего не нужно.
Официальная документация: https://developers.zoom.us/docs/build/storage/
Предварительные требования:
- Аккаунт Video SDK с дополнением Cloud Recording (входит в Universal Credit)
- Бакет AWS S3
Варианты аутентификации:
- Ключ доступа AWS - проще в настройке
- Доступ между аккаунтами - надёжнее (принятие роли IAM)
Структура пути в S3:
Buckets/{bucketName}/cmr/byos/{YYYY}/{MM}/{DD}/{GUID}/cmr_byos/
Ключевые преимущества:
- Нет затрат на трафик скачивания
- Прямое сохранение во время записи
- Настройка только конфигурацией (код вебхуков и скачивания не нужен)
Где настраивать: Developer Portal → Account Settings → General → Communications Content Storage Location
Полное руководство по настройке: [../general/use-cases/video-sdk-bring-your-own-storage.md](../general/use-cases/video-sdk-bring-your-own-storage.md).
Подробные справочники
Интерфейс и компоненты
- [references/ui-toolkit.md](references/ui-toolkit.md) - Готовые компоненты интерфейса (веб)
- [references/triage-intake.md](references/triage-intake.md) - О чём спросить в первую очередь (как превратить расплывчатые жалобы в конкретные ответы)
- [references/session-lifecycle.md](references/session-lifecycle.md) - Правильный порядок вызовов API и отрисовка на событиях
- [references/licensing-and-entitlements.md](references/licensing-and-entitlements.md) - Предварительные требования по лицензиям и администрированию
- [references/token-contract-test-spec.md](references/token-contract-test-spec.md) - Общий контракт токенов бэкенда и межплатформенный дымовой тест
Руководства по платформам
- [references/authorization.md](references/authorization.md) - Создание JWT для Video SDK
- [web/SKILL.md](web/SKILL.md) - Web Video SDK (JavaScript/TypeScript)
- [web/SKILL.md](web/SKILL.md) - Полная навигация по документации
- [web/examples/react-hooks.md](web/examples/react-hooks.md) - Официальная библиотека хуков React
- [web/examples/framework-integrations.md](web/examples/framework-integrations.md) - Шаблоны для Next.js, Vue/Nuxt
- [react-native/SKILL.md](react-native/SKILL.md) - React Native Video SDK (мобильная обёртка, архитектура помощников и событий)
- [react-native/SKILL.md](react-native/SKILL.md) - Навигация по документации React Native
- [react-native/examples/session-join-pattern.md](react-native/examples/session-join-pattern.md) - Процесс входа в сессию по токену
- [flutter/SKILL.md](flutter/SKILL.md) - Flutter Video SDK (мобильная обёртка, событийная архитектура)
- [flutter/SKILL.md](flutter/SKILL.md) - Навигация по документации Flutter
- [flutter/examples/session-join-pattern.md](flutter/examples/session-join-pattern.md) - Процесс входа в сессию по токену
- [android/SKILL.md](android/SKILL.md) - Android Video SDK (нативный мобильный собственный интерфейс, сессии по токену)
- [ios/SKILL.md](ios/SKILL.md) - iOS Video SDK (нативный мобильный собственный интерфейс, жизненный цикл на делегатах)
- [macos/SKILL.md](macos/SKILL.md) - macOS Video SDK (нативные настольные приложения, собственные окна сессий)
- [unity/SKILL.md](unity/SKILL.md) - Обёртка Unity Video SDK (интеграция с игровым движком, сценарии на сценах)
- [linux/SKILL.md](linux/SKILL.md) - Обзор Linux Video SDK (боты на C++ без интерфейса)
- [linux/linux.md](linux/linux.md) - Linux C++ SDK (боты без интерфейса, захват и подача «сырых» медиаданных)
- [linux/references/linux-reference.md](linux/references/linux-reference.md) - Справочник API для Linux
- [windows/SKILL.md](windows/SKILL.md) - Windows C++ SDK (настольные приложения, захват и подача «сырых» медиаданных)
- [windows/references/windows-reference.md](windows/references/windows-reference.md) - Справочник API для Windows
- [references/troubleshooting.md](references/troubleshooting.md) - Частые проблемы и решения
- [references/forum-top-questions.md](references/forum-top-questions.md) - Типичные вопросы с форума (что стоит охватить)
Репозитории с примерами
Официальные (от Zoom)
| Тип | Репозиторий | Звёзды |
|---|---|---|
| Web | videosdk-web-sample | 137 |
| Web NPM | videosdk-web | 56 |
| Аутентификация | videosdk-auth-endpoint-sample | 23 |
| UI Toolkit Web | videosdk-zoom-ui-toolkit-web | 17 |
| UI Toolkit React | videosdk-zoom-ui-toolkit-react-sample | 17 |
| Next.js | videosdk-nextjs-quickstart | 16 |
| Телемедицина | VideoSDK-Web-Telehealth | 11 |
| Linux | videosdk-linux-raw-recording-sample | - |
Полный список: см. [general/references/community-repos.md](../general/references/community-repos.md)
Ресурсы
- Официальная документация: https://developers.zoom.us/docs/video-sdk/
- Форум разработчиков: https://devforum.zoom.us/
Переменные окружения
- Стандартные ключи
.envи то, где найти каждое значение, смотри в [references/environment-variables.md](references/environment-variables.md).
Операции на Linux
- [linux/RUNBOOK.md](linux/RUNBOOK.md) - Предварительные проверки платформы Linux и контрольный список отладки.
Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/knowledge-work-plugins/tree/main/partner-built/zoom-plugin/skills/video-sdk, лицензия MIT. Изменения: перевод на русский язык.
Оригинал на английском
---
name: build-zoom-video-sdk-app
description: Reference skill for Zoom Video SDK. Use after routing to a custom-session workflow when the user needs full control over the video experience rather than an actual Zoom meeting.
triggers:
- "custom video"
- "video sdk"
- "build video app"
- "video session"
- "video chat"
- "video call"
- "video conferencing"
- "custom video ui"
- "twitter spaces"
- "clubhouse alternative"
- "audio-only room"
- "screen sharing"
- "virtual background"
- "native video sdk"
---
# /build-zoom-video-sdk-app
Background reference for fully custom video-session products. Prefer `plan-zoom-product` first when the boundary between Meeting SDK and Video SDK is still unclear.
Build custom video experiences powered by Zoom's infrastructure.
## Hard Routing Guardrail (Read First)
- If the user asks for custom real-time video app behavior (topic/session join, custom rendering, attach/detach), route to Video SDK.
- Do not switch to REST meeting endpoints for Video SDK join flows.
- Video SDK does not use Meeting IDs, `join_url`, or Meeting SDK join payload fields (`meetingNumber`, `passWord`).
## Meeting SDK vs Video SDK
| Feature | Meeting SDK | Video SDK |
|---------|-------------|-----------|
| UI | Default Zoom UI or Custom UI | **Fully custom UI** (you build it) |
| Experience | Zoom meetings | Video sessions |
| Branding | Limited customization | **Full branding control** |
| Features | Full Zoom features | Core video features |
## UI Options (Web)
Video SDK gives you **full control over the UI**:
| Option | Description |
|--------|-------------|
| **UI Toolkit** | Pre-built React components (low-code) |
| **Custom UI** | Build your own UI using the SDK APIs |
## Prerequisites
- Zoom Video SDK credentials from Marketplace
- SDK Key and Secret
- Web development environment
> **Need help with OAuth or signatures?** See the **[zoom-oauth](../oauth/SKILL.md)** skill for authentication flows.
> **Need pre-join diagnostics on web?** Use **[probe-sdk](../probe-sdk/SKILL.md)** before Video SDK `join()` to reduce first-minute failures.
> **Start troubleshooting fast:** Use the **[5-Minute Runbook](RUNBOOK.md)** before deep debugging.
## Quick Start (Web)
### NPM Usage (Bundler like Vite/Webpack)
```javascript
import ZoomVideo from '@zoom/videosdk';
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
```
### CDN Usage (No Bundler)
> **WARNING: Ad blockers block `source.zoom.us`**. Self-host the SDK to avoid issues.
```bash
# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-1.12.0.min.js" -o js/zoom-video-sdk.min.js
```
```html
<script src="js/zoom-video-sdk.min.js"></script>
```
```javascript
// CDN exports as WebVideoSDK, NOT ZoomVideo
// Must use .default property
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
```
### ES Module with CDN (Race Condition Fix)
When using `<script type="module">` with CDN, SDK may not be loaded yet:
```javascript
// Wait for SDK to load before using
function waitForSDK(timeout = 10000) {
return new Promise((resolve, reject) => {
if (typeof WebVideoSDK !== 'undefined') {
resolve();
return;
}
const start = Date.now();
const check = setInterval(() => {
if (typeof WebVideoSDK !== 'undefined') {
clearInterval(check);
resolve();
} else if (Date.now() - start > timeout) {
clearInterval(check);
reject(new Error('SDK failed to load'));
}
}, 100);
});
}
// Usage
await waitForSDK();
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
```
## SDK Lifecycle (CRITICAL ORDER)
The SDK has a strict lifecycle. Violating it causes silent failures.
```
1. Create client: client = ZoomVideo.createClient()
2. Initialize: await client.init('en-US', 'Global', options)
3. Join session: await client.join(topic, signature, userName, password)
4. Get stream: stream = client.getMediaStream() ← ONLY AFTER JOIN
5. Start media: await stream.startVideo() / await stream.startAudio()
```
**Common Mistake (Silent Failure):**
```javascript
// ❌ WRONG: Getting stream before joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
const stream = client.getMediaStream(); // Returns undefined!
await client.join(...);
// ✅ CORRECT: Get stream after joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
await client.join(...);
const stream = client.getMediaStream(); // Works!
```
## Video Rendering (Event-Driven)
**The SDK is event-driven.** You must listen for events and render videos accordingly.
### Use `attachVideo()` NOT `renderVideo()`
```javascript
import { VideoQuality } from '@zoom/videosdk';
// Start your camera
await stream.startVideo();
// Attach video - returns element to append to DOM
const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(element);
// Detach when done
await stream.detachVideo(userId);
```
### Required Events
```javascript
// When other participant's video turns on/off
client.on('peer-video-state-change', async (payload) => {
const { action, userId } = payload;
if (action === 'Start') {
const el = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(el);
} else {
await stream.detachVideo(userId);
}
});
// When participants join/leave
client.on('user-added', (payload) => { /* check bVideoOn */ });
client.on('user-removed', (payload) => { stream.detachVideo(payload.userId); });
```
See [web/references/web.md](web/references/web.md) for complete event handling patterns.
## Key Concepts
| Concept | Description |
|---------|-------------|
| Session | Video session (not a meeting) |
| Topic | Session identifier (any string you choose) |
| Signature | JWT for authorization |
| MediaStream | Audio/video stream control |
## Session Creation Model
**Important**: Video SDK sessions are created **just-in-time**, not in advance.
| Aspect | Video SDK | Meeting SDK |
|--------|-----------|-------------|
| Pre-creation | NOT required | Create meeting via API first |
| Session start | First participant joins with topic | Join existing meeting ID |
| Topic | Any string (you define it) | Meeting ID from API |
| Scheduling | N/A - sessions are ad-hoc | Meetings can be scheduled |
### How Sessions Work
1. **No pre-creation needed**: Sessions don't exist until someone joins
2. **Topic = Session ID**: Any participants joining with the same `topic` string join the same session
3. **First join creates it**: The session is created when the first participant joins
4. **No meeting ID**: There's no numeric meeting ID like in Zoom Meetings
```javascript
// Session is created on-the-fly when first user joins
// Any string can be the topic - it becomes the session identifier
await client.join('my-custom-session-123', signature, 'User Name');
// Other participants join the SAME session by using the SAME topic
await client.join('my-custom-session-123', signature, 'Another User');
```
### Signature Endpoint Setup
The signature endpoint must be accessible from your frontend without CORS issues.
**Option 1: Same-Origin Proxy (Recommended)**
```nginx
# Nginx config
location /api/ {
proxy_pass http://YOUR_BACKEND_HOST:3005/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
```
```javascript
// Frontend uses relative URL (same origin)
const response = await fetch('/api/signature', { ... });
```
**Option 2: CORS Configuration**
```javascript
// Express.js backend
const cors = require('cors');
app.use(cors({
origin: ['https://your-domain.com'],
credentials: true
}));
```
**WARNING:** Mixed content (HTTPS page → HTTP API) will be blocked by browsers.
## Use Cases
| Use Case | Description |
|----------|-------------|
| [Video SDK BYOS (Bring Your Own Storage)](../general/use-cases/video-sdk-bring-your-own-storage.md) | Save recordings directly to your S3 bucket |
## BYOS (Bring Your Own Storage)
Video SDK feature - Zoom saves cloud recordings **directly** to your Amazon S3 bucket. No downloading required.
> **Official docs:** https://developers.zoom.us/docs/build/storage/
**Prerequisites:**
- Video SDK account with Cloud Recording add-on (Universal Credit includes this)
- AWS S3 bucket
**Authentication options:**
1. **AWS Access Key** - simpler setup
2. **Cross Account Access** - more secure (IAM role assumption)
**S3 path structure:**
```
Buckets/{bucketName}/cmr/byos/{YYYY}/{MM}/{DD}/{GUID}/cmr_byos/
```
**Key benefits:**
- Zero download bandwidth costs
- Direct storage during recording
- Config-only setup (no webhook/download code needed)
**Setup location:** Developer Portal → Account Settings → General → Communications Content Storage Location
See **[../general/use-cases/video-sdk-bring-your-own-storage.md](../general/use-cases/video-sdk-bring-your-own-storage.md)** for complete setup guide.
## Detailed References
### UI & Components
- **[references/ui-toolkit.md](references/ui-toolkit.md)** - Pre-built UI components (Web)
- **[references/triage-intake.md](references/triage-intake.md)** - What to ask first (turn vague reports into answers)
- **[references/session-lifecycle.md](references/session-lifecycle.md)** - Correct API ordering + event-driven rendering
- **[references/licensing-and-entitlements.md](references/licensing-and-entitlements.md)** - License/admin prerequisites
- **[references/token-contract-test-spec.md](references/token-contract-test-spec.md)** - Shared backend token contract and cross-platform smoke test
### Platform Guides
- **[references/authorization.md](references/authorization.md)** - Video SDK JWT generation
- **[web/SKILL.md](web/SKILL.md)** - Web Video SDK (JavaScript/TypeScript)
- **[web/SKILL.md](web/SKILL.md)** - Complete documentation navigation
- **[web/examples/react-hooks.md](web/examples/react-hooks.md)** - Official React hooks library
- **[web/examples/framework-integrations.md](web/examples/framework-integrations.md)** - Next.js, Vue/Nuxt patterns
- **[react-native/SKILL.md](react-native/SKILL.md)** - React Native Video SDK (mobile wrapper, helper/event architecture)
- **[react-native/SKILL.md](react-native/SKILL.md)** - React Native documentation navigation
- **[react-native/examples/session-join-pattern.md](react-native/examples/session-join-pattern.md)** - Tokenized session join flow
- **[flutter/SKILL.md](flutter/SKILL.md)** - Flutter Video SDK (mobile wrapper, event-driven architecture)
- **[flutter/SKILL.md](flutter/SKILL.md)** - Flutter documentation navigation
- **[flutter/examples/session-join-pattern.md](flutter/examples/session-join-pattern.md)** - Tokenized session join flow
- **[android/SKILL.md](android/SKILL.md)** - Android Video SDK (native mobile custom UI, tokenized sessions)
- **[ios/SKILL.md](ios/SKILL.md)** - iOS Video SDK (native mobile custom UI, delegate-driven lifecycle)
- **[macos/SKILL.md](macos/SKILL.md)** - macOS Video SDK (desktop native apps, custom session windows)
- **[unity/SKILL.md](unity/SKILL.md)** - Unity Video SDK wrapper (game-engine integration, scene-driven UX)
- **[linux/SKILL.md](linux/SKILL.md)** - Linux Video SDK overview (C++ headless bots)
- **[linux/linux.md](linux/linux.md)** - Linux C++ SDK (headless bots, raw media capture/injection)
- **[linux/references/linux-reference.md](linux/references/linux-reference.md)** - Linux API Reference
- **[windows/SKILL.md](windows/SKILL.md)** - Windows C++ SDK (desktop applications, raw media capture/injection)
- **[windows/references/windows-reference.md](windows/references/windows-reference.md)** - Windows API Reference
- **[references/troubleshooting.md](references/troubleshooting.md)** - Common issues and solutions
- **[references/forum-top-questions.md](references/forum-top-questions.md)** - Common forum question patterns (what to cover)
## Sample Repositories
### Official (by Zoom)
| Type | Repository | Stars |
|------|------------|-------|
| Web | [videosdk-web-sample](https://github.com/zoom/videosdk-web-sample) | 137 |
| Web NPM | [videosdk-web](https://github.com/zoom/videosdk-web) | 56 |
| Auth | [videosdk-auth-endpoint-sample](https://github.com/zoom/videosdk-auth-endpoint-sample) | 23 |
| UI Toolkit Web | [videosdk-zoom-ui-toolkit-web](https://github.com/zoom/videosdk-zoom-ui-toolkit-web) | 17 |
| UI Toolkit React | [videosdk-zoom-ui-toolkit-react-sample](https://github.com/zoom/videosdk-zoom-ui-toolkit-react-sample) | 17 |
| Next.js | [videosdk-nextjs-quickstart](https://github.com/zoom/videosdk-nextjs-quickstart) | 16 |
| Telehealth | [VideoSDK-Web-Telehealth](https://github.com/zoom/VideoSDK-Web-Telehealth) | 11 |
| Linux | [videosdk-linux-raw-recording-sample](https://github.com/zoom/videosdk-linux-raw-recording-sample) | - |
**Full list**: See [general/references/community-repos.md](../general/references/community-repos.md)
## Resources
- **Official docs**: https://developers.zoom.us/docs/video-sdk/
- **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.
## Linux Operations
- [linux/RUNBOOK.md](linux/RUNBOOK.md) - Linux platform preflight and debugging checklist.
Источник: anthropics/knowledge-work-plugins / zoom-plugin / build-zoom-video-sdk-app ↗. Ссылка проверена 2026-10-10.