Build Zoom Meeting SDK App
OpenAIOfficialCreated by ZoomDistributed by OpenAI
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for developers integrating the Zoom Meeting SDK into their applications. It covers the lifecycle of a meeting integration, from initial product validation and platform selection to implementation and debugging. It emphasizes the distinction between the Meeting SDK, which is designed for human-led meetings, and other Zoom SDKs, while providing guidance on handling signatures, user identity, and meeting controls.
What it does
- Guides developers through the integration of the Zoom Meeting SDK for web, mobile, and desktop platforms.
- Provides a systematic workflow for joining and starting meetings.
- Offers troubleshooting strategies for common issues like signature generation and permission errors.
- Includes references for platform-specific implementations and AI Companion feature management.
- Helps validate meeting parameters such as meeting numbers, passwords, and ZAK tokens.
When to use it
- When you need to embed real Zoom meetings into your application.
- When you are setting up a new Zoom Meeting SDK project for web, Android, iOS, or desktop.
- When you encounter errors during the meeting join flow or signature validation.
- When you need to manage AI Companion features within an embedded meeting context.
Advantages
- Provides a clear, step-by-step path for successful SDK integration.
- Centralizes access to platform-specific documentation and troubleshooting resources.
- Helps distinguish between different Zoom SDK capabilities to ensure the right tool is used.
- Includes a dedicated signature playbook to resolve common authentication failures.
Usage examples
- “How do I start integrating the Zoom Meeting SDK for an Android app?”
- The agent will guide you through verifying your environment, choosing the default UI for initial testing, and using the Android-specific reference pointers to resolve dependencies.
- “I am getting an invalid signature error when trying to join a meeting.”
- The agent will direct you to the signature playbook to verify your SDK signature generation logic and parameter matching.
- “Can I use the Meeting SDK to build an automated AI notetaker bot?”
- The agent will clarify that the Meeting SDK is for human use cases only and recommend using rtms for automated AI processing.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/build-zoom-meeting-sdk-app/downloadUnzip 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
Use this skill when the user needs to join, start, or embed real Zoom meetings. If the user wants a fully custom non-meeting video experience, route to build-zoom-video-sdk-app.
Workflow
Confirm product fit: Meeting SDK joins real Zoom meetings; Video SDK creates custom sessions; Zoom Apps SDK runs inside the Zoom client.
Choose the target platform: web, Android, iOS, macOS, Windows, Electron, React Native, Unreal, or Linux bot.
Validate the join or start path: meeting number, password, SDK signature, role, ZAK when hosting, waiting room behavior, and user identity.
Implement the smallest join flow first, then add meeting controls, custom UI, raw data, recording, or bot behavior.
Debug by isolating signature generation, SDK version, platform permissions, meeting settings, waiting room, raw data entitlement, and network constraints.
References
Full preserved guide: references/full-guide.md
Web: web/SKILL.md
Android: android/SKILL.md
iOS: ios/SKILL.md
Windows: windows/SKILL.md
Linux bots: linux/SKILL.md
Signature playbook: references/signature-playbook.md
Troubleshooting: references/troubleshooting.md
Files
- ATTRIBUTION.mdAdded by AutoGineer884 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.6 KiB
- SKILL.md1.4 KiB
- agents/openai.yaml146 B
- references/ai-companion.md6.4 KiB
- references/android.md754 B
- references/authorization.md2.3 KiB
- references/bot-authentication.md10.5 KiB
- references/breakout-rooms.md11.8 KiB
- references/environment-variables.md1.4 KiB
- references/forum-top-questions.md3.9 KiB
- references/full-guide.md10.4 KiB
- references/ios.md919 B
- references/macos.md599 B
- references/multiple-meetings.md964 B
- references/signature-playbook.md1.4 KiB
- references/triage-intake.md1.9 KiB
- references/troubleshooting.md4.1 KiB
- references/unreal.md732 B
- references/webinars.md7.9 KiB
references/breakout-rooms.md
Breakout Rooms
Programmatically manage breakout rooms in Zoom meetings across all platforms.
Overview
Breakout rooms allow hosts to split meeting participants into smaller groups. This guide covers SDK APIs for creating, managing, and controlling breakout rooms.
Platform Support
| Platform | Support Level | Notes |
|---|---|---|
| Web SDK | Full | Complete API |
| iOS SDK | Full | Creator + Admin helpers |
| Android SDK | Full | Creator + Admin helpers |
| Windows SDK | Full | Controller interface |
| macOS SDK | Full | Controller interface |
| Linux SDK | Limited | Basic functionality only |
| Video SDK | Different | Uses "Subsessions" - not native breakout rooms |
Important: Video SDK does NOT have native breakout rooms. It uses a "Subsessions" concept requiring manual session management.
REST API: Pre-assigned Rooms
Create meetings with pre-assigned breakout rooms:
POST /v2/users/{userId}/meetings{
"topic": "Team Workshop",
"type": 2,
"settings": {
"breakout_room": {
"enable": true,
"rooms": [
{
"name": "Team Alpha",
"participants": ["[email protected]", "[email protected]"]
},
{
"name": "Team Beta",
"participants": ["[email protected]", "[email protected]"]
}
]
}
}
}Limitation: Pre-assigned rooms are NOT auto-opened. The host must manually open breakout rooms when the meeting starts. There is NO REST API to auto-open rooms.
Web SDK Implementation
Create Breakout Rooms
// Create 5 rooms with auto-generated names (Room 1, Room 2, etc.)
ZoomMtg.BreakoutRoom.createBreakoutRoom({
data: 5,
success: (response) => console.log('Rooms created:', response),
error: (error) => console.error('Error:', error)
});
// Create named rooms
ZoomMtg.BreakoutRoom.createBreakoutRoom({
data: [
{ name: 'Engineering' },
{ name: 'Design' },
{ name: 'Product' }
],
success: (response) => console.log('Rooms created:', response),
error: (error) => console.error('Error:', error)
});Get Breakout Rooms
ZoomMtg.BreakoutRoom.getBreakoutRooms({
success: (response) => {
const rooms = response.result.rooms;
rooms.forEach(room => {
console.log(`Room ID: ${room.boId}, Name: ${room.name}`);
});
},
error: (error) => console.error('Error:', error)
});Assign Participants
// Get unassigned attendees first
ZoomMtg.BreakoutRoom.getUnassignedAttendeeList({
success: (response) => {
const unassigned = response.result.unassignedAttendeeList;
console.log('Unassigned:', unassigned);
}
});
// Assign user to a room
ZoomMtg.BreakoutRoom.assignUserToBreakoutRoom({
targetRoomId: 'room-id-here',
userId: 12345678,
success: (response) => console.log('Assigned:', response),
error: (error) => console.error('Error:', error)
});Move Participants Between Rooms
ZoomMtg.BreakoutRoom.moveUserToBreakoutRoom({
targetRoomId: 'destination-room-id',
userId: 12345678,
success: (response) => console.log('Moved:', response),
error: (error) => console.error('Error:', error)
});Open Breakout Rooms
ZoomMtg.BreakoutRoom.openBreakoutRooms({
options: {
isAutoJoinRoom: false, // Let participants choose
isBackToMainSessionEnabled: true, // Allow returning to main
isTimerEnabled: true, // Enable countdown
timerDuration: 1800, // 30 minutes (seconds)
needCountDown: true, // Show countdown
waitSeconds: 60 // Wait before auto-join
},
success: (response) => console.log('Rooms opened:', response),
error: (error) => console.error('Error:', error)
});Close Breakout Rooms
ZoomMtg.BreakoutRoom.closeBreakoutRooms({
success: (response) => console.log('Rooms closed:', response),
error: (error) => console.error('Error:', error)
});Broadcast Message
ZoomMtg.BreakoutRoom.broadcast({
message: 'Please return to the main room in 2 minutes',
success: (response) => console.log('Broadcast sent:', response),
error: (error) => console.error('Error:', error)
});Check User Status
// Get current user's breakout room
ZoomMtg.BreakoutRoom.getCurrentBreakoutRoom({
success: (response) => {
const { roomId, name, attendeeStatus } = response.result;
console.log(`Current room: ${name}, Status: ${attendeeStatus}`);
}
});
// attendeeStatus values:
// 1: UNASSIGNED - Not assigned to any room
// 2: ASSIGNED_NOT_JOIN - Assigned but hasn't joined yet
// 3: IN_BO - Currently in breakout roomiOS SDK Implementation
Get Helpers
#import <MobileRTC/MobileRTC.h>
// Get meeting service
MobileRTCMeetingService *meetingService = [[MobileRTC sharedRTC] getMeetingService];
// Get breakout room creator (for creating rooms)
MobileRTCBOCreator *boCreator = [meetingService getCreatorHelper];
// Get breakout room admin (for managing rooms)
MobileRTCBOAdmin *boAdmin = [meetingService getAdminHelper];Create Rooms
// Create 3 breakout rooms
[boCreator createBreakoutRoom:3 completion:^(NSError *error) {
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
} else {
NSLog(@"Rooms created");
}
}];
// Create room with specific name
[boCreator createBreakoutRoomWithName:@"Engineering" completion:^(NSError *error) {
// Handle result
}];Manage Rooms
// Open all rooms
[boAdmin openAllRoomsCompletion:^(NSError *error) {
if (!error) {
NSLog(@"Rooms opened");
}
}];
// Assign user to room
[boAdmin assignUser:userId toRoom:roomId completion:^(NSError *error) {
if (!error) {
NSLog(@"User assigned");
}
}];
// Close all rooms
[boAdmin closeAllRoomsCompletion:^(NSError *error) {
if (!error) {
NSLog(@"Rooms closed");
}
}];Event Handling
@interface MyDelegate : NSObject <MobileRTCMeetingServiceDelegate>
@end
@implementation MyDelegate
- (void)onMeetingBreakoutRoomStatusChanged:(MobileRTCBreakoutRoomStatus)status {
switch (status) {
case MobileRTCBreakoutRoomStatusNotStarted:
NSLog(@"Breakout rooms not started");
break;
case MobileRTCBreakoutRoomStatusStarted:
NSLog(@"Breakout rooms started");
break;
case MobileRTCBreakoutRoomStatusClosed:
NSLog(@"Breakout rooms closed");
break;
}
}
@endAndroid SDK Implementation
Get Helpers
import us.zoom.sdk.ZoomSDK
val zoomSDK = ZoomSDK.getInstance()
val meetingService = zoomSDK.meetingService
val boController = meetingService?.inMeetingBreakoutRoomController
// Get creator (for creating rooms)
val creator = boController?.getCreatorHelper()
// Get admin (for managing rooms)
val admin = boController?.getAdminHelper()Create Rooms
// Create breakout rooms
val error = creator?.createBreakoutRoom(5) // Create 5 rooms
if (error == SDKError.SDKERR_SUCCESS) {
Log.d("Breakout", "Rooms created")
}
// Create room with name
creator?.createBreakoutRoomWithName("Engineering")Manage Rooms
// Open all rooms
admin?.openAllRooms()
// Assign user to room
admin?.assignUser(userId, roomId)
// Move user between rooms
admin?.assignUser(userId, newRoomId) // Removes from old room
// Broadcast message
admin?.broadcastToAll("Please return in 2 minutes")
// Close all rooms
admin?.closeAllRooms()Windows/macOS SDK Implementation
Windows (C++)
#include "meeting_breakout_rooms_interface.h"
class MyBreakoutRoomsEvent : public IMeetingBreakoutRoomsEvent {
public:
void OnBreakoutRoomsStartedNotification(const wchar_t* stBID) override {
// Handle breakout rooms started
wprintf(L"Breakout rooms started: %s\n", stBID);
}
};
// Get controller
IMeetingBreakoutRoomsController* pController =
pMeetingService->GetBreakoutRoomsController(nullptr);
// Set event handler
pController->SetEvent(new MyBreakoutRoomsEvent());
// Get list of rooms
IList<IBreakoutRoomsInfo*>* pRoomList = pController->GetBreakoutRoomsInfoList();
for (int i = 0; i < pRoomList->GetItemCount(); ++i) {
IBreakoutRoomsInfo* pRoom = pRoomList->GetItem(i);
wprintf(L"Room: %s (ID: %s)\n",
pRoom->GetBreakoutRoomName(),
pRoom->GetBID());
}
// Join a breakout room
pController->JoinBreakoutRoom(L"room-id");
// Leave breakout room
pController->LeaveBreakoutRoom();macOS (Objective-C)
#import <ZoomSDK/ZoomSDK.h>
// Get controller
ZoomSDKBreakoutRoomsController *boController =
[[ZoomSDK sharedSDK] getMeetingService] getBreakoutRoomsController];
// Join breakout room
[boController requestJoinBreakoutRoom:@"room-id"];
// Leave breakout room
[boController requestLeaveBreakoutRoom];
// Close all rooms (host only)
[boController requestCloseAllBreakoutRooms];Permissions
Host/Co-Host Restrictions
| Action | Host | Co-Host | Participant |
|---|---|---|---|
| Create breakout rooms | ✅ | ✅ | ❌ |
| Open breakout rooms | ✅ | ✅ | ❌ |
| Close breakout rooms | ✅ | ✅ | ❌ |
| Assign participants | ✅ | ✅ | ❌ |
| Move participants | ✅ | ❌ | ❌ |
| Broadcast messages | ✅ | ✅ | ❌ |
| Join any room | ✅ | ✅* | ❌ |
*Co-hosts can only join rooms assigned by host.
Limitations
Capacity Limits
| Account Type | Max Rooms | Max Participants |
|---|---|---|
| Standard | 50 rooms | 500 total |
| Large Meeting Add-on | 100 rooms | 1,000 total |
Recording Limitations
Cloud Recording: Only records the main session
Local Recording: Records only the room the recorder is in
Host cannot record breakout rooms they're not in
Cannot Auto-Open Pre-Assigned Rooms
Critical: There is NO API to auto-open pre-assigned breakout rooms. The host MUST manually open rooms when the meeting starts.
Session Timeout
If no participant remains in the main session during breakout rooms, the main session may close after timeout. Ensure at least one participant (host or bot) stays in main session.
Best Practices
1. Check Support Before Creating
ZoomMtg.BreakoutRoom.getBreakoutRoomOptions({
success: (response) => {
if (response.result.isSupportBreakoutRoom) {
// Proceed to create rooms
}
}
});2. Handle User Status
// Check before assigning
ZoomMtg.BreakoutRoom.getUserStatus({
userId: userId,
success: (response) => {
const { attendeeStatus } = response.result;
if (attendeeStatus === 3) { // IN_BO
// User already in a room - move instead of assign
}
}
});3. Error Handling
function handleBreakoutError(error) {
switch (error.method) {
case 'createBreakoutRoom':
if (error.errorMessage.includes('not support')) {
alert('Breakout rooms not enabled for this meeting');
}
break;
case 'assignUserToBreakoutRoom':
if (error.errorMessage.includes('not host')) {
alert('Only host/co-host can assign participants');
}
break;
}
}Video SDK Note
Video SDK does NOT have native breakout rooms. Instead, use "Subsessions":
Create separate Video SDK sessions
Move participants between sessions programmatically
Implement your own room management logic
See: https://developers.zoom.us/blog/build-breakout-rooms-for-video-sdk/
Resources
Web SDK Docs: https://developers.zoom.us/docs/meeting-sdk/web/
iOS SDK Docs: https://developers.zoom.us/docs/meeting-sdk/ios/
Android SDK Docs: https://developers.zoom.us/docs/meeting-sdk/android/
REST API - Meetings: https://developers.zoom.us/docs/api/rest/reference/zoom-api/methods/#tag/Meetings
Developer Forum: https://devforum.zoom.us/
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.
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 · 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 build-zoom-meeting-sdk-app.zip