Generated banner for Build Zoom Meeting SDK App
Generated logo for Build Zoom Meeting SDK App

Build Zoom Meeting SDK App

AnthropicOfficialCreated by ZoomDistributed by Anthropic

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

From the author

Reference skill for Zoom Meeting SDK. Use after routing to a meeting-embed workflow when implementing real Zoom meeting joins, platform-specific SDK behavior, auth and join flows, waiting room issues, or meeting bot patterns.
— the description by Zoom

AutoGineer summary

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

This skill provides a comprehensive reference for developers embedding the Zoom Meeting SDK into their applications. It covers platform-specific implementation details, authentication flows, UI customization options, and critical security practices like server-side signature generation. It serves as a central hub for navigating the SDK's various platform-specific guides, troubleshooting runbooks, and official sample repositories.

What it does

  • Provides implementation patterns for embedding Zoom meetings in web, mobile, and desktop apps.
  • Outlines the mandatory server-side process for generating secure SDK signatures.
  • Distinguishes between Client View and Component View for web integrations.
  • Offers guidance on handling platform-specific SDK behaviors and common UI conflicts.
  • Links to specialized documentation for Android, iOS, macOS, Windows, and Linux environments.
  • Includes troubleshooting resources for common join, auth, and waiting room issues.

When to use it

  • When you need to embed a live Zoom meeting experience directly into your application UI.
  • When implementing programmatic meeting joins or bot-based meeting interactions.
  • When troubleshooting SDK authentication, signature errors, or meeting join failures.
  • When you need to determine the correct SDK view type (Client vs. Component) for your web project.
  • When setting up development environments for specific platforms like Unreal, Electron, or mobile.

Advantages

  • Centralizes complex documentation for multiple platforms into a single reference point.
  • Enforces security best practices by mandating server-side signature generation.
  • Provides clear architectural guidance to avoid common pitfalls like CSS conflicts.
  • Facilitates rapid troubleshooting with dedicated runbooks and triage guides.
  • Maintains clear separation between official Zoom UI and custom integration requirements.

Usage examples

“How do I securely generate a signature for the Zoom Meeting SDK in Node.js?”
The agent provides a server-side code example using jsrsasign to sign a JWT with your SDK Secret, ensuring credentials remain hidden from the client.
“I am getting a CSS conflict where my app UI breaks when the Zoom meeting loads. How do I fix this?”
The agent suggests scoping your CSS and provides specific CSS overrides to ensure the Zoom UI renders correctly without affecting your application shell.
“What is the difference between Client View and Component View in the Web SDK?”
The agent explains that Client View provides the full-page Zoom experience, while Component View allows for embedding the meeting within a specific div for a more integrated look.

Install

  1. Download the skill as a ZIP:

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

    mkdir -p .agents/skills && unzip build-zoom-meeting-sdk-app.zip -d .agents/skills

Documentation by Zoom

/build-zoom-meeting-sdk-app

Background reference for embedded Zoom meetings across web, mobile, desktop, and Linux bot environments. Prefer build-zoom-meeting-app or build-zoom-bot first, then route here for platform detail.

Zoom Meeting SDK

Embed the full Zoom meeting experience into web, mobile, desktop, and headless integrations.

Hard Routing Guardrail (Read First)

  • If the user asks to embed/join meetings inside their app UI, route to Meeting SDK implementation.

  • Do not switch to REST-only meeting link flow unless the user explicitly asks for meeting resource management or browser join_url links.

  • Meeting SDK join path requires SDK signature + SDK join call; REST join_url is not a Meeting SDK join payload.

Prerequisites

  • Zoom app with Meeting SDK credentials

  • SDK Key and Secret from Marketplace

  • Platform-specific development environment (Web, Android, iOS, macOS, Unreal, Electron, Linux, or Windows)

Need help with OAuth or signatures? See the zoom-oauth skill for authentication flows.

Need pre-join diagnostics on web? Use probe-sdk before Meeting SDK init/join to gate low-readiness devices/networks.

Start troubleshooting fast: Use the 5-Minute Runbook before deep debugging.

Quick Start (Web - Client View via CDN)

<script src="https://source.zoom.us/3.1.6/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/lodash.min.js"></script>
<script src="https://source.zoom.us/3.1.6/zoom-meeting-3.1.6.min.js"></script>

<script>
// CDN provides ZoomMtg (Client View - full page)
// For ZoomMtgEmbedded (Component View), use npm instead

ZoomMtg.preLoadWasm();
ZoomMtg.prepareWebSDK();

ZoomMtg.init({
  leaveUrl: window.location.href,
  patchJsMedia: true,
  disableCORP: !window.crossOriginIsolated,
  success: function() {
    ZoomMtg.join({
      sdkKey: 'YOUR_SDK_KEY',
      signature: 'YOUR_SIGNATURE',  // Generate server-side!
      meetingNumber: 'MEETING_NUMBER',
      userName: 'User Name',
      passWord: '',  // Note: camelCase with capital W
      success: function(res) { console.log('Joined'); },
      error: function(err) { console.error(err); }
    });
  },
  error: function(err) { console.error(err); }
});
</script>

Critical Notes (Web)

1. CDN vs npm - Different APIs!
DistributionGlobal ObjectView TypeAPI Style
CDN (zoom-meeting-{ver}.min.js)ZoomMtgClient View (full-page)Callbacks
npm (@zoom/meetingsdk)ZoomMtgEmbeddedComponent View (embeddable)Promises
2. Backend Required for Production

Never expose SDK Secret in client code. Generate signatures server-side:

// server.js (Node.js example)
const KJUR = require('jsrsasign');

app.post('/api/signature', (req, res) => {
  const { meetingNumber, role } = req.body;
  const iat = Math.floor(Date.now() / 1000) - 30;
  const exp = iat + 60 * 60 * 2;
  
  const header = { alg: 'HS256', typ: 'JWT' };
  const payload = {
    sdkKey: process.env.ZOOM_SDK_KEY,
    mn: String(meetingNumber).replace(/\D/g, ''),
    role: parseInt(role, 10),
    iat, exp, tokenExp: exp
  };
  
  const signature = KJUR.jws.JWS.sign('HS256',
    JSON.stringify(header),
    JSON.stringify(payload),
    process.env.ZOOM_SDK_SECRET
  );
  
  res.json({ signature, sdkKey: process.env.ZOOM_SDK_KEY });
});
3. CSS Conflicts - Avoid Global Resets

Global * { margin: 0; } breaks Zoom's UI. Scope your styles:

/* BAD */
* { margin: 0; padding: 0; }

/* GOOD */
.your-app, .your-app * { box-sizing: border-box; }
4. Client View Toolbar Cropping Fix

If toolbar falls off screen, scale down the Zoom UI:

#zmmtg-root {
  position: fixed !important;
  top: 0 !important;
  left: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  width: 100vw !important;
  height: 100vh !important;
  /* Critical for SPAs (React/Next/etc): ensure Zoom UI isn't behind your app shell/overlays. */
  z-index: 9999 !important;
  transform: scale(0.95) !important;
  transform-origin: top center !important;
}
5. Hide Your App When Meeting Starts

Client View takes over full page. Hide your UI:

// In ZoomMtg.init success callback:
document.documentElement.classList.add('meeting-active');
document.body.classList.add('meeting-active');
body.meeting-active .your-app { display: none !important; }
body.meeting-active { background: #000 !important; }

UI Options (Web)

Meeting SDK provides Zoom's UI with customization options:

ViewDescription
Component ViewExtractable, customizable UI - embed meeting in a div
Client ViewFull-page Zoom UI experience

Note: Unlike Video SDK where you build the UI from scratch, Meeting SDK uses Zoom's UI as the base with customization on top.

Key Concepts

ConceptDescription
SDK Key/SecretCredentials from Marketplace
SignatureJWT signed with SDK Secret
Component ViewExtractable, customizable UI (Web)
Client ViewFull-page Zoom UI (Web)

Detailed References

Platform Guides
Features

Sample Repositories

Official (by Zoom)

Full list: See general/references/community-repos.md

Resources

Environment Variables

Files

references/bot-authentication.md

Bot Authentication - JWT, ZAK, and OBF Tokens

Understanding the different token types for Meeting SDK authentication, especially for bots joining meetings.

Overview

Meeting SDK authentication involves multiple token types that serve different purposes. This guide clarifies the confusion between JWT signatures, ZAK tokens, and OBF tokens.

Token Types Summary

TokenPurposeAlways Required?Deprecated?
JWT SignatureInitialize/authenticate Meeting SDKYesNo
ZAK TokenAuthenticate as a Zoom userNo (situational)No
OBF TokenJoin external meetings with user attributionNo (required Feb 2026)No

Common Confusion

JWT App Type vs JWT Signature

This is the #1 source of confusion.

TermWhat It IsStatus
JWT App TypeA Zoom app type for REST API authenticationDeprecated (migrated to Server-to-Server OAuth)
JWT SignatureA token generated using SDK credentials to authenticate Meeting SDKStill required and NOT deprecated

Key Point: The deprecation of JWT App Type does NOT affect Meeting SDK. You still need JWT signatures for SDK authentication.


1. JWT Signature (Always Required)

What Is It?

A JWT (JSON Web Token) signature authenticates your application to use the Meeting SDK. Generated server-side using your SDK Client ID and Client Secret.

When to Use

Always. Every Meeting SDK join requires a JWT signature.

How to Generate
// Server-side (Node.js)
const KJUR = require('jsrsasign');

function generateSignature(sdkKey, sdkSecret, meetingNumber, role) {
  const iat = Math.round(Date.now() / 1000) - 30;  // 30 seconds ago
  const exp = iat + 60 * 60 * 2;                    // 2 hours from iat
  
  const payload = {
    sdkKey: sdkKey,        // Your SDK Client ID
    mn: meetingNumber,     // Meeting number to join
    role: role,            // 0 = participant, 1 = host
    iat: iat,
    exp: exp,
    tokenExp: exp
  };
  
  const header = { alg: 'HS256', typ: 'JWT' };
  
  return KJUR.jws.JWS.sign('HS256', 
    JSON.stringify(header), 
    JSON.stringify(payload), 
    sdkSecret              // Your SDK Client Secret
  );
}
Best Practice: Short-Lived Tokens
// Generate token just before joining
const iat = Math.floor(Date.now() / 1000) - 7200;  // 2 hours in past
const exp = Math.floor(Date.now() / 1000) + 10;    // 10 seconds from now

// Why this works:
// - exp is short-lived (security)
// - exp - iat >= 2 hours (Zoom requirement)
// - Token generated right before use
Role Values
RoleValueDescription
Participant0Join as attendee
Host1Join as host (requires being meeting owner or having host key)

2. ZAK Token (Zoom Access Key)

What Is It?

A short-lived credential that proves your bot/app is authenticated as a specific Zoom user. Generated via the Zoom REST API.

When to Use
ScenarioZAK Required?
Meeting has "Only Authenticated Users Can Join" enabledYes
Starting a meeting as the host (when host not present)Yes (host's ZAK)
Changing bot's profile picture to match a userYes
Regular meeting joinNo
How to Get ZAK Token

Step 1: Get OAuth Access Token

curl -X POST "https://zoom.us/oauth/token" \
  -H "Authorization: Basic {BASE64(client_id:client_secret)}" \
  -d "grant_type=authorization_code&code={auth_code}&redirect_uri={redirect_uri}"

Step 2: Generate ZAK Token

curl -X GET "https://api.zoom.us/v2/users/me/token?type=zak&ttl=7200" \
  -H "Authorization: Bearer {access_token}"

Response:

{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Required OAuth Scope
user:read:zak
Using ZAK in SDK Join
// Web SDK
ZoomMtg.join({
  signature: signature,      // JWT signature (always required)
  sdkKey: clientId,
  meetingNumber: meetingNumber,
  passWord: password,
  userName: "Meeting Bot",
  zak: zakToken,             // ZAK token for authenticated join
  success: (success) => console.log('Joined'),
  error: (error) => console.error(error)
});
Key Properties
  • Short-lived: Configurable TTL (typically 1-2 hours)

  • Any ZAK works: Doesn't need to be from a meeting participant

  • No concurrency limit: One service account can generate unlimited tokens

  • Expiry checked at join: If already in meeting, bot stays connected even if ZAK expires

Common Mistake

Wrong: Thinking ZAK must be from a meeting participant.

Right: Any Zoom account's ZAK satisfies "Only Authenticated Users" requirement. Create one service account (e.g., [email protected]) for all your bots.


3. OBF Token (On-Behalf-Of Token)

What Is It?

A new credential that ties your bot to a specific user who is present in the meeting. Required for external meetings starting February 23, 2026.

Why Introduced?

Zoom introduced OBF tokens for accountability and transparency. It makes clear that an SDK app belongs to a specific person in the meeting.

When to Use
DateExternal Meeting Requirement
Before Feb 23, 2026ZAK or OBF (optional)
After Feb 23, 2026ZAK or OBF required
Critical Difference: OBF vs ZAK
AspectZAK TokenOBF Token
User presence requiredNoYes - user MUST be in meeting
Bot disconnectionStays if token owner leavesImmediately disconnected if user leaves
Meeting scopeAny meetingSpecific meeting ID only
AttributionGeneric authenticationTied to specific attending user
How to Get OBF Token

Step 1: Get OAuth Access Token (same as ZAK)

Step 2: Generate OBF Token

curl -X GET "https://api.zoom.us/v2/users/me/token?type=onbehalf&meeting_id={meeting_id}" \
  -H "Authorization: Bearer {access_token}"

Response:

{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Required OAuth Scope
user:read:token
Using OBF in SDK Join
// Web SDK
ZoomMtg.join({
  signature: signature,      // JWT signature (always required)
  sdkKey: clientId,
  meetingNumber: meetingNumber,
  passWord: password,
  userName: "Meeting Bot",
  obfToken: obfToken,        // OBF token (NOT zak)
  success: (success) => console.log('Joined'),
  error: (error) => console.error(error)
});

Important: zak and obfToken are mutually exclusive. Use only one.

Handling Join Failures

If bot joins before authorizing user is in meeting:

// SDK v6.6.10+ returns specific error code
// MEETING_FAIL_AUTHORIZED_USER_NOT_INMEETING

async function joinWithRetry(joinOptions, maxRetries = 5) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      await ZoomMtg.join(joinOptions);
      return; // Success
    } catch (error) {
      if (error.code === 'MEETING_FAIL_AUTHORIZED_USER_NOT_INMEETING') {
        console.log(`User not in meeting yet. Retry ${i + 1}/${maxRetries}`);
        await sleep(3000); // Wait 3 seconds
      } else {
        throw error; // Different error, don't retry
      }
    }
  }
  throw new Error('Max retries exceeded - user never joined meeting');
}
OBF Token Mapping

You must map users to their meetings:

  1. Zoom Meetings API: GET /users/{userId}/meetings

  2. Calendar integration: Parse meeting invites from Google Calendar/Outlook


Complete Bot Join Flow

Current (Pre-Feb 2026)
// 1. Generate JWT signature (always required)
const signature = await generateSignature(sdkKey, sdkSecret, meetingNumber, 0);

// 2. Optionally get ZAK for authenticated-only meetings
let zakToken = null;
if (meetingRequiresAuth) {
  zakToken = await getZAKToken(accessToken);
}

// 3. Join meeting
await ZoomMtg.join({
  signature: signature,
  sdkKey: sdkKey,
  meetingNumber: meetingNumber,
  passWord: password,
  userName: "Meeting Bot",
  zak: zakToken,  // Optional
});
Post-Feb 2026 (External Meetings)
// 1. Generate JWT signature (always required)
const signature = await generateSignature(sdkKey, sdkSecret, meetingNumber, 0);

// 2. For external meetings, get OBF token
const obfToken = await getOBFToken(accessToken, meetingNumber);

// 3. Wait for authorizing user to join (if using OBF)
// ... implement retry logic ...

// 4. Join meeting
await ZoomMtg.join({
  signature: signature,
  sdkKey: sdkKey,
  meetingNumber: meetingNumber,
  passWord: password,
  userName: "Meeting Bot",
  obfToken: obfToken,  // For external meetings
});

Linux Bot Implementation

For headless Linux bots, use the official sample:

# Clone sample repository
git clone [email protected]:zoom/meetingsdk-headless-linux-sample.git

# Configure (sample.config.toml)
[credentials]
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"

[meeting]
join_url = "https://zoom.us/j/123456789?pwd=xxx"
# OR
meeting_id = 123456789
password = "abc123"

# Optional tokens
zak_token = "..."   # For authenticated joins
obf_token = "..."   # For external meetings

# Run with Docker
docker compose up

Common Mistakes

MistakeRealityFix
JWT signatures are deprecatedOnly JWT App Type is deprecatedContinue using JWT signatures for SDK
ZAK must be from meeting participantAny Zoom account's ZAK worksUse single service account
Using both ZAK and OBF togetherThey're mutually exclusiveUse only one
Generating OBF before user in meetingOBF requires user presenceImplement retry logic
Development credentials for external meetingsDev credentials only work for your accountGet production credentials (4-6 week review)

Timeline

DateChange
NowJWT signatures required; ZAK optional
Nov 2025SDK v6.6.10 with OBF-specific error codes
Feb 23, 2026OBF or ZAK required for external meetings

OAuth Scopes Summary

TokenRequired Scope
ZAK Tokenuser:read:zak
OBF Tokenuser:read:token

Resources

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.

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/meeting-sdk · 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 build-zoom-meeting-sdk-app.zip