Generated banner for Video SDK Web
Generated logo for Video SDK Web

Video SDK Web

AnthropicOfficialCreated by ZoomDistributed by Anthropic

  • Skill
  • Tool integration
  • Software development
  • MIT
  • No issues found

From the author

Zoom Video SDK for Web - JavaScript/TypeScript integration for browser-based video sessions, real-time communication, screen sharing, recording, and live transcription
— the description by Zoom

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The Zoom Video SDK for Web provides a library for developers to build custom video-based experiences directly within browser environments. It supports real-time communication, screen sharing, cloud recording, live streaming, chat, and live transcription. The SDK requires a specific lifecycle, including client initialization and session joining, and provides specialized clients for managing media streams, chat, and other collaborative features.

What it does

  • Enables custom video and audio sessions in modern web browsers.
  • Supports screen sharing and collaborative whiteboard features.
  • Provides tools for cloud recording and live streaming to RTMP endpoints.
  • Includes messaging capabilities via chat and command channels.
  • Facilitates live transcription for real-time speech-to-text.
  • Allows for virtual backgrounds and custom video frame processing.

When to use it

  • When building a custom video application that requires a unique UI.
  • When integrating real-time video communication into an existing web platform.
  • When implementing features like breakout rooms or live transcription in a web-based session.
  • When you need to control media stream rendering and participant interaction programmatically.

Advantages

  • Provides a modular API for granular control over media and session features.
  • Supports standard web technologies like JavaScript and TypeScript.
  • Offers specialized clients for distinct features like recording and chat.
  • Includes event-driven architecture for handling participant and media state changes.

Usage examples

“How do I join a video session using the Zoom Video SDK for Web?”
Initialize the client with your credentials, call the join method with the session topic and signature, then retrieve the media stream object to start video and audio.
“How can I display a remote participant's video?”
Listen for the peer-video-state-change event, and when a participant starts their video, use the attachVideo method to append their video element to your DOM.
“What is the correct way to handle media streams?”
Always call getMediaStream after the join method has successfully completed to ensure the stream object is available.
“How do I implement screen sharing?”
Use the startShareScreen method on the media stream object, passing in a canvas or video element to render the shared content.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/anthropics/video-sdk-web/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip video-sdk-web.zip -d .agents/skills

Documentation by Zoom

Zoom Video SDK - Web Development

Expert guidance for developing with the Zoom Video SDK on Web. This SDK enables custom video applications in the browser with real-time video/audio, screen sharing, cloud recording, live streaming, chat, and live transcription.

This skill is for custom video sessions, not embedded Zoom meetings. If the user wants a custom UI for a real Zoom meeting, route to ../../meeting-sdk/web/component-view/SKILL.md.

Official Documentation: https://developers.zoom.us/docs/video-sdk/web/ API Reference: https://marketplacefront.zoom.us/sdk/custom/web/modules.html Sample Repository: https://github.com/zoom/videosdk-web-sample

New to Video SDK? Follow this path:

  1. SDK Architecture Pattern - Universal 3-step pattern for ANY feature

  2. Session Join Pattern - Complete working code to join a session

  3. Video Rendering - Display video with attachVideo()

  4. Event Handling - Required events for video/audio

Reference:

  • Singleton Hierarchy - 4-level SDK navigation map

  • API Reference - Methods, events, error codes

  • SKILL.md - Complete documentation navigation

  • ../../probe-sdk/SKILL.md - Optional browser/device/network readiness diagnostics before join

Having issues?

  • Video not showing → Video Rendering (use attachVideo, not renderVideo)

  • getMediaStream() returns undefined → Call AFTER join() completes

  • Quick diagnostics → Common Issues

SDK Overview

The Zoom Video SDK for Web is a JavaScript library that provides:

  • Session Management: Join/leave video SDK sessions

  • Video/Audio: Start/stop camera and microphone

  • Screen Sharing: Share screens or browser tabs

  • Cloud Recording: Record sessions to Zoom cloud

  • Live Streaming: Stream to RTMP endpoints

  • Chat: In-session messaging

  • Command Channel: Custom command messaging

  • Live Transcription: Real-time speech-to-text

  • Subsessions: Breakout room support

  • Whiteboard: Collaborative whiteboard features

  • Virtual Background: Blur or custom image backgrounds

Prerequisites

System Requirements
  • Modern Browser: Chrome 80+, Firefox 75+, Safari 14+, Edge 80+

  • Video SDK Credentials: SDK Key and Secret from Marketplace

  • JWT Token: Server-side generated signature

Browser Feature Requirements
// Check browser compatibility before init
const compatibility = ZoomVideo.checkSystemRequirements();
console.log('Audio:', compatibility.audio);
console.log('Video:', compatibility.video);
console.log('Screen:', compatibility.screen);

// Check feature support
const features = ZoomVideo.checkFeatureRequirements();
console.log('Supported:', features.supportFeatures);
console.log('Unsupported:', features.unSupportFeatures);

Use Probe SDK as a readiness gate before client.join(...) when you need to reduce failed starts:

  1. Run diagnostics with ../../probe-sdk/SKILL.md.

  2. Evaluate policy (allow, warn, block).

  3. Start Video SDK join only when policy allows.

Cross-skill flow: ../../general/use-cases/probe-sdk-preflight-readiness-gate.md

Installation

npm install @zoom/videosdk
import ZoomVideo from '@zoom/videosdk';

Note: Some networks/ad blockers can block source.zoom.us. If you see flaky loads, first try allowlisting the domain in your environment. If needed, consider a fallback (mirror/self-host) only if it's permitted for your use case and you can keep versions in sync.

# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-2.3.12.min.js" -o public/js/zoom-video-sdk.min.js
<!-- Use local copy instead of CDN -->
<script src="js/zoom-video-sdk.min.js"></script>
// CDN exports as WebVideoSDK, NOT ZoomVideo
const ZoomVideo = WebVideoSDK.default;

Quick Start

import ZoomVideo from '@zoom/videosdk';

// 1. Create client (singleton - returns same instance)
const client = ZoomVideo.createClient();

// 2. Initialize SDK
await client.init('en-US', 'Global', { patchJsMedia: true });

// 3. Join session
await client.join(topic, signature, userName, password);

// 4. CRITICAL: Get stream AFTER join
const stream = client.getMediaStream();

// 5. Start media
await stream.startVideo();
await stream.startAudio();

// 6. Attach video to DOM
const videoElement = await stream.attachVideo(userId, VideoQuality.Video_360P);
document.getElementById('video-container').appendChild(videoElement);

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:

// WRONG: Getting stream before joining
const stream = client.getMediaStream();  // Returns undefined!
await client.join(...);

// CORRECT: Get stream after joining
await client.join(...);
const stream = client.getMediaStream();  // Works!

Critical Gotchas and Best Practices

getMediaStream() ONLY Works After join()

The #1 issue that causes video/audio to fail:

// WRONG
const stream = client.getMediaStream();  // undefined!
await client.join(...);

// CORRECT
await client.join(...);
const stream = client.getMediaStream();  // Works
Use attachVideo() NOT renderVideo()

renderVideo() is deprecated. Use attachVideo() which returns a VideoPlayer element:

import { VideoQuality } from '@zoom/videosdk';

// CORRECT: attachVideo returns element to append
const videoElement = await stream.attachVideo(userId, VideoQuality.Video_360P);
document.getElementById('video-container').appendChild(videoElement);

// WRONG: renderVideo is deprecated
await stream.renderVideo(canvas, userId, ...);  // Don't use!
Video Rendering is Event-Driven (CRITICAL)

You MUST listen for events to properly render participant videos:

// When another participant's video state changes
client.on('peer-video-state-change', async (payload) => {
  const { action, userId } = payload;
  
  if (action === 'Start') {
    // Participant turned on video - attach it
    const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
    container.appendChild(element);
  } else if (action === 'Stop') {
    // Participant turned off video - detach it
    await stream.detachVideo(userId);
  }
});

// When participants join/leave
client.on('user-added', (payload) => {
  // New participant joined - check if their video is on
  const users = client.getAllUser();
  // Render videos for users with bVideoOn === true
});

client.on('user-removed', (payload) => {
  // Participant left - clean up their video element
  stream.detachVideo(payload[0].userId);
});
Peer Video on Mid-Session Join

Existing participants' videos won't auto-render when you join mid-session.

// After joining, render existing participants' videos
const renderExistingVideos = async () => {
  await new Promise(resolve => setTimeout(resolve, 500));
  
  const users = client.getAllUser();
  const currentUserId = client.getCurrentUserInfo().userId;
  
  for (const user of users) {
    if (user.bVideoOn && user.userId !== currentUserId) {
      const element = await stream.attachVideo(user.userId, VideoQuality.Video_360P);
      document.getElementById(`video-${user.userId}`).appendChild(element);
    }
  }
};
CDN Race Condition with ES Modules

When using <script type="module"> with CDN, the SDK may not be loaded yet:

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);
  });
}

await waitForSDK();
const ZoomVideo = WebVideoSDK.default;
SharedArrayBuffer for HD Video

For optimal performance and HD video, configure these headers on your server:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Note: As of v1.11.2, SharedArrayBuffer is elective (not strictly required).

Check HD Capability Before Enabling
const stream = client.getMediaStream();

// Check if 720p is supported
const hdSupported = stream.isSupportHDVideo();

// Get maximum video quality
const maxQuality = stream.getVideoMaxQuality();
// 0=90P, 1=180P, 2=360P, 3=720P, 4=1080P

// Start video with HD
if (hdSupported) {
  await stream.startVideo({ hd: true });
}
Screen Share Rendering Mode Check
const stream = client.getMediaStream();

// Check which element type to use
if (stream.isStartShareScreenWithVideoElement()) {
  // Use video element
  const video = document.getElementById('share-video');
  await stream.startShareScreen(video as unknown as HTMLCanvasElement);
} else {
  // Use canvas element
  const canvas = document.getElementById('share-canvas');
  await stream.startShareScreen(canvas);
}

Key Features

Video Quality Enum
import { VideoQuality } from '@zoom/videosdk';

VideoQuality.Video_90P   // 0
VideoQuality.Video_180P  // 1
VideoQuality.Video_360P  // 2 (recommended for most cases)
VideoQuality.Video_720P  // 3
VideoQuality.Video_1080P // 4
Virtual Backgrounds
const stream = client.getMediaStream();

// Always check support first
if (stream.isSupportVirtualBackground()) {
  // Blur background
  await stream.updateVirtualBackgroundImage('blur');
  
  // Custom image background
  await stream.updateVirtualBackgroundImage('https://example.com/bg.jpg');
  
  // Remove virtual background
  await stream.updateVirtualBackgroundImage(undefined);
}
Video Processor (Custom Effects)

The VideoProcessor class allows you to intercept and modify video frames:

// video-processor-worker.js
class MyVideoProcessor extends VideoProcessor {
  processFrame(input, output) {
    const ctx = output.getContext('2d');
    ctx.drawImage(input, 0, 0);
    
    // Add overlay
    ctx.fillStyle = 'white';
    ctx.font = '24px Arial';
    ctx.fillText('Live', 20, 40);
    
    return true;
  }
}
WebRTC Mode

Enable WebRTC mode for direct peer-to-peer streaming with HD video support:

await client.init('en-US', 'Global', {
  patchJsMedia: true,
  webrtc: true  // Enable WebRTC mode
});

Feature Clients

Access specialized clients from the VideoClient:

ClientAccess MethodPurpose
Streamclient.getMediaStream()Video, audio, screen share, devices
Chatclient.getChatClient()Send/receive messages
Commandclient.getCommandClient()Custom commands (reactions, etc.)
Recordingclient.getRecordingClient()Cloud recording control
Transcriptionclient.getLiveTranscriptionClient()Live captions
LiveStreamclient.getLiveStreamClient()RTMP streaming
Subsessionclient.getSubsessionClient()Breakout rooms
Whiteboardclient.getWhiteboardClient()Collaborative whiteboard

Common Tasks

Start/Stop Video
await stream.startVideo();
await stream.stopVideo();
Start/Stop Audio
await stream.startAudio();
await stream.muteAudio();
await stream.unmuteAudio();
await stream.stopAudio();
Switch Devices
// Get available devices
const cameras = stream.getCameraList();
const mics = stream.getMicList();
const speakers = stream.getSpeakerList();

// Switch devices
await stream.switchCamera(cameraId);
await stream.switchMicrophone(micId);
await stream.switchSpeaker(speakerId);
Screen Sharing
// Start sharing
await stream.startShareScreen(canvas);

// Stop sharing
await stream.stopShareScreen();

// Receive share
client.on('active-share-change', async (payload) => {
  if (payload.state === 'Active') {
    await stream.startShareView(canvas, payload.userId);
  } else {
    await stream.stopShareView();
  }
});
Chat
const chatClient = client.getChatClient();

// Send to everyone
await chatClient.send('Hello, everyone!');

// Send to specific user
await chatClient.sendToUser(userId, 'Private message');

// Receive messages
client.on('chat-on-message', (payload) => {
  console.log(`${payload.sender.name}: ${payload.message}`);
});
Recording (Host Only)
const recordingClient = client.getRecordingClient();

await recordingClient.startCloudRecording();
await recordingClient.stopCloudRecording();

client.on('recording-change', (payload) => {
  console.log('Recording status:', payload.state);
});
Leave/End Session
// Leave session (others stay)
await client.leave();

// End session for ALL participants (host only)
await client.leave(true);

Error Handling

Common Join Errors
ErrorCauseSolution
Invalid signatureJWT expired or malformedGenerate new signature
Session does not existHost hasn't started yetShow "waiting" message, retry
Permission deniedUser denied camera/micRequest permission again
Example Error Handler
try {
  await client.join(topic, signature, userName, password);
} catch (error) {
  if (error.reason?.includes('signature')) {
    // Regenerate signature and retry
  } else if (error.reason?.includes('Session')) {
    // Show "Waiting for host..." and poll
  } else if (error.reason?.includes('Permission')) {
    // Guide user to enable permissions
  }
  console.error('Join failed:', error);
}

Browser Compatibility

FeatureChromeFirefoxSafariEdge
Video80+75+14+80+
Audio80+75+14+80+
Screen Share80+75+15+80+
Virtual BG80+90+-80+

Safari Notes:

  • Virtual background not supported

  • Screen sharing requires macOS 15+

CORS Errors (Telemetry)

CORS errors to log-external-gateway.zoom.us are harmless.

These are caused by COOP/COEP headers blocking telemetry requests. They don't affect SDK functionality.

Complete Documentation Library

Core Concepts
Complete Examples
Framework Integrations
Troubleshooting
References

Official Sample Repositories

Resources


Need help? Start with SKILL.md for complete navigation.

Merged from video-sdk/web/SKILL.md

Zoom Video SDK Web - Complete Documentation Index

Quick Start Path

If you're new to the SDK, follow this order:

  1. Read the architecture pattern → concepts/sdk-architecture-pattern.md

    • Universal formula: Create Client → Init → Join → Get Stream → Use

    • Once you understand this, you can implement any feature

  2. Implement session join → examples/session-join-pattern.md

    • Complete working JWT + session join code

  3. Listen to events → examples/event-handling.md

    • CRITICAL: The SDK is event-driven, you must listen for events

  4. Implement video → examples/video-rendering.md

    • Use attachVideo(), NOT renderVideo()

  5. Troubleshoot any issues → troubleshooting/common-issues.md

    • Quick diagnostic checklist

    • Error code tables


Documentation Structure

video-sdk/web/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # Universal formula for ANY feature
│   └── singleton-hierarchy.md        # 4-level navigation guide
│
├── examples/                          # Complete working code
│   ├── session-join-pattern.md       # JWT auth + session join
│   ├── video-rendering.md            # attachVideo() patterns
│   ├── screen-share.md               # Send and receive screen shares
│   ├── event-handling.md             # Required events
│   ├── chat.md                       # Chat implementation
│   ├── command-channel.md            # Command channel messaging
│   ├── recording.md                  # Cloud recording control
│   ├── transcription.md              # Live transcription/captions
│   ├── react-hooks.md                # Official @zoom/videosdk-react library
│   └── framework-integrations.md     # Next.js, Vue/Nuxt, ZFG patterns
│
├── troubleshooting/                   # Problem solving guides
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── web-reference.md              # API hierarchy, methods, error codes
    └── events-reference.md           # All event types

By Use Case

I want to build a video app
  1. SDK Architecture Pattern - Understand the pattern

  2. Session Join Pattern - Join sessions

  3. Video Rendering - Display video

  4. Event Handling - Listen for video events

I'm getting runtime errors
  1. Common Issues - Error code tables

  2. "getMediaStream() is undefined" → Call AFTER join() completes

I want to receive screen shares
  1. Screen Share - startShareView() patterns

  2. Event Handling - active-share-change event

I want to send screen shares
  1. Screen Share - startShareScreen() patterns

  2. Check isStartShareScreenWithVideoElement() for element type

I want to use chat
  1. Chat - Send/receive messages

  2. getChatClient() for ChatClient access

I want to record sessions
  1. Recording - Cloud recording (host only)

  2. getRecordingClient() for RecordingClient access

I want to use live transcription
  1. Transcription - Enable live captions

  2. getLiveTranscriptionClient() for LiveTranscriptionClient access

I want to use command channel
  1. Command Channel - Custom signaling between participants

  2. Must call getCommandClient() AFTER join()

I want to implement a specific feature
  1. SDK Architecture Pattern - START HERE!

  2. Singleton Hierarchy - Navigate to the feature

  3. API Reference - Method signatures

I'm using React
  1. React Hooks - Official @zoom/videosdk-react library

  2. Provides hooks: useSession, useSessionUsers, useVideoState, useAudioState

  3. Pre-built components: VideoPlayerComponent, ScreenSharePlayerComponent

I'm using Next.js or Vue/Nuxt
  1. Framework Integrations - SSR considerations

  2. Server-side JWT generation patterns

  3. Client-side only SDK usage


Most Critical Documents

1. SDK Architecture Pattern (MASTER DOCUMENT)

concepts/sdk-architecture-pattern.md

The universal 5-step pattern:

  1. Create client

  2. Initialize SDK

  3. Join session

  4. Get stream

  5. Use features + listen to events

2. Common Issues (MOST COMMON PROBLEMS)

troubleshooting/common-issues.md

Common issues:

  • getMediaStream() returns undefined

  • Video not displaying

  • renderVideo() deprecated

3. Singleton Hierarchy (NAVIGATION MAP)

concepts/singleton-hierarchy.md

4-level deep navigation showing how to reach every feature.


Key Learnings

Critical Discoveries:
  1. getMediaStream() ONLY works after join()

  2. Use attachVideo() NOT renderVideo()

    • renderVideo() is deprecated

    • attachVideo() returns a VideoPlayer element to append to DOM

    • See: Video Rendering

  3. The SDK is Event-Driven

    • You MUST listen for events to render participant videos

    • key events: peer-video-state-change, user-added, user-removed

    • See: Event Handling

  4. Peer Videos on Mid-Session Join

    • Existing participants' videos won't auto-render

    • Must manually iterate getAllUser() and attachVideo()

    • See: Video Rendering

  5. CDN vs NPM

    • CDN exports as WebVideoSDK.default, not ZoomVideo

    • Some networks/ad blockers may block source.zoom.us - allowlist or use a permitted fallback strategy

    • See: Session Join Pattern

  6. SharedArrayBuffer for HD

    • Required for 720p/1080p video

    • Need COOP/COEP headers on server

    • Check with stream.isSupportHDVideo()

  7. Screen Share Element Type

    • Check isStartShareScreenWithVideoElement() for correct element type

    • See: Screen Share

  8. Command Channel Setup Order

    • Must call getCommandClient() AFTER client.join()

    • Register listeners AFTER join, not before

    • Web uses getCommandClient() not getCmdChannel()

    • See: Command Channel

  9. Command Channel is Session-Scoped

    • Does NOT span across different sessions

    • Both sender and receiver must be in the same session


Quick Reference

"getMediaStream() returns undefined"

→ Call AFTER join() completes

"Video not showing"

→ Video Rendering - Use attachVideo(), check events

"renderVideo() doesn't work"

→ Video Rendering - Use attachVideo() instead

"How do I implement [feature]?"

→ SDK Architecture Pattern

"How do I navigate to [client]?"

→ Singleton Hierarchy

"What error code means what?"

→ Common Issues


Document Version

Based on Zoom Video SDK for Web v2.3.x


Happy coding!

Remember: The SDK Architecture Pattern is your key to unlocking the entire SDK. Read it first!

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.

Files

references/web-reference.md

Zoom Video SDK Web - API Reference

Overview

This reference provides the complete API for the Zoom Video SDK for Web. The SDK follows a hierarchical pattern:

ZoomVideo (module)
  └── VideoClient (singleton)
      ├── Stream (media operations)
      └── Feature Clients (chat, recording, etc.)

Official API Reference: https://marketplacefront.zoom.us/sdk/custom/web/modules.html


Level 0: ZoomVideo Module

Static Methods
MethodReturnsDescription
createClient()VideoClientCreates/returns the singleton client
destroyClient()Promise<void>Destroys the client instance
checkSystemRequirements()MediaCompatibilityCheck browser compatibility
checkFeatureRequirements()SupportFeaturesCheck feature support
getDevices(skip?)Promise<MediaDeviceInfo[]>Enumerate media devices
preloadDependentAssets(path?)voidPreload SDK assets
createLocalVideoTrack(id?)LocalVideoTrackCreate local video track for preview
createLocalAudioTrack(id?)LocalAudioTrackCreate local audio track for preview
VERSIONstringSDK version
MediaCompatibility Interface
interface MediaCompatibility {
  audio: boolean;   // Audio support
  video: boolean;   // Video support
  screen: boolean;  // Screen share support
}
SupportFeatures Interface
interface SupportFeatures {
  platform: string;           // Browser/platform info
  supportFeatures: string[];  // Supported features
  unSupportFeatures: string[]; // Unsupported features
}

Level 1: VideoClient

Session Lifecycle
MethodParametersReturnsDescription
init(language, dependentAssets, options?)ExecutedResultInitialize SDK
join(topic, token, userName, password?, timeout?)ExecutedResultJoin session
leave(end?)ExecutedResultLeave/end session
on(event, callback)voidSubscribe to events
off(event, callback)voidUnsubscribe from events
InitOptions Interface
interface InitOptions {
  patchJsMedia?: boolean;      // Patch JS media (recommended: true)
  webrtc?: boolean;            // Enable WebRTC mode for HD
  enforceMultipleVideos?: boolean; // Force multi-video mode
  stayAwake?: boolean;         // Prevent screen sleep
}
Participant Methods
MethodReturnsDescription
getAllUser()Participant[]Get all participants
getCurrentUserInfo()ParticipantGet current user
getUser(userId)Participant | undefinedGet user by ID
getSessionHost()Participant | undefinedGet session host
getSessionInfo()SessionInfoGet session info
isHost()booleanIs current user host
isManager()booleanIs current user manager
isOriginalHost()booleanIs current user original host
Host Controls
MethodParametersReturnsDescription
makeHost(userId)ExecutedResultMake user host
makeManager(userId)ExecutedResultMake user manager
revokeManager(userId)ExecutedResultRemove manager
removeUser(userId)ExecutedResultRemove user from session
changeName(name, userId?)ExecutedResultChange display name
reclaimHost()ExecutedResultReclaim host (original host only)
Feature Client Getters
MethodReturnsDescription
getMediaStream()StreamGet media stream (AFTER join!)
getChatClient()ChatClientGet chat client
getCommandClient()CommandChannelGet command channel
getRecordingClient()RecordingClientGet recording client
getLiveTranscriptionClient()LiveTranscriptionClientGet transcription client
getLiveStreamClient()LiveStreamClientGet live stream client
getSubsessionClient()SubsessionClientGet subsession client
getWhiteboardClient()WhiteboardClientGet whiteboard client
getBroadcastStreamingClient()BroadcastStreamingClientGet broadcast client
getRealTimeMediaStreamsClient()RealTimeMediaStreamsClientGet RTMS client
getLoggerClient(options?)LoggerClientGet logger client
Participant Interface
interface Participant {
  userId: number;           // Unique user ID
  displayName: string;      // Display name
  bVideoOn: boolean;        // Is video on
  muted: boolean;           // Is audio muted
  audio: '' | 'computer' | 'phone';  // Audio type
  sharerOn: boolean;        // Is sharing screen
  bShareAudioOn: boolean;   // Is sharing audio
  isHost: boolean;          // Is host
}

Level 2: Stream (Media Operations)

Video Methods
MethodParametersReturnsDescription
startVideo(options?)ExecutedResultStart camera
stopVideo()ExecutedResultStop camera
attachVideo(userId, quality, element?)Promise<VideoPlayer>Attach video to DOM
detachVideo(userId, element?)Promise<VideoPlayer | VideoPlayer[]>Detach video
switchCamera(cameraId)ExecutedResultSwitch camera
getCameraList()MediaDevice[]Get cameras
getActiveCamera()stringGet active camera ID
mirrorVideo(enable)ExecutedResultMirror video
spotlightVideo(userId)ExecutedResultSpotlight user
screenshotVideo(userId?)Promise<Blob>Screenshot video
Video Capability Methods
MethodReturnsDescription
isSupportHDVideo()booleanIs HD video supported
getVideoMaxQuality()VideoQualityGet max video quality
getMaxRenderableVideos()numberMax renderable videos
isSupportMultipleVideos()booleanMultiple videos support
isSupportVirtualBackground()booleanVirtual BG support
isCapturingVideo()booleanIs capturing video
VideoQuality Enum
enum VideoQuality {
  Video_90P = 0,
  Video_180P = 1,
  Video_360P = 2,
  Video_720P = 3,
  Video_1080P = 4
}
Virtual Background Methods
MethodParametersReturnsDescription
updateVirtualBackgroundImage(image)ExecutedResultSet virtual background
previewVirtualBackground(canvas, image)ExecutedResultPreview virtual BG
stopPreviewVirtualBackground()ExecutedResultStop preview
getVirtualbackgroundStatus()VirtualBackgroundStatusGet VB status

Virtual Background Options:

  • 'blur': Blur background

  • 'https://example.com/image.jpg': Custom image URL

  • undefined: Remove virtual background

Audio Methods
MethodParametersReturnsDescription
startAudio(options?)ExecutedResultStart audio
stopAudio()ExecutedResultStop audio
muteAudio(userId?)ExecutedResultMute audio
unmuteAudio(userId?)ExecutedResultUnmute audio
muteAllAudio()ExecutedResultMute all (host)
unmuteAllAudio()ExecutedResultUnmute all (host)
switchMicrophone(micId)ExecutedResultSwitch microphone
switchSpeaker(speakerId)ExecutedResultSwitch speaker
getMicList()MediaDevice[]Get microphones
getSpeakerList()MediaDevice[]Get speakers
getActiveMicrophone()stringGet active mic ID
getActiveSpeaker()stringGet active speaker ID
isAudioMuted(userId?)booleanIs audio muted
Screen Share Methods
MethodParametersReturnsDescription
startShareScreen(canvas, options?)ExecutedResultStart sharing
stopShareScreen()ExecutedResultStop sharing
startShareView(canvas, userId)ExecutedResultView share
stopShareView()ExecutedResultStop viewing
attachShareView(userId, element?)Promise<VideoPlayer>Attach share view
detachShareView(userId, element?)Promise<VideoPlayer>Detach share view
pauseShareScreen()ExecutedResultPause share
resumeShareScreen()ExecutedResultResume share
getActiveShareUserId()numberGet sharer user ID
getShareStatus()ShareStatusGet share status
getShareUserList()Participant[]Get sharers
lockShare(isLocked)ExecutedResultLock share (host)
setSharePrivilege(privilege)ExecutedResultSet share privilege
isStartShareScreenWithVideoElement()booleanUse video or canvas
ScreenShareOption Interface
interface ScreenShareOption {
  requestReadReceipt?: boolean;  // Request read receipt
  secondaryAudio?: boolean;      // Share with audio
  optimizedForVideo?: boolean;   // Optimize for video
}
ShareStatus Enum
enum ShareStatus {
  Sharing = 'Sharing',
  Paused = 'Paused',
  End = 'End'
}
Processor Methods
MethodParametersReturnsDescription
createProcessor(params)Promise<Processor>Create processor
addProcessor(processor)Promise<"">Add processor
removeProcessor(processor)Promise<"">Remove processor
isSupportVideoProcessor()booleanVideo processor support
isSupportAudioProcessor()booleanAudio processor support
isSupportShareProcessor()booleanShare processor support

Level 2: Feature Clients

ChatClient
MethodParametersReturnsDescription
send(message)ExecutedResultSend to all
sendToUser(userId, message)ExecutedResultSend to user
sendFile(file, receiverId)ExecutedResultSend file
downloadFile(fileUrl, options)ExecutedResultDownload file
CommandChannel
MethodParametersReturnsDescription
send(text)ExecutedResultSend to all
sendToUser(userId, text)ExecutedResultSend to user
RecordingClient
MethodReturnsDescription
startCloudRecording()ExecutedResultStart recording (host)
stopCloudRecording()ExecutedResultStop recording
pauseCloudRecording()ExecutedResultPause recording
resumeCloudRecording()ExecutedResultResume recording
LiveTranscriptionClient
MethodParametersReturnsDescription
startLiveTranscription()ExecutedResultStart transcription
stopLiveTranscription()ExecutedResultStop transcription
enableReceivingCaption(enable)ExecutedResultEnable/disable captions
setSpokenLanguage(language)ExecutedResultSet spoken language
LiveStreamClient
MethodParametersReturnsDescription
startLiveStream(url, key)ExecutedResultStart streaming
stopLiveStream()ExecutedResultStop streaming
SubsessionClient
MethodParametersReturnsDescription
createSubsessions(names)ExecutedResultCreate subsessions
openSubsessions(rooms)ExecutedResultOpen subsessions
closeAllSubsessions()ExecutedResultClose all
broadcast(message)ExecutedResultBroadcast message
getSubsessionList()Subsession[]Get subsessions

Events Reference

Session Events
EventPayloadDescription
connection-changeConnectionChangePayloadConnection state changed
user-addedParticipantPropertiesPayload[]Participant joined
user-removedParticipantPropertiesPayload[]Participant left
user-updatedParticipantPropertiesPayload[]Participant updated
Video Events
EventPayloadDescription
peer-video-state-change{action: 'Start'|'Stop', userId}Peer video on/off
video-active-change{state: VideoActiveState, userId}Video stream changed
video-capturing-change{state: VideoCapturingState}Capture state changed
video-dimension-change{width, height, type}Video dimensions changed
Audio Events
EventPayloadDescription
current-audio-change{action, source?, type?}Audio state changed
active-speakerActiveSpeaker[]Active speakers
host-ask-unmute-audio{reason}Host asks unmute
auto-play-audio-failed(none)Auto-play blocked
Screen Share Events
EventPayloadDescription
active-share-change{state: 'Active'|'Inactive', userId}Share active state
peer-share-state-change{action: 'Start'|'Stop', userId}Peer share changed
passively-stop-sharePassiveStopShareReasonShare stopped passively
share-content-dimension-change{width, height, type}Share size changed
Chat Events
EventPayloadDescription
chat-on-messageChatMessageMessage received
chat-privilege-change{chatPrivilege}Privilege changed
Command Channel Events
EventPayloadDescription
command-channel-message{senderId, senderName, text, timestamp}Command received
command-channel-statusConnectionStateChannel status
Recording Events
EventPayloadDescription
recording-change{state: RecordingStatus}Recording state changed
individual-recording-change{state, userId?}Individual recording
Transcription Events
EventPayloadDescription
caption-messageLiveTranscriptionMessageCaption received
caption-status{autoCaption, lang?, ...}Caption status
caption-enablebooleanCaption enabled/disabled
Media Events
EventPayloadDescription
device-change(none)Device added/removed
device-permission-change{name, state}Permission changed
network-quality-change{level, type, userId}Network quality

Error Types

type ErrorTypes = 
  | 'INVALID_OPERATION'      // Duplicated operation
  | 'INTERNAL_ERROR'         // Service unavailable
  | 'OPERATION_TIMEOUT'      // Timed out
  | 'INSUFFICIENT_PRIVILEGES' // Need host/manager
  | 'IMPROPER_MEETING_STATE' // Not in meeting
  | 'INVALID_PARAMETERS'     // Wrong params
  | 'OPERATION_LOCKED';      // Property locked

Requirements and compatibility

Written for: Claude Code, Claude apps

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.

Needs: Claude Code frontmatter, Needs network access, Needs Node.js

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
Anthropic (Official)
Distributed by
Anthropic
Source
anthropics/knowledge-work-plugins · partner-built/zoom-plugin/skills/video-sdk/web · commit e050c2e
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from partner-built/zoom-plugin/LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Zoom or Anthropic.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download video-sdk-web.zip