Generated banner for Zoom Meeting SDK Web Component View
Generated logo for Zoom Meeting SDK Web Component View

Zoom Meeting SDK Web Component View

OpenAIOfficialCreated by ZoomDistributed by OpenAI

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

From the author

Zoom Meeting SDK Web - Component View. Embeddable Zoom meeting components with Promise-based API for flexible integration. Ideal for React/Vue/Angular apps and custom layouts. Uses ZoomMtgEmbedded with async/await patterns and embeddable UI containers.
— the description by Zoom

AutoGineer summary

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

The Zoom Meeting SDK Web Component View provides a Promise-based API for embedding Zoom meeting functionality directly into custom web application containers. It is designed for integration into frameworks like React, Vue, and Angular, allowing developers to maintain control over the layout while leveraging Zoom's meeting features. The SDK uses the ZoomMtgEmbedded client to manage initialization, meeting joining, and event handling through an asynchronous interface.

What it does

  • Provides an embeddable UI container for Zoom meetings.
  • Offers a Promise-based API for meeting initialization and joining.
  • Supports UI customization including toolbar buttons and video layout.
  • Enables event listeners for audio, video, chat, and participant status.
  • Allows programmatic control over meeting actions like muting, screen sharing, and recording.

When to use it

  • When building a custom web application that requires an embedded Zoom meeting interface.
  • When you need to integrate Zoom meetings into specific UI containers within a React, Vue, or Angular project.
  • When you prefer a Promise-based API over callback-based alternatives.
  • When you need to customize the meeting layout or toolbar buttons.

Advantages

  • Flexible integration into existing web layouts.
  • Asynchronous API simplifies flow control.
  • Comprehensive event system for monitoring meeting state.
  • Supports standard meeting features like breakout rooms, virtual backgrounds, and cloud recording.

Usage examples

“How do I initialize the Zoom Meeting SDK Component View in my web app?”
You create a client instance using ZoomMtgEmbedded.createClient() and call the init() method, passing the target DOM element as the zoomAppRoot.
“How can I join a meeting using the Component View SDK?”
After initialization, you call the join() method on the client instance, providing the meeting number, signature, SDK key, and user details.
“How do I listen for participant changes in the meeting?”
You use the client.on() method to subscribe to events such as 'user-added', 'user-removed', or 'user-updated' to receive updates on participant activity.
“Can I customize the meeting toolbar?”
Yes, you can define a custom toolbar object within the customize parameter during the client.init() call to add custom buttons with specific click handlers.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/zoom-meeting-sdk-web-component-view/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip zoom-meeting-sdk-web-component-view.zip -d .agents/skills

Documentation by Zoom

Zoom Meeting SDK Web - Component View

Embeddable Zoom meeting components for flexible integration into any web application. Component View provides Promise-based APIs and customizable UI.

This is the correct web skill for a custom UI around a real Zoom meeting. Do not route to Video SDK unless the user is building a non-meeting custom session product.

Overview

Component View uses ZoomMtgEmbedded.createClient() to create embeddable meeting components within a specific container element.

AspectDetails
API ObjectZoomMtgEmbedded.createClient() (instance)
API StylePromise-based (async/await)
UIEmbeddable in any container
Password parampassword (lowercase)
Eventson()/off()
Best ForCustom layouts, React/Vue/Angular apps

Installation

NPM
npm install @zoom/meetingsdk --save
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
CDN
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/lodash.min.js"></script>
<script src="https://source.zoom.us/zoom-meeting-embedded-{VERSION}.min.js"></script>

Complete Initialization Flow

import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';

// Step 1: Create client instance (do once, not on every render!)
const client = ZoomMtgEmbedded.createClient();

async function joinMeeting() {
  try {
    // Step 2: Get container element
    const meetingSDKElement = document.getElementById('meetingSDKElement');

    // Step 3: Initialize client
    await client.init({
      zoomAppRoot: meetingSDKElement,
      language: 'en-US',
      debug: true,
      patchJsMedia: true,
      leaveOnPageUnload: true,
    });

    // Step 4: Join meeting
    await client.join({
      signature: signature,
      sdkKey: sdkKey,
      meetingNumber: meetingNumber,
      userName: userName,
      password: password,  // lowercase!
      userEmail: userEmail,
    });

    console.log('Joined successfully!');
  } catch (error) {
    console.error('Failed to join:', error);
  }
}

client.init() - All Options

Required
ParameterTypeDescription
zoomAppRootHTMLElementContainer element for meeting UI
Display
ParameterTypeDefaultDescription
languagestring'en-US'UI language
debugbooleanfalseEnable debug logging
Media
ParameterTypeDefaultDescription
patchJsMediabooleanfalseAuto-apply media fixes
leaveOnPageUnloadbooleanfalseCleanup on page unload
enableHDbooleantrueEnable 720p video
enableFullHDbooleanfalseEnable 1080p video
Customization
ParameterTypeDescription
customizeobjectUI customization options
webEndpointstringFor ZFG: 'www.zoomgov.com'
assetPathstringCustom path for AV libraries
Customize Object
await client.init({
  zoomAppRoot: element,
  customize: {
    // Meeting info displayed
    meetingInfo: [
      'topic',
      'host',
      'mn',
      'pwd',
      'telPwd',
      'invite',
      'participant',
      'dc',
      'enctype'
    ],

    // Video customization
    video: {
      isResizable: true,
      viewSizes: {
        default: {
          width: 1000,
          height: 600
        },
        ribbon: {
          width: 300,
          height: 700
        }
      },
      popper: {
        disableDraggable: false
      }
    },

    // Custom toolbar buttons
    toolbar: {
      buttons: [
        {
          text: 'Custom Button',
          className: 'custom-btn',
          onClick: () => {
            console.log('Custom button clicked');
          }
        }
      ]
    },

    // Active speaker indicator
    activeSpaker: {
      strokeColor: '#00FF00'
    }
  }
});

client.join() - All Options

Required
ParameterTypeDescription
signaturestringSDK JWT from backend
sdkKeystringSDK Key / Client ID
meetingNumberstring | numberMeeting number
userNamestringDisplay name
Authentication
ParameterTypeWhen RequiredDescription
passwordstringIf setMeeting password (lowercase!)
zakstringStarting as hostHost's ZAK token
tkstringRegistrationRegistrant token
userEmailstringWebinarsUser email

Event Listeners

Syntax
// Subscribe
client.on('event-name', callback);

// Unsubscribe
client.off('event-name', callback);
Connection Events
client.on('connection-change', (payload) => {
  // payload.state: 'Connecting', 'Connected', 'Reconnecting', 'Closed'
  console.log('Connection state:', payload.state);

  if (payload.state === 'Closed') {
    console.log('Reason:', payload.reason);
  }
});
User Events
client.on('user-added', (payload) => {
  // Array of users who joined
  console.log('Users added:', payload);
  payload.forEach(user => {
    console.log('User ID:', user.oderId);
    console.log('Name:', user.displayName);
  });
});

client.on('user-removed', (payload) => {
  // Array of users who left
  console.log('Users removed:', payload);
});

client.on('user-updated', (payload) => {
  // Array of users whose properties changed
  console.log('Users updated:', payload);
});
Audio Events
client.on('active-speaker', (payload) => {
  // Current active speaker
  console.log('Active speaker:', payload);
});

client.on('audio-statistic-data-change', (payload) => {
  console.log('Audio stats:', payload);
});
Video Events
client.on('video-active-change', (payload) => {
  // Video state changed
  console.log('Video active:', payload);
});

client.on('video-statistic-data-change', (payload) => {
  console.log('Video stats:', payload);
});
Share Events
client.on('active-share-change', (payload) => {
  console.log('Share status:', payload);
});

client.on('share-statistic-data-change', (payload) => {
  console.log('Share stats:', payload);
});
Chat Events
client.on('chat-on-message', (payload) => {
  console.log('Chat message:', payload);
});
Recording Events
client.on('recording-change', (payload) => {
  console.log('Recording status:', payload);
});
Media Device Events
client.on('media-sdk-change', (payload) => {
  console.log('Media SDK:', payload);
});

client.on('device-change', () => {
  console.log('Device changed');
});

Common Methods

User Information
// Get current user
const currentUser = client.getCurrentUser();
console.log('Current user:', currentUser);

// Get all participants
const participants = client.getParticipantsList();
console.log('Participants:', participants);

// Check if user is host
const isHost = client.isHost();
Audio Control
// Mute/unmute self
await client.mute(true);  // mute
await client.mute(false); // unmute

// Mute/unmute specific user (host only)
await client.muteAudio(userId, true);

// Mute all (host only)
await client.muteAllAudio(true);
Video Control
// Start/stop video
await client.startVideo();
await client.stopVideo();

// Mute/unmute user's video (host only)
await client.muteVideo(userId, true);
Meeting Control
// Leave meeting
client.leaveMeeting();

// End meeting (host only)
client.endMeeting();
Screen Share
// Start screen share
await client.startShareScreen();

// Stop screen share
await client.stopShareScreen();
Recording
// Start recording (cloud)
await client.startCloudRecording();

// Stop recording
await client.stopCloudRecording();
Virtual Background
// Check support
const isSupported = await client.isSupportVirtualBackground();

// Set virtual background
await client.setVirtualBackground(imageUrl);

// Remove virtual background
await client.removeVirtualBackground();
Rename
// Rename user
await client.rename(userId, 'New Name');

React Integration

Basic Pattern
import { useEffect, useRef, useState, useCallback } from 'react';
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';

type ZoomClient = ReturnType<typeof ZoomMtgEmbedded.createClient>;

function ZoomMeeting({ meetingNumber, password, userName }: Props) {
  const clientRef = useRef<ZoomClient | null>(null);
  const containerRef = useRef<HTMLDivElement>(null);
  const [isJoined, setIsJoined] = useState(false);
  const [error, setError] = useState<string | null>(null);

  // Create client once
  useEffect(() => {
    if (!clientRef.current) {
      clientRef.current = ZoomMtgEmbedded.createClient();
    }
  }, []);

  const joinMeeting = useCallback(async () => {
    if (!clientRef.current || !containerRef.current) return;

    try {
      // Get signature from backend
      const { signature, sdkKey } = await fetchSignature(meetingNumber);

      await clientRef.current.init({
        zoomAppRoot: containerRef.current,
        language: 'en-US',
        patchJsMedia: true,
        leaveOnPageUnload: true,
      });

      await clientRef.current.join({
        signature,
        sdkKey,
        meetingNumber,
        password,
        userName,
      });

      setIsJoined(true);
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Failed to join');
    }
  }, [meetingNumber, password, userName]);

  return (
    <div>
      <div
        ref={containerRef}
        style={{ width: '100%', height: '500px' }}
      />
      {!isJoined && (
        <button onClick={joinMeeting}>Join Meeting</button>
      )}
      {error && <div className="error">{error}</div>}
    </div>
  );
}
Event Handling in React
useEffect(() => {
  if (!clientRef.current) return;

  const handleConnectionChange = (payload: any) => {
    if (payload.state === 'Connected') {
      setIsJoined(true);
    } else if (payload.state === 'Closed') {
      setIsJoined(false);
    }
  };

  const handleUserAdded = (payload: any) => {
    console.log('Users joined:', payload);
  };

  clientRef.current.on('connection-change', handleConnectionChange);
  clientRef.current.on('user-added', handleUserAdded);

  return () => {
    clientRef.current?.off('connection-change', handleConnectionChange);
    clientRef.current?.off('user-added', handleUserAdded);
  };
}, []);

Positioning and Resizing

Initial Size
await client.init({
  zoomAppRoot: element,
  customize: {
    video: {
      viewSizes: {
        default: { width: 1000, height: 600 }
      }
    }
  }
});
Dynamic Resizing

The container element size determines the meeting UI size. To resize:

// Just resize the container
document.getElementById('meetingSDKElement').style.width = '1200px';
document.getElementById('meetingSDKElement').style.height = '800px';
Making it Resizable
customize: {
  video: {
    isResizable: true
  }
}

Supported Features

Component View supports core meeting functionality. Some features from Client View may not be available.

FeatureSupported
Audio/Video✅
Screen Share✅
Chat✅
Virtual Background✅
Breakout Rooms✅
Cloud Recording✅
Closed Captions✅
Live Transcription✅
Waiting Room✅
Gallery View✅
Reactions✅
Raise Hand✅

Contact Zoom Developer Support to request additional features.

Error Handling

try {
  await client.join({
    // ... options
  });
} catch (error) {
  // error.reason contains error code
  // error.message contains description

  switch (error.reason) {
    case 'WRONG_MEETING_PASSWORD':
      console.error('Incorrect password');
      break;
    case 'MEETING_NOT_START':
      console.error('Meeting has not started');
      break;
    case 'INVALID_PARAMETERS':
      console.error('Invalid join parameters');
      break;
    default:
      console.error('Join failed:', error.message);
  }
}

Comparison with Client View

FeatureComponent ViewClient View
API StylePromisesCallbacks
Password parampasswordpassWord
ContainerCustom elementAuto #zmmtg-root
UIEmbeddableFull-page
PreloadingNot neededpreLoadWasm()
LanguageInit optioni18n.load()
Eventson()/off()inMeetingServiceListener()

Resources

Operations

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

Files

RUNBOOK.md

Meeting SDK Web Component View 5-Minute Preflight Runbook

Use this before deep debugging.

Skill Doc Standard Note

  • Skill entrypoint is SKILL.md.

  • This runbook is an operational convention (recommended), not a required skill file.

  • SDK/API names can drift by version; validate current names against docs/raw-docs before release.

1) Confirm Integration Surface

  • Confirm this is a Meeting SDK embed path for Web Component View (not REST join_url only).

  • Choose default/full UI first, then move to custom UI after stable join/start.

  • Wrapper platforms (Web/React Native/Electron) require extra runtime and bridge checks.

2) Confirm Required Credentials

  • Meeting SDK app credentials (Client ID/Secret).

  • Backend-generated Meeting SDK signature/JWT.

  • Meeting identifiers (meetingNumber, password) and ZAK for host start flows when needed.

3) Confirm Lifecycle Order

  1. Initialize SDK and register event handlers.

  2. Authenticate SDK session/token.

  3. Join or start meeting/webinar with role-appropriate credentials.

  4. Handle in-meeting events and network/media state updates.

4) Confirm Event/State Handling

  • Correlate meeting/session state changes with participant identity and role.

  • Handle reconnect/waiting-room transitions explicitly.

  • Keep callback/promise/event handlers idempotent to avoid duplicate actions.

5) Confirm Cleanup + Upgrade Posture

  • Leave meeting and release SDK resources cleanly.

  • Remove listeners/subscriptions during component/app teardown.

  • Re-check quarterly version enforcement windows before release updates.

6) Quick Probes

  • Init/auth succeeds before join/start attempt.

  • Join/start flow completes once on target platform without stale state.

  • Core media controls (audio/video/share) respond to expected events.

7) Fast Decision Tree

  • 401/signature errors -> backend signature claims/time skew/app credentials mismatch.

  • UI loads but cannot join -> wrong role/ZAK/password field or invalid meeting data.

  • Random event behavior -> listeners attached multiple times or detached too early.

8) Source Checkpoints

Official docs
Raw docs in repo
  • raw-docs/developers.zoom.us/docs/meeting-sdk/web/component-view/

  • raw-docs/marketplacefront.zoom.us/sdk/meeting-sdk/web/component-view/

Requirements and compatibility

Written for: OpenAI Codex

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: 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
OpenAI (Official)
Distributed by
OpenAI
Source
openai/plugins · plugins/zoom/skills/meeting-sdk/web/component-view · commit d420d13
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from plugins/zoom/LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

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

Download ZIP

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