Generated banner for Zoom Meeting SDK Windows
Generated logo for Zoom Meeting SDK Windows

Zoom Meeting SDK Windows

OpenAIOfficialCreated by ZoomDistributed by OpenAI

  • Skill
  • Tool integration
  • Software development
  • MIT
  • Low risk

From the author

Zoom Meeting SDK for Windows - Native C++ SDK for embedding Zoom meetings into Windows desktop applications. Supports custom UI architecture with raw video/audio data, headless bots, and deep integration with meeting features. Includes SDK architecture patterns and Windows message loop handling.
— the description by Zoom

AutoGineer summary

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

The Zoom Meeting SDK for Windows provides a native C++ interface for embedding Zoom functionality directly into desktop applications. It supports a wide range of features including custom UI rendering, headless bot operations, and raw audio/video stream access. The SDK relies on a controller-listener architecture, requiring developers to implement specific event interfaces to handle meeting lifecycle events and data streams. Proper integration requires careful management of the Windows message loop to ensure callbacks are processed correctly.

What it does

  • Embeds full Zoom meeting functionality into native Windows C++ applications.
  • Supports headless bot development for automated meeting participation.
  • Provides access to raw audio and video data streams for custom processing.
  • Enables custom UI development using child HWNDs or direct rendering.
  • Facilitates local recording and advanced meeting control features.
  • Requires implementation of event listeners for all feature controllers.

When to use it

  • When building a native Windows desktop application that requires integrated video conferencing.
  • When developing automated bots that need to join and interact with Zoom meetings.
  • When you need low-level access to raw audio/video frames for custom analysis or rendering.
  • When you require full control over the meeting UI rather than using the default Zoom interface.

Advantages

  • Native C++ performance for resource-intensive media processing.
  • Deep integration with Windows message loops and desktop UI frameworks.
  • Consistent architecture pattern across all 35+ available feature controllers.
  • Flexible options for both standard and fully custom UI implementations.

Usage examples

“How do I initialize the Zoom SDK in my Windows C++ application?”
The user receives the InitParam structure configuration and the call to InitSDK, including necessary header includes and error handling.
“Why are my Zoom SDK callbacks not firing?”
The user is guided to implement the Windows message loop using PeekMessage and DispatchMessage to ensure the SDK can process asynchronous events.
“How can I capture raw video from a meeting?”
The user is shown how to use IMeetingRecordingController to start raw recording and IZoomSDKRenderer to subscribe to video frames.
“What is the recommended project structure for a Zoom SDK app?”
The user receives a directory layout separating SDK binaries, headers, and libraries, along with instructions for configuring Visual Studio project properties.

Install

  1. Download the skill as a ZIP:

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

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

Documentation by Zoom

Zoom Meeting SDK (Windows)

Embed Zoom meeting capabilities into Windows desktop applications for native C++ integrations and headless bots.

New to Zoom SDK? Start Here!

The fastest way to master the SDK:

  1. SDK Architecture Pattern - Learn the universal pattern that works for ALL 35+ features

  2. Authentication Pattern - Get a working bot joining meetings

  3. Windows Message Loop - Fix the #1 reason callbacks don't fire

Building a Custom UI?

Having issues?

Prerequisites

  • Zoom app with Meeting SDK credentials (Client ID & Secret)

  • Visual Studio 2019/2022 or later

  • Windows 10 or later

  • C++ development environment

  • vcpkg for dependency management

Need help with authentication? See the zoom-oauth skill for JWT token generation.

Project Preferences & Learnings

IMPORTANT: These are hard-won preferences from real project experience. Follow these when creating new projects.

Do NOT use CMake — Use native Visual Studio .vcxproj

Always create a native Visual Studio .sln + .vcxproj project, not a CMake project. Reasons:

  • More standard and familiar for Windows C++ developers

  • Developers can double-click the .sln to open in Visual Studio immediately

  • Project settings (include dirs, lib dirs, preprocessor defines) are easier to see and edit in the VS Property Pages UI

  • No extra CMake tooling or configuration step required

  • Friendlier and easier for developers to understand and maintain

config.json must be visible in Solution Explorer

The config.json file (containing sdk_jwt, meeting_number, passcode) must be:

  1. Included in the .vcxproj as a <None> item with <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

  2. Placed in a "Config" filter in the .vcxproj.filters file so it appears under a "Config" folder in Solution Explorer

  3. Easily editable by developers directly from Solution Explorer — they should never have to hunt for it in File Explorer

Example .vcxproj entry:

<ItemGroup>
  <None Include="config.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Example .vcxproj.filters entry:

<ItemGroup>
  <Filter Include="Config">
    <UniqueIdentifier>{GUID-HERE}</UniqueIdentifier>
  </Filter>
</ItemGroup>
<ItemGroup>
  <None Include="config.json">
    <Filter>Config</Filter>
  </None>
</ItemGroup>

Overview

The Windows SDK is a C++ native SDK designed for:

  • Desktop applications - Native Windows apps with full UI control

  • Headless bots - Join meetings without UI

  • Raw media access - Capture/send audio/video streams

  • Local recording - Record meetings locally or to cloud

Key Architectural Insight

The SDK follows a universal 3-step pattern for every feature:

  1. Get controller (singleton): meetingService->Get[Feature]Controller()

  2. Implement event listener: class MyListener : public I[Feature]Event { ... }

  3. Register and use: controller->SetEvent(listener) then call methods

This works for ALL features: audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, and 20+ more!

Learn more: SDK Architecture Pattern Guide

Quick Start

1. Download Windows SDK

Download from Zoom Marketplace:

  • Extract zoom-meeting-sdk-windows_x86_64-{version}.zip

2. Setup Project Structure
your-project/
  YourApp/
    SDK/
      x64/
        bin/          # DLL files and dependencies
        h/            # Header files
        lib/          # sdk.lib
      x86/
        bin/
        h/
        lib/
    YourApp.cpp
    YourApp.vcxproj
    config.json

Copy SDK files:

xcopy /E /I sdk-package\x64 your-project\YourApp\SDK\x64\
xcopy /E /I sdk-package\x86 your-project\YourApp\SDK\x86\
3. Install Dependencies (vcpkg)
# Install vcpkg
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
cd C:\vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install

# Install dependencies
.\vcpkg install jsoncpp:x64-windows
.\vcpkg install curl:x64-windows
4. Configure Visual Studio Project

Project Properties → C/C++ → General → Additional Include Directories:

$(SolutionDir)SDK\$(PlatformTarget)\h
C:\vcpkg\packages\jsoncpp_x64-windows\include
C:\vcpkg\packages\curl_x64-windows\include

Project Properties → Linker → General → Additional Library Directories:

$(SolutionDir)SDK\$(PlatformTarget)\lib

Project Properties → Linker → Input → Additional Dependencies:

sdk.lib

Post-Build Event (Copy DLLs to output):

xcopy /Y /D "$(SolutionDir)SDK\$(PlatformTarget)\bin\*.*" "$(OutDir)"
5. Configure Credentials

Create config.json:

{
  "sdk_jwt": "YOUR_JWT_TOKEN",
  "meeting_number": "1234567890",
  "passcode": "password123",
  "zak": ""
}
6. Build & Run
  • Open solution in Visual Studio

  • Select x64 or x86 configuration

  • Press F5 to build and run

Core Workflow

┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  InitSDK    │───►│  AuthSDK    │───►│ JoinMeeting │───►│ Raw Data    │
│             │    │  (JWT)      │    │             │    │ Subscribe   │
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
                         │                   │
                         ▼                   ▼
                   OnAuthComplete      onInMeeting
                     callback           callback

⚠️ CRITICAL: Add Windows message loop or callbacks won't fire!

while (!done) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

See: Windows Message Loop Guide

Code Examples

💡 Pro Tip: These are minimal examples. For complete, tested code see:

Important: Include Order

CRITICAL: Include headers in this exact order or you'll get build errors:

#include <windows.h>      // MUST be first
#include <cstdint>         // MUST be second (SDK headers use uint32_t)
// ... other standard headers ...
#include <zoom_sdk.h>
#include <meeting_service_components/meeting_audio_interface.h>  // BEFORE participants!
#include <meeting_service_components/meeting_participants_ctrl_interface.h>

See: Build Errors Guide for all dependency fixes.

1. Initialize SDK
#include <windows.h>
#include <cstdint>
#include <zoom_sdk.h>

using namespace ZOOM_SDK_NAMESPACE;

bool InitMeetingSDK() {
    InitParam initParam;
    initParam.strWebDomain = L"https://zoom.us";
    initParam.strSupportUrl = L"https://zoom.us";
    initParam.emLanguageID = LANGUAGE_English;
    initParam.enableLogByDefault = true;
    initParam.enableGenerateDump = true;

    SDKError err = InitSDK(initParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"InitSDK failed: " << err << std::endl;
        return false;
    }
    return true;
}
2. Authenticate with JWT
#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include "AuthServiceEventListener.h"

IAuthService* authService = nullptr;

void OnAuthenticationComplete() {
    std::cout << "Authentication successful!" << std::endl;
    JoinMeeting();  // Proceed to join meeting
}

bool AuthenticateSDK(const std::wstring& jwtToken) {
    CreateAuthService(&authService);
    if (!authService) return false;

    // Set event listener BEFORE calling SDKAuth
    authService->SetEvent(new AuthServiceEventListener(&OnAuthenticationComplete));

    // Authenticate with JWT
    AuthContext authContext;
    authContext.jwt_token = jwtToken.c_str();

    SDKError err = authService->SDKAuth(authContext);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"SDKAuth failed: " << err << std::endl;
        return false;
    }

    // CRITICAL: Add message loop or callback won't fire!
    // See complete example: examples/authentication-pattern.md

    return true;
}

AuthServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class AuthServiceEventListener : public IAuthServiceEvent {
public:
    AuthServiceEventListener(void (*onComplete)())
        : onAuthComplete(onComplete) {}

    void onAuthenticationReturn(AuthResult ret) override {
        if (ret == AUTHRET_SUCCESS && onAuthComplete) {
            onAuthComplete();
        } else {
            std::cout << "Auth failed: " << ret << std::endl;
        }
    }

    // Must implement ALL pure virtual methods (6 total)
    void onLoginReturnWithReason(LOGINSTATUS ret, IAccountInfo* info, LoginFailReason reason) override {}
    void onLogout() override {}
    void onZoomIdentityExpired() override {}
    void onZoomAuthIdentityExpired() override {}
#if defined(WIN32)
    void onNotificationServiceStatus(SDKNotificationServiceStatus status, SDKNotificationServiceError error) override {}
#endif

private:
    void (*onAuthComplete)();
};

See complete working code: Authentication Pattern Guide

3. Join Meeting
#include <meeting_service_interface.h>
#include "MeetingServiceEventListener.h"

IMeetingService* meetingService = nullptr;

void OnMeetingJoined() {
    std::cout << "Joining meeting..." << std::endl;
}

void OnInMeeting() {
    std::cout << "In meeting now!" << std::endl;
    // Start raw data capture here
}

void OnMeetingEnds() {
    std::cout << "Meeting ended" << std::endl;
}

bool JoinMeeting(UINT64 meetingNumber, const std::wstring& password) {
    CreateMeetingService(&meetingService);
    if (!meetingService) return false;

    // Set event listener
    meetingService->SetEvent(
        new MeetingServiceEventListener(&OnMeetingJoined, &OnMeetingEnds, &OnInMeeting)
    );

    // Prepare join parameters
    JoinParam joinParam;
    joinParam.userType = SDK_UT_WITHOUT_LOGIN;

    JoinParam4WithoutLogin& params = joinParam.param.withoutloginuserJoin;
    params.meetingNumber = meetingNumber;
    params.userName = L"Bot User";
    params.psw = password.c_str();
    params.isVideoOff = false;
    params.isAudioOff = false;

    SDKError err = meetingService->Join(joinParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"Join failed: " << err << std::endl;
        return false;
    }
    return true;
}

MeetingServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <meeting_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class MeetingServiceEventListener : public IMeetingServiceEvent {
public:
    MeetingServiceEventListener(
        void (*onJoined)(),
        void (*onEnded)(),
        void (*onInMeeting)()
    ) : onMeetingJoined(onJoined),
        onMeetingEnded(onEnded),
        onInMeetingCallback(onInMeeting) {}

    void onMeetingStatusChanged(MeetingStatus status, int iResult) override {
        if (status == MEETING_STATUS_CONNECTING) {
            if (onMeetingJoined) onMeetingJoined();
        }
        else if (status == MEETING_STATUS_INMEETING) {
            if (onInMeetingCallback) onInMeetingCallback();
        }
        else if (status == MEETING_STATUS_ENDED) {
            if (onMeetingEnded) onMeetingEnded();
        }
    }

    // Must implement ALL pure virtual methods (9 total)
    void onMeetingStatisticsWarningNotification(StatisticsWarningType type) override {}
    void onMeetingParameterNotification(const MeetingParameter* param) override {}
    void onSuspendParticipantsActivities() override {}
    void onAICompanionActiveChangeNotice(bool isActive) override {}
    void onMeetingTopicChanged(const zchar_t* sTopic) override {}
    void onMeetingFullToWatchLiveStream(const zchar_t* sLiveStreamUrl) override {}
    void onUserNetworkStatusChanged(MeetingComponentType type, ConnectionQuality level, unsigned int userId, bool uplink) override {}
#if defined(WIN32)
    void onAppSignalPanelUpdated(IMeetingAppSignalHandler* pHandler) override {}
#endif

private:
    void (*onMeetingJoined)();
    void (*onMeetingEnded)();
    void (*onInMeetingCallback)();
};

See all required methods: Interface Methods Guide

4. Subscribe to Raw Video
#include <windows.h>
#include <cstdint>
#include <rawdata/zoom_rawdata_api.h>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>  // REQUIRED for YUVRawDataI420
#include "ZoomSDKRendererDelegate.h"

IZoomSDKRenderer* videoHelper = nullptr;
ZoomSDKRendererDelegate* videoSource = new ZoomSDKRendererDelegate();

bool StartVideoCapture(uint32_t userId) {
    // STEP 1: Start raw recording FIRST (required!)
    IMeetingRecordingController* recordCtrl =
        meetingService->GetMeetingRecordingController();

    SDKError canStart = recordCtrl->CanStartRawRecording();
    if (canStart != SDKERR_SUCCESS) {
        std::cout << "Cannot start recording: " << canStart << std::endl;
        return false;
    }

    recordCtrl->StartRawRecording();

    // Wait for recording to initialize
    std::this_thread::sleep_for(std::chrono::milliseconds(500));

    // STEP 2: Create renderer
    SDKError err = createRenderer(&videoHelper, videoSource);
    if (err != SDKERR_SUCCESS || !videoHelper) {
        std::cout << "createRenderer failed: " << err << std::endl;
        return false;
    }

    // STEP 3: Set resolution and subscribe
    videoHelper->setRawDataResolution(ZoomSDKResolution_720P);
    err = videoHelper->subscribe(userId, RAW_DATA_TYPE_VIDEO);
    if (err != SDKERR_SUCCESS) {
        std::cout << "Subscribe failed: " << err << std::endl;
        return false;
    }

    std::cout << "Video capture started! Frames arrive in onRawDataFrameReceived()" << std::endl;
    return true;
}

ZoomSDKRendererDelegate.h:

#include <windows.h>
#include <cstdint>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>
#include <fstream>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class ZoomSDKRendererDelegate : public IZoomSDKRendererDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        if (!data) return;

        // YUV420 (I420) format: Y plane + U plane + V plane
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();

        // Calculate buffer sizes
        // Y = full resolution, U/V = quarter resolution each
        size_t ySize = width * height;
        size_t uvSize = ySize / 4;  // (width/2) * (height/2)

        // Total size: width * height * 1.5 bytes

        // Save to file (playback: ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 output.yuv)
        std::ofstream outputFile("output.yuv", std::ios::binary | std::ios::app);
        outputFile.write(data->GetYBuffer(), ySize);    // Brightness
        outputFile.write(data->GetUBuffer(), uvSize);   // Blue-difference
        outputFile.write(data->GetVBuffer(), uvSize);   // Red-difference
        outputFile.close();
    }

    void onRawDataStatusChanged(RawDataStatus status) override {
        std::cout << "Raw data status: " << status << std::endl;
    }

    void onRendererBeDestroyed() override {
        std::cout << "Renderer destroyed" << std::endl;
    }
};

Complete video capture guide: Raw Video Capture Guide

5. Subscribe to Raw Audio
#include <rawdata/rawdata_audio_helper_interface.h>

class ZoomSDKAudioRawDataDelegate : public IZoomSDKAudioRawDataDelegate {
public:
    void onMixedAudioRawDataReceived(AudioRawData* data) override {
        // Process PCM audio (mixed from all participants)
        std::ofstream pcmFile("audio.pcm", std::ios::binary | std::ios::app);
        pcmFile.write((char*)data->GetBuffer(), data->GetBufferLen());
        pcmFile.close();
    }

    void onOneWayAudioRawDataReceived(AudioRawData* data, uint32_t node_id) override {
        // Process audio from specific participant
    }
};

// Subscribe to audio
IZoomSDKAudioRawDataHelper* audioHelper = GetAudioRawdataHelper();
audioHelper->subscribe(new ZoomSDKAudioRawDataDelegate());
6. Main Message Loop (CRITICAL!)

⚠️ WITHOUT THIS, CALLBACKS WON'T FIRE!

#include <windows.h>
#include <thread>
#include <chrono>

int main() {
    // Initialize COM
    CoInitialize(NULL);

    // Load config and initialize
    LoadConfig();
    InitMeetingSDK();
    AuthenticateSDK(sdk_jwt);

    // CRITICAL: Windows message loop for SDK callbacks
    // SDK uses Windows message pump to dispatch callbacks
    // Without this, callbacks are queued but NEVER fire!
    MSG msg;
    while (!g_exit) {
        // Process all pending Windows messages
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_exit = true;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        // Small sleep to avoid busy-waiting
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

    // Cleanup
    CleanSDK();
    CoUninitialize();

    return 0;
}

Why message loop is critical: The SDK uses Windows COM/messaging for async callbacks. Without PeekMessage(), the SDK queues messages but they're never retrieved/dispatched, so callbacks never execute.

Symptoms without message loop:

  • Authentication timeout (even with valid JWT)

  • Meeting join timeout

  • No callback events fire

  • Appears like network/auth issue but it's a message loop issue

See detailed explanation: Windows Message Loop Guide

Common Issues & Solutions

IssueSolution
Callbacks don't fire / Auth timeoutAdd Windows message loop → Guide
uint32_t / AudioType errorsFix include order → Guide
Abstract class errorImplement all virtual methods → Guide
How to implement [feature]?Follow universal pattern → Guide
Authentication failsCheck JWT token & error codes → Guide
No video frames receivedCall StartRawRecording() first → Guide

Complete troubleshooting: Common Issues Guide

How to Implement Any Feature

The SDK has 35+ feature controllers (audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, captions, AI companion, etc.).

Universal pattern that works for ALL features:

  1. Get the controller (singleton):

    IMeetingAudioController* audioCtrl = meetingService->GetMeetingAudioController();
    IMeetingChatController* chatCtrl = meetingService->GetMeetingChatController();
    // ... 33 more controllers available
  2. Implement event listener (observer pattern):

    class MyAudioListener : public IMeetingAudioCtrlEvent {
        void onUserAudioStatusChange(IList<IUserAudioStatus*>* lst) override {
            // React to audio events
        }
        // ... implement all required methods
    };
  3. Register and use:

    audioCtrl->SetEvent(new MyAudioListener());
    audioCtrl->MuteAudio(userId, true);  // Use feature

Complete guide with examples: SDK Architecture Pattern

Available Examples

ExampleDescription
SkeletonDemoMinimal join meeting - start here
GetVideoRawDataSubscribe to raw video streams
GetAudioRawDataSubscribe to raw audio streams
SendVideoRawDataSend custom video as virtual camera
SendAudioRawDataSend custom audio as virtual mic
GetShareRawDataCapture screen share content
LocalRecordingLocal MP4 recording
ChatDemoIn-meeting chat functionality
CaptionDemoClosed caption/live transcription
BreakoutDemoBreakout room management

Detailed References

🎯 Core Concepts (START HERE!)
📚 Complete Examples
🔧 Troubleshooting Guides
📖 References
🎨 Feature-Specific Guides
  • ../references/breakout-rooms.md - Programmatic breakout room management

  • ../references/ai-companion.md - AI Companion controls

Sample Repositories

RepositoryDescription
meetingsdk-windows-raw-recording-sampleOfficial raw data capture samples
meetingsdk-windows-local-recording-sampleLocal recording with Docker

Playing Raw Video/Audio Files

Raw YUV/PCM files have no headers - you must specify format explicitly.

Play Raw YUV Video
ffplay -video_size 1280x720 -pixel_format yuv420p -f rawvideo output.yuv
Convert YUV to MP4
ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv -c:v libx264 output.mp4
Play Raw PCM Audio
ffplay -f s16le -ar 32000 -ac 1 audio.pcm
Convert PCM to WAV
ffmpeg -f s16le -ar 32000 -ac 1 -i audio.pcm output.wav
Combine Video + Audio
ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv ^
       -f s16le -ar 32000 -ac 1 -i audio.pcm ^
       -c:v libx264 -c:a aac -shortest output.mp4

Key flags:

FlagDescription
-video_size WxHFrame dimensions (e.g., 1280x720)
-pixel_format yuv420pI420/YUV420 planar format
-f rawvideoRaw video input (no container)
-f s16leSigned 16-bit little-endian PCM
-ar 32000Sample rate (Zoom uses 32kHz)
-ac 1Mono (use -ac 2 for stereo)

Authentication Requirements (2026 Update)

Important: Beginning March 2, 2026, apps joining meetings outside their account must be authorized.

Use one of:

  • App Privilege Token (OBF) - Recommended for bots (app_privilege_token in JoinParam)

  • ZAK Token - Zoom Access Key (userZAK in JoinParam)

  • On Behalf Token - For specific use cases (onBehalfToken in JoinParam)

📖 Complete Documentation Library

This skill includes comprehensive guides created from real-world debugging:

🎯 Start Here
📚 By Category

Core Concepts:

Complete Examples:

Troubleshooting:

References:

  • Interface Methods - All required virtual methods (6 auth + 9 meeting)

  • Windows Reference - Platform setup

  • Authorization - JWT generation

  • Bot Authentication - Bot token types

  • Breakout Rooms - Breakout room API

  • AI Companion - AI features

🚨 Most Critical Issues (From Real Debugging)
  1. Callbacks not firing → Missing Windows message loop (99% of issues)

  2. Build errors → SDK header dependencies (uint32_t, AudioType, etc.)

  3. Abstract class errors → Missing virtual method implementations

💡 Key Insight

Once you learn the 3-step pattern, you can implement ANY of the 35+ features:

  1. Get controller → 2. Implement event listener → 3. Register and use

See: SDK Architecture Pattern

Official Resources


Documentation Version: Based on Zoom Windows Meeting SDK v6.7.2.26830

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

Merged from meeting-sdk/windows/SKILL.md

Zoom Windows Meeting SDK - 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

    • This teaches you the universal formula that applies to ALL features

    • Once you understand this, you can implement any feature by reading the .h files

  2. Fix build errors → troubleshooting/build-errors.md

    • SDK header dependencies issues

    • Required include order

  3. Implement authentication → examples/authentication-pattern.md

    • Complete working JWT authentication code

  4. Fix callback issues → troubleshooting/windows-message-loop.md

    • CRITICAL: Why callbacks don't fire without Windows message loop

    • This was the hardest issue to diagnose!

  5. Implement virtual methods → references/interface-methods.md

    • Complete lists of all required methods

    • How to avoid abstract class errors

  6. Capture video (optional) → examples/raw-video-capture.md

    • YUV420 format explained

    • Complete raw data capture workflow

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

    • Quick diagnostic checklist

    • Error code tables

    • "If you see X, do Y" reference


📂 Documentation Structure

meeting-sdk/windows/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # THE MOST IMPORTANT DOC
│   │                                  # Universal formula for ANY feature
│   ├── singleton-hierarchy.md        # Navigation guide for SDK services
│   │                                  # 4-level deep service tree, when/how
│   ├── custom-ui-architecture.md     # How Custom UI rendering works
│   │                                  # Child HWNDs, D3D, layout, events
│   └── custom-ui-vs-raw-data.md      # SDK-rendered vs self-rendered
│                                      # Decision guide for Custom UI approach
│
├── examples/                          # Complete working code
│   ├── authentication-pattern.md     # JWT auth with full code
│   ├── raw-video-capture.md          # Video capture with YUV420 details
│   │                                  # Recording vs Streaming, permissions
│   ├── custom-ui-video-rendering.md  # Custom UI with video container
│   │                                  # Active speaker + gallery layout
│   ├── breakout-rooms.md             # Complete breakout room guide
│   │                                  # 5 roles, create/manage/join
│   ├── chat.md                       # Send/receive chat messages
│   │                                  # Rich text, threading, file transfer
│   ├── captions-transcription.md     # Live transcription & closed captions
│   │                                  # Multi-language translation
│   ├── local-recording.md            # Local MP4 recording
│   │                                  # Permission flow, encoder monitoring
│   ├── share-raw-data-capture.md     # Screen share raw data capture
│   │                                  # YUV420 frames from shared content
│   └── send-raw-data.md              # Virtual camera/mic/share
│                                      # Send custom video/audio/share
│
├── troubleshooting/                   # Problem solving guides
│   ├── windows-message-loop.md       # CRITICAL - Why callbacks fail
│   ├── build-errors.md               # Header dependency fixes + MSBuild
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── interface-methods.md           # Required virtual methods
    │                                  # Auth(6) + Meeting(9) + CustomUI(13)
    ├── windows-reference.md           # Platform setup
    ├── authorization.md               # JWT generation
    ├── bot-authentication.md          # Bot token types
    ├── breakout-rooms.md              # Breakout room features
    └── ai-companion.md                # AI Companion features

🎯 By Use Case

I want to build a meeting bot
  1. SDK Architecture Pattern - Understand the pattern

  2. Authentication Pattern - Join meetings

  3. Windows Message Loop - Fix callback issues

  4. Interface Methods - Implement callbacks

I'm getting build errors
  1. Build Errors Guide - SDK header dependencies

  2. Interface Methods - Abstract class errors

  3. Common Issues - Linker errors

I'm getting runtime errors
  1. Windows Message Loop - Callbacks not firing

  2. Authentication Pattern - Auth timeout

  3. Common Issues - Error code tables

I want to build a Custom UI meeting app
  1. Custom UI Architecture - How SDK rendering works

  2. SDK-Rendered vs Self-Rendered - Choose your approach

  3. Custom UI Video Rendering - Complete working code

  4. Interface Methods - 13 Custom UI virtual methods

  5. Build Errors Guide - MSBuild from git bash

I want to capture video/audio
  1. Raw Video Capture - Complete video workflow

    • Recording vs Streaming approaches

    • Permission requirements (host, OAuth tokens)

    • Audio PCM capture

  2. Share Raw Data Capture - Screen share capture

    • Subscribe to RAW_DATA_TYPE_SHARE

    • Handle dynamic resolution

  3. SDK Architecture Pattern - Controller pattern

  4. Common Issues - No frames received

I want to use breakout rooms
  1. Breakout Rooms Guide - Complete breakout room workflow

    • 5 roles: Creator, Admin, Data, Assistant, Attendee

    • Create, configure, manage, join/leave rooms

  2. Common Issues - Breakout room error codes

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

    • Rich text formatting (bold, italic, links)

    • Private messages and threading

    • File transfer events

I want to use live transcription
  1. Captions & Transcription Guide - Live transcription

    • Automatic speech-to-text

    • Multi-language translation

    • Manual closed captions (host feature)

I want to record meetings
  1. Local Recording Guide - Local MP4 recording

    • Permission request workflow

    • zTscoder.exe encoder monitoring

    • Gallery view vs active speaker

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

  2. Find the controller in SDK/x64/h/meeting_service_interface.h

  3. Find the header in SDK/x64/h/meeting_service_components/

  4. Follow the universal pattern: Get controller → Implement listener → Use methods

I want to understand the SDK architecture
  1. SDK Architecture Pattern - Complete architecture overview

  2. Singleton Hierarchy - Navigate the service tree (4 levels)

  3. Interface Methods - Event listener pattern

  4. Authentication Pattern - Service pattern


🔥 Most Critical Documents

1. SDK Architecture Pattern (⭐ MASTER DOCUMENT)

concepts/sdk-architecture-pattern.md

This is THE most important document. It teaches the universal 3-step pattern:

  1. Get controller (singleton pattern)

  2. Implement event listener (observer pattern)

  3. Register and use

Once you understand this pattern, you can implement any of the 35+ features by just reading the SDK headers.

Key insight: The Zoom SDK follows a perfectly consistent architecture. Every feature works the same way.


2. Windows Message Loop (⚠️ MOST COMMON ISSUE)

troubleshooting/windows-message-loop.md

99% of "callbacks not firing" issues are caused by missing Windows message loop. This document explains:

  • Why SDK requires PeekMessage() loop

  • How to implement it correctly

  • How to diagnose callback issues

This was the hardest bug to find during development (took ~2 hours).


3. Build Errors Guide

troubleshooting/build-errors.md

SDK headers have dependency bugs that cause build errors. This document provides:

  • Required include order

  • Missing <cstdint> fix

  • Missing AudioType fix

  • Missing YUVRawDataI420 fix


📊 By Document Type

Concepts (Why and How)
Examples (Complete Working Code)
Troubleshooting (Problem Solving)
References (Lookup Information)
  • Interface Methods - Required virtual methods

  • Windows Reference - Platform setup

  • Authorization - JWT generation

  • Bot Authentication - Bot tokens

  • Breakout Rooms - Breakout room API

  • AI Companion - AI features


💡 Key Learnings from Real Debugging

These documents were created from actual debugging of a non-functional Zoom SDK sample. Here are the key insights:

Critical Discoveries:
  1. Windows Message Loop is MANDATORY (not optional)

    • SDK uses Windows message pump for callbacks

    • Without it, callbacks are queued but never fire

    • Manifests as "authentication timeout" even with valid JWT

    • See: Windows Message Loop Guide

  2. SDK Headers Have Dependency Bugs

    • Missing #include <cstdint> in SDK headers

    • meeting_participants_ctrl_interface.h doesn't include meeting_audio_interface.h

    • rawdata_renderer_interface.h only forward-declares YUVRawDataI420

    • See: Build Errors Guide

  3. Include Order is CRITICAL

    • <windows.h> must be FIRST

    • <cstdint> must be SECOND

    • Then SDK headers in specific order

    • See: Build Errors Guide

  4. ALL Virtual Methods Must Be Implemented

    • Including WIN32-conditional methods

    • SDK v6.7.2 requires 6 auth methods + 9 meeting methods

    • Different versions have different requirements

    • See: Interface Methods Guide

  5. The Architecture is Beautifully Consistent

    • Every feature follows the same 3-step pattern

    • Controllers are singletons

    • Event listeners use observer pattern

    • Once you learn the pattern, you can implement any feature

    • See: SDK Architecture Pattern


🎓 Learning Path by Skill Level

Beginner (Never used Zoom SDK)
  1. Read SDK Architecture Pattern to understand the overall design

  2. Follow Authentication Pattern to join your first meeting

  3. Reference Common Issues when you hit problems

Intermediate (Familiar with SDK basics)
  1. Deep dive into SDK Architecture Pattern - implement multiple features

  2. Learn Raw Video Capture for media processing

  3. Use Interface Methods as reference

Advanced (Building production bots)
  1. Study SDK Architecture Pattern - learn to implement ANY feature

  2. Master Windows Message Loop - understand async callback flow

  3. Reference SDK headers directly using the universal pattern


🔍 How to Find What You Need

"My code won't compile"

→ Build Errors Guide

"Authentication times out"

→ Windows Message Loop

"Callbacks never fire"

→ Windows Message Loop

"Abstract class error"

→ Interface Methods

"How do I implement [feature]?"

→ SDK Architecture Pattern

"How do I join a meeting?"

→ Authentication Pattern

"How do I capture video?"

→ Raw Video Capture

"What error code means what?"

→ Common Issues - Comprehensive error code tables (SDKERR, AUTHRET, Login, BO, Phone, OBF)

"How do I use breakout rooms?"

→ Breakout Rooms Guide

"How does the SDK work?"

→ SDK Architecture Pattern

"How do I navigate to a specific controller/feature?"

→ Singleton Hierarchy

"How do I send/receive chat messages?"

→ Chat Guide

"How do I use live transcription?"

→ Captions & Transcription Guide

"How do I record locally?"

→ Local Recording Guide

"How do I capture screen share?"

→ Share Raw Data Capture


📝 Document Version

All documents are based on Zoom Windows Meeting SDK v6.7.2.26830.

Different SDK versions may have:

  • Different required callback methods

  • Different error codes

  • Different API behavior

If using a different version, use grep "= 0" SDK/x64/h/*.h to verify required methods.


Remember: The SDK Architecture Pattern is the fastest way to understand how the Windows Meeting SDK fits together. Read it first if you are debugging custom UI or event flow issues.

Operations

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

Files

troubleshooting/common-issues.md

Common Issues & Troubleshooting Checklist

Quick Diagnostic Workflow

Build Issues vs Runtime Issues

Build issues = Problems during compilation (Visual Studio errors) Runtime issues = Problems when running the executable (authentication, joining meetings)

Use this flowchart:

Does your code compile?
├─ NO  → See "Build Issues Checklist" below
└─ YES → Does authentication succeed?
          ├─ NO  → See "Authentication Issues" below
          └─ YES → Does meeting join succeed?
                   ├─ NO  → See "Meeting Join Issues" below
                   └─ YES → Does video capture work?
                            ├─ NO  → See "Video Capture Issues" below
                            └─ YES → You're all set!

Build Issues Checklist

✅ Compiler Errors with uint32_t, AudioType, or YUVRawDataI420

Symptoms:

  • Error C2061: syntax error: identifier 'uint32_t'

  • Error C3646: 'GetAudioJoinType': unknown override specifier

  • Error: use of undefined type 'YUVRawDataI420'

Checklist:

  • [ ] #include <windows.h> is the FIRST include in every file

  • [ ] #include <cstdint> is right after <windows.h> in every file

  • [ ] meeting_audio_interface.h is included BEFORE meeting_participants_ctrl_interface.h

  • [ ] zoom_sdk_raw_data_def.h is included when using raw video data

Fix: See Build Errors Guide for detailed solutions.


✅ "Cannot Instantiate Abstract Class" Error

Symptoms:

  • Error C2259: 'AuthServiceEventListener': cannot instantiate abstract class

  • note: due to following members: 'void IAuthServiceEvent::onNotificationServiceStatus(...)': is abstract

Checklist:

  • [ ] Implemented ALL pure virtual methods from IAuthServiceEvent (6 methods)

  • [ ] Implemented ALL pure virtual methods from IMeetingServiceEvent (9 methods)

  • [ ] Included WIN32-conditional methods (even though they're in #if defined(WIN32))

  • [ ] Used override keyword to catch signature mismatches

  • [ ] Verified method signatures match SDK headers exactly

Fix: See Interface Methods Guide for complete method lists.


✅ Linker Errors

Symptoms:

  • LNK2019: unresolved external symbol

  • Error: Cannot open file 'sdk.lib'

Checklist:

  • [ ] Added SDK library directory to Project Properties → Linker → General → Additional Library Directories

    • $(SolutionDir)SDK\x64\lib

  • [ ] Added sdk.lib to Project Properties → Linker → Input → Additional Dependencies

  • [ ] Verified SDK architecture matches project architecture (both x64)

  • [ ] SDK DLL (sdk.dll) is in the same directory as the executable or in PATH

Fix:

  1. Right-click project → Properties

  2. Configuration: All Configurations, Platform: x64

  3. Linker → General → Additional Library Directories: Add $(SolutionDir)SDK\x64\lib

  4. Linker → Input → Additional Dependencies: Add sdk.lib

  5. Copy SDK\x64\bin\sdk.dll to your output directory


Runtime Issues

✅ Authentication Timeout (CRITICAL!)

Symptoms:

  • "Still waiting..." messages keep printing

  • "ERROR: Authentication timeout after 30 seconds"

  • onAuthenticationReturn() callback NEVER fires

Root Cause: 99% of the time, this is a missing Windows message loop, NOT a JWT token issue!

Checklist:

  • [ ] Added PeekMessage() loop during authentication wait

  • [ ] Added PeekMessage() loop in main event loop

  • [ ] Using PM_REMOVE flag with PeekMessage()

  • [ ] Calling TranslateMessage() and DispatchMessage() for each message

Fix: See Windows Message Loop Guide for complete solution.

Quick test: Add this minimal message loop:

while (!g_authenticated) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

If onAuthenticationReturn() suddenly fires, you confirmed the issue was the message loop.


✅ Authentication Fails with Error Code

Symptoms:

  • onAuthenticationReturn() fires but with non-success code

  • "Authentication failed: [error code]"

Authentication Error Codes:

CodeEnum ValueMeaningSolution
0AUTHRET_SUCCESS✅ SuccessN/A
1AUTHRET_KEYORSECRETEMPTYJWT token or app secret is emptyVerify JWT token string is not empty
2AUTHRET_JWTTOKENWRONGInvalid JWT token format or signatureRegenerate JWT token, verify app credentials
3AUTHRET_OVERTIMEJWT token expiredRegenerate JWT with fresh timestamp
4AUTHRET_NETWORKISSUENetwork connection problemCheck firewall, proxy settings, internet connection
16AUTHRET_CLIENT_INCOMPATIBLESDK version incompatible with Zoom serviceUpdate SDK to latest version

Checklist:

  • [ ] JWT token is correctly formatted (3 parts separated by dots)

  • [ ] JWT token was generated within the last hour

  • [ ] App credentials (SDK Key/Secret) match JWT token generation

  • [ ] System clock is accurate (JWT validation is time-sensitive)

  • [ ] Not behind a firewall blocking Zoom domains (*.zoom.us, *.zoomgov.com)

How to regenerate JWT token:

// Node.js example
const jwt = require('jsonwebtoken');
const token = jwt.sign(
  {
    appKey: 'YOUR_SDK_KEY',
    iat: Math.floor(Date.now() / 1000),
    exp: Math.floor(Date.now() / 1000) + 7200,  // 2 hours
    tokenExp: Math.floor(Date.now() / 1000) + 7200
  },
  'YOUR_SDK_SECRET'
);

✅ Meeting Join Fails

Symptoms:

  • onMeetingStatusChanged() fires with MEETING_STATUS_FAILED

  • "Join meeting failed: [error code]"

Meeting Error Codes:

CodeEnum ValueMeaningSolution
0MEETING_SUCCESS✅ SuccessN/A
1MEETING_FAIL_NETWORK_ERRNetwork errorCheck internet connection
2MEETING_FAIL_RECONNECT_ERRReconnection failedRetry joining
3MEETING_FAIL_MMR_ERRMulti-media router errorContact Zoom support
4MEETING_FAIL_PASSWORD_ERRWrong meeting passwordVerify password
5MEETING_FAIL_SESSION_ERRInvalid meeting sessionVerify meeting number
6MEETING_FAIL_MEETING_OVERMeeting has endedJoin a different meeting
7MEETING_FAIL_MEETING_NOT_STARTMeeting hasn't startedWait for host to start
8MEETING_FAIL_MEETING_NOT_EXISTInvalid meeting numberVerify meeting number
9MEETING_FAIL_MEETING_USER_FULLMeeting at capacityWait for slot or use livestream
10MEETING_FAIL_CLIENT_INCOMPATIBLESDK version incompatibleUpdate SDK

Checklist:

  • [ ] Meeting number is correct (10-11 digits)

  • [ ] Meeting password is correct (if required)

  • [ ] Authenticated successfully before joining

  • [ ] Meeting is currently active (host has started it)

  • [ ] Meeting hasn't reached capacity

  • [ ] Using SDK_UT_WITHOUT_LOGIN user type for JWT auth

Fix for common issues:

// Correct join pattern
JoinParam joinParam;
joinParam.userType = SDK_UT_WITHOUT_LOGIN;  // REQUIRED for JWT auth

JoinParam4WithoutLogin withoutLoginParam;
withoutLoginParam.meetingNumber = 1234567890;  // Your meeting number
withoutLoginParam.userName = L"Bot User";
withoutLoginParam.psw = L"meeting_password";  // Empty if no password
withoutLoginParam.vanityID = nullptr;
withoutLoginParam.customer_key = nullptr;
withoutLoginParam.webinarToken = nullptr;
withoutLoginParam.isVideoOff = false;
withoutLoginParam.isAudioOff = false;

joinParam.param.withoutloginuserJoin = withoutLoginParam;
meetingService->Join(joinParam);

✅ Callbacks Not Firing

Symptoms:

  • SetEvent() called but callbacks never execute

  • Authentication/meeting status changes but no output

Checklist:

  • [ ] Windows message loop is running (see Authentication Timeout above)

  • [ ] Event listener pointer is valid (not deleted prematurely)

  • [ ] Event listener is set BEFORE calling SDK methods

  • [ ] Using new to allocate listener (SDK manages lifecycle)

Fix:

// CORRECT: Set listener before SDK actions
AuthServiceEventListener* authListener = new AuthServiceEventListener(&OnAuthComplete);
authService->SetEvent(authListener);
authService->SDKAuth(authContext);  // Now callbacks will work

// WRONG: Set listener after
authService->SDKAuth(authContext);
authService->SetEvent(authListener);  // Too late!

Video Capture Issues

✅ Raw Video Data Not Received

Symptoms:

  • onRawDataFrameReceived() never fires

  • onRawDataStatusChanged() fires but no frames

Checklist:

  • [ ] Called StartRawRecording() after joining meeting

  • [ ] Subscribed to video streams using Subscribe(userId, Raw_Video_On)

  • [ ] Implemented IZoomSDKRendererDelegate interface correctly

  • [ ] Created raw data helper: CreateRawdataRenderer()

  • [ ] Set renderer delegate: setRawDataResolution(...) and subscribe(...)

Fix: See Raw Video Capture Guide for complete workflow.

Quick test:

// After successfully joining meeting
IMeetingRecordingController* recordingCtrl = meetingService->GetMeetingRecordingController();
recordingCtrl->StartRawRecording();

IZoomSDKVideoSource* videoSource = rawDataHelper->GetRawdataVideoSourceHelper();
videoSource->subscribe(userId, Raw_Video_On);

✅ Video Data Format Issues

Symptoms:

  • Receiving frames but video looks corrupted

  • Wrong frame size or color

Checklist:

  • [ ] Using YUV420 (I420) format, not RGB

  • [ ] Buffer size is width * height * 1.5 bytes (not width * height * 3)

  • [ ] Y plane: width * height bytes

  • [ ] U plane: (width/2) * (height/2) bytes

  • [ ] V plane: (width/2) * (height/2) bytes

  • [ ] Rotation is handled correctly (0°, 90°, 180°, 270°)

YUV420 Layout:

Width: 1920, Height: 1080
Total bytes: 1920 * 1080 * 1.5 = 3,110,400 bytes

Y plane: [0 to 2,073,599]       (1920 * 1080 bytes)
U plane: [2,073,600 to 2,592,639]  (960 * 540 bytes)
V plane: [2,592,640 to 3,110,399]  (960 * 540 bytes)

Network & Firewall Issues

✅ SDK Network Requirements

Symptoms:

  • AUTHRET_NETWORKISSUE error code

  • MEETING_FAIL_NETWORK_ERR error code

  • Timeouts during initialization

Required Firewall Rules:

  • [ ] Allow outbound HTTPS (port 443) to *.zoom.us

  • [ ] Allow outbound HTTPS (port 443) to *.zoomgov.com (for government)

  • [ ] Allow UDP ports 8801-8810 for media

  • [ ] Not behind a proxy requiring authentication (or proxy configured)

How to test connectivity:

# Test DNS resolution
ping zoom.us
ping us01web.zoom.us

# Test HTTPS connectivity
curl https://zoom.us
curl https://us01web.zoom.us

Proxy configuration (if required):

InitParam initParam;
initParam.strWebDomain = L"https://zoom.us";
// Add proxy settings if needed
// initParam.proxy = ...;

General Debugging Tips

Enable SDK Logging
InitParam initParam;
initParam.enableLogByDefault = true;  // Enable logs
initParam.enableGenerateDump = true;   // Enable crash dumps

Logs location: %APPDATA%\Zoom\logs\ or C:\Users\[username]\AppData\Roaming\Zoom\logs\

Add Debug Output to Callbacks
void AuthServiceEventListener::onAuthenticationReturn(AuthResult ret) {
    std::cout << "[DEBUG] onAuthenticationReturn called! Code: " << ret << std::endl;
    // Your logic here
}
Use Windows Debugger

Set breakpoints in callback methods to verify they're being called:

  • onAuthenticationReturn()

  • onMeetingStatusChanged()

If breakpoints never hit → Message loop issue If breakpoints hit but code is wrong → Logic issue

Verify SDK Version

Check SDK/x64/version.txt or sdk.dll properties → Details tab

Different versions have different:

  • Required callback methods

  • Error codes

  • API behavior

This guide is for SDK v6.7.2.26830.


"If You See X, Do Y" Quick Reference

You SeeDo This
uint32_t errorAdd #include <cstdint> after <windows.h>
AudioType errorInclude meeting_audio_interface.h before meeting_participants_ctrl_interface.h
YUVRawDataI420 errorInclude zoom_sdk_raw_data_def.h
Abstract class errorImplement ALL virtual methods (see Interface Methods Guide)
Authentication timeoutAdd Windows message loop (see Message Loop Guide)
AUTHRET_JWTTOKENWRONGRegenerate JWT token with correct app credentials
AUTHRET_OVERTIMEJWT token expired, generate a fresh one
MEETING_FAIL_PASSWORD_ERRWrong meeting password or no password provided
MEETING_FAIL_MEETING_NOT_EXISTInvalid meeting number, verify 10-11 digits
Callbacks not firingAdd Windows message loop, verify SetEvent() called first
No video framesCall StartRawRecording() and Subscribe() after joining

Complete SDK Error Code Reference

This section provides comprehensive error code tables from official Zoom documentation.

Global SDK Error Codes (SDKERR_*)
CodeNameDescription
0SDKERR_SUCCESSSuccess
1SDKERR_NO_IMPLThis feature is currently not available
2SDKERR_WRONG_USEAGEIncorrect usage of the feature
3SDKERR_INVALID_PARAMETERWrong parameter
4SDKERR_MODULE_LOAD_FAILEDLoading module failed
5SDKERR_MEMORY_FAILEDNo memory allocated
6SDKERR_SERVICE_FAILEDInternal service error
7SDKERR_UNINITIALIZESDK is not initialized before use
8SDKERR_UNAUTHENTICATIONSDK is not authorized before use
9SDKERR_NORECORDINGINPROCESSNo recording is in progress
10SDKERR_TRANSCODER_NOFOUNDTranscoder module is not found
11SDKERR_VIDEO_NOTREADYThe video service is not ready
12SDKERR_NO_PERMISSIONNo permission
13SDKERR_UNKNOWNUnknown error
14SDKERR_OTHER_SDK_INSTANCE_RUNNINGAnother SDK instance is in progress
15SDKERR_INTERNAL_ERRORSDK internal error
16SDKERR_NO_AUDIODEVICE_ISFOUNDNo audio device is found
17SDKERR_NO_VIDEODEVICE_ISFOUNDNo video device is found
18SDKERR_TOO_FREQUENT_CALLAPI calls too frequent
19SDKERR_FAIL_ASSIGN_USER_PRIVILEGEUser cannot be assigned with the new privilege
20SDKERR_MEETING_DONT_SUPPORT_FEATUREThe current meeting does not support the request feature
21SDKERR_MEETING_NOT_SHARE_SENDERThe current user is not the presenter
22SDKERR_MEETING_YOU_HAVE_NO_SHAREThere is no sharing
23SDKERR_MEETING_VIEWTYPE_PARAMETER_IS_WRONGIncorrect ViewType parameters
24SDKERR_MEETING_ANNOTATION_IS_OFFAnnotation is disabled
25SDKERR_SETTING_OS_DONT_SUPPORTCurrent OS doesn't support the setting
26SDKERR_EMAIL_LOGIN_IS_DISABLEDEmail login is disabled
27SDKERR_HARDWARE_NOT_MEET_FOR_VBComputer doesn't meet minimum requirements for virtual background
28SDKERR_NEED_USER_CONFIRM_RECORD_DISCLAIMERNeed to process recording disclaimer
29SDKERR_NO_SHARE_DATAThere is no raw data from sharing
30SDKERR_SHARE_CANNOT_SUBSCRIBE_MYSELFCannot subscribe to my own stream
31SDKERR_NOT_IN_MEETINGNot in the meeting
Authentication Error Codes (AUTHRET_*)
CodeNameDescriptionSolution
0AUTHRET_SUCCESSAuthentication successN/A
1AUTHRET_KEYORSECRETEMPTYSDK key or secret is emptyVerify JWT token string is not empty
2AUTHRET_KEYORSECRETWRONGSDK key or secret is incorrectCheck app credentials match
3AUTHRET_ACCOUNTNOTSUPPORTAccount does not support SDKVerify account has SDK access
4AUTHRET_ACCOUNTNOTENABLESDKAccount does not have SDK enabledEnable SDK for account
5AUTHRET_UNKNOWNUnknown errorCheck logs
6AUTHRET_SERVICE_BUSYService is busyRetry later
7AUTHRET_NONEInitial statusN/A
8AUTHRET_OVERTIMETimeoutCheck network, retry
9AUTHRET_NETWORKISSUENetwork issuesCheck firewall/proxy
10AUTHRET_CLIENT_INCOMPATIBLEAccount does not support this SDK versionUpdate SDK
11AUTHRET_JWTTOKENWRONGJWT token is wrongRegenerate JWT with correct credentials
Login Error Codes (LoginFail_*)
CodeNameDescription
0LoginFail_NoneInitial status
1LoginFail_EmailLoginDisableEmail login is disabled
2LoginFail_UserNotExistUser does not exist
3LoginFail_WrongPasswordIncorrect password
4LoginFail_AccountLockedAccount is locked
5LoginFail_SDKNeedUpdateSDK version is unsupported
6LoginFail_TooManyFailedAttemptsToo many failed attempts
7LoginFail_SMSCodeErrorSMS verification code error
8LoginFail_SMSCodeExpiredSMS verification code expired
9LoginFail_PhoneNumberFormatInValidPhone number format invalid
10LoginFail_LoginTokenInvalidLogin token is invalid
11LoginFail_UserDisagreeLoginDisclaimerUser disagreed login disclaimer
12LoginFail_Mfa_RequiredMFA is required
13LoginFail_Need_Bitrthday_askNeed to provide DOB information
100LoginFail_OtherIssueOther issue
Breakout Room Error Codes (BOControllerError_*)
CodeNameDescription
0BOControllerError_NULL_POINTERBO controller is null, SDK not initialized
1BOControllerError_WRONG_CURRENT_STATUSIncorrect current status
2BOControllerError_TOKEN_NOT_READYToken is not ready
3BOControllerError_NO_PRIVILEGENo privilege
4BOControllerError_BO_LIST_IS_UPLOADINGBO list is uploading
5BOControllerError_UPLOAD_FAILBO list upload failed
6BOControllerError_NO_ONE_HAS_BEEN_ASSIGNEDNo user assigned to BO
100BOControllerError_UNKNOWNUnknown error
Phone Error Codes (PhoneFailedReason_*)
CodeNameDescription
0PhoneFailedReason_NoneInitial status
1PhoneFailedReason_BusyTelephone service is busy
2PhoneFailedReason_Not_AvailableService not available
3PhoneFailedReason_User_HangupUser hung up
4PhoneFailedReason_Other_FailOther failure
5PhoneFailedReason_No_AnswerNo answer
6PhoneFailedReason_Block_No_HostCall-out blocked before host joins
7PhoneFailedReason_Block_High_RateBlocked due to high cost
8PhoneFailedReason_Block_Too_FrequentBlocked due to high frequency
OBF/Anonymous Join Error Codes (2026 Enforcement)

Important Dates:

  • February 7, 2026: OBF tokens must be valid (well-formed, not expired)

  • March 2, 2026: Anonymous joins no longer allowed - must provide valid OBF/ZAK token

CodeNameDescription
503MEETING_FAIL_USER_LEVEL_TOKEN_NOT_HAVE_HOST_ZAK_OBFTo access raw data with privilege token, must also provide OBF token authorized by host
504MEETING_FAIL_APP_CAN_NOT_ANONYMOUS_JOIN_MEETINGAnonymous joins not allowed. Provide ZAK or OBF token
6603RESULT_UNKNOWN_ERRORAccount is blocking your Meeting SDK application
General Network/Server Error Codes
CodeDescriptionSolution
5Failed to create data connectionCheck network connection
15Failed to send create meeting commandCheck HTTP request configuration
1002Wrong user passwordCheck password
1019Web login locked after 6 failed attemptsContact support to reactivate
3023SDK authentication failure: invalid SDK key/secretCheck credentials
3024Account does not support using SDKVerify license type
5003No response from server in 30 secondsRetry later
4502Invalid recurring meeting - no meeting occurrenceVerify meeting recurrence
5004DNS resolve failureCheck network adaptor
102006Conference does not existVerify meeting number
102011Client version lower than minimum requiredDownload latest SDK
102012Client version higher than maximum allowedDownload latest SDK
102014Conference token expiredGet new token
103008Server is too busyRetry later
103024Account does not support requested featureVerify account features
103025Account does not support call outVerify call out feature
103037Too many pending requestsReduce request frequency
103039Account is in blacklistContact support
102004/103001Conference already existsUse different meeting number
102010/103006Attendee limit reachedContact sales for more attendees
102015/103011Conference is lockedContact host to unlock
102016/103014Account restrictedContact support

File Signing Error (105035)

Symptom: Error Code 105035 when running the SDK

Root Cause: Re-signing or adding new signatures to protected SDK files

Protected Files (DO NOT re-sign):

  • CptControl.exe

  • CptHost.exe

  • CptInstall.exe

  • CptService.exe

  • CptShare.dll

  • zzhost.dll

  • zzplugin.dll

  • aomhost64.exe

Solution: Skip signing these files during your build/deployment process. If error persists without re-signing, visit the Zoom Developer Forum.


Still Having Issues?

  1. Check SDK logs: %APPDATA%\Zoom\logs\

  2. Enable debug output: Add std::cout to all callbacks

  3. Verify SDK version: Different versions have different requirements

  4. Review working example: See complete working code in Authentication Pattern

  5. Check Zoom Developer Forums: https://devforum.zoom.us/



Last Updated: Based on Zoom Windows Meeting SDK v6.7.2.26830

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 a command-line tool

Security

What our scanner noticed· Low risk

  • Instructions that use the network

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/windows · 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-windows.zip