HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: C:/Users/fred/.codex/.tmp/plugins/plugins/zoom/skills/zoom-apps-sdk/examples/breakout-rooms.md
# Breakout Room Integration

Detect breakout rooms, track room changes, and sync state across rooms.

## Overview

When a meeting uses breakout rooms, each room gets its own meeting UUID. Your app needs to handle room transitions and optionally sync state between rooms.

## Key Concepts

| Property | Description |
|----------|-------------|
| `meetingUUID` | Unique per room (changes when moving to breakout) |
| `parentUUID` | Original meeting UUID (available in breakout rooms) |
| `onBreakoutRoomChange` | Event fired when user moves between rooms |

## Detecting Room Changes

```javascript
import zoomSdk from '@zoom/appssdk';

await zoomSdk.config({
  capabilities: [
    'getMeetingUUID', 'getMeetingContext',
    'onBreakoutRoomChange'
  ],
  version: '0.16'
});

// Get current room info
const { meetingUUID } = await zoomSdk.getMeetingUUID();
console.log('Current room UUID:', meetingUUID);

// Listen for room changes
zoomSdk.addEventListener('onBreakoutRoomChange', async (event) => {
  console.log('Room changed:', event);

  // Get new room UUID
  const { meetingUUID: newUUID } = await zoomSdk.getMeetingUUID();
  console.log('Now in room:', newUUID);

  // Re-initialize room-specific state
  await loadRoomState(newUUID);
});
```

## Cross-Room State Sync

Use your backend to sync state across rooms. The `parentUUID` links all breakout rooms to the main meeting.

```javascript
// Frontend: Register with backend on room entry
async function registerRoom() {
  const { meetingUUID } = await zoomSdk.getMeetingUUID();
  const context = await zoomSdk.getMeetingContext();

  await fetch('/api/room/register', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      roomUUID: meetingUUID,
      parentUUID: context.parentUUID || meetingUUID,
      // parentUUID is null in main room, set in breakout rooms
    })
  });
}

// Backend: Aggregate state across all rooms
app.get('/api/meeting/:parentUUID/state', async (req, res) => {
  const rooms = await db.find({ parentUUID: req.params.parentUUID });
  const aggregated = rooms.reduce((acc, room) => {
    // Merge state from all rooms
    return { ...acc, ...room.state };
  }, {});
  res.json(aggregated);
});
```

## Managing Breakout Rooms via REST API

Create and manage breakout rooms from your backend using the Zoom REST API:

```javascript
// Create breakout rooms (requires meeting:write scope)
const response = await axios.post(
  `https://api.zoom.us/v2/meetings/${meetingId}/batch_registrants`,
  {
    rooms: [
      { name: 'Room 1', participants: ['[email protected]'] },
      { name: 'Room 2', participants: ['[email protected]'] }
    ]
  },
  { headers: { 'Authorization': `Bearer ${accessToken}` } }
);
```

## Pattern: Room-Specific vs Global State

```javascript
const { meetingUUID } = await zoomSdk.getMeetingUUID();
const context = await zoomSdk.getMeetingContext();
const parentUUID = context.parentUUID || meetingUUID;

// Room-specific state (e.g., room discussion notes)
const roomState = await loadState(`room:${meetingUUID}`);

// Global state (e.g., meeting agenda visible in all rooms)
const globalState = await loadState(`meeting:${parentUUID}`);
```

## Resources

- **Breakout rooms docs**: https://developers.zoom.us/docs/zoom-apps/guides/breakout-rooms/