Setting the file. One moment.
Subchapter 114.19
use-cases/ai-companion-integration.mdMarkdown10 KBView on GitHub
Integrate with Zoom AI Companion for meeting summaries, transcripts, and AI-powered features.
Zoom AI Companion provides AI-powered features including:
References
App Types| Feature | API Access | Method |
|---|---|---|
| Meeting Summaries | ✅ Yes | REST API |
| Meeting Transcripts | ✅ Yes | REST API (Cloud Recording) |
| Real-Time Transcripts | ✅ Yes | RTMS SDK |
| AI Companion Panel | ⚠️ Limited | Archive only |
| Conversation Archives | ✅ Yes | REST API |
| AI Controls in Meeting | ✅ Yes | Meeting SDK |
| Use Case | Skills |
|---|---|
| AI-agent search and tool invocation over Zoom meeting context | zoom-mcp |
| Get meeting summaries after meeting | zoom-rest-api |
| Get meeting transcripts in deterministic backend pipeline | zoom-rest-api + zoom-webhooks |
| Real-time transcript streaming | rtms |
| Control AI features in embedded meetings | zoom-meeting-sdk |
GET /v2/meetings/{meetingUUID}/meeting_summary// Get meeting summary
async function getMeetingSummary(meetingUUID) {
// Double-encode UUID if it contains / or //
const encodedUUID = meetingUUID.startsWith('/')
? encodeURIComponent(encodeURIComponent(meetingUUID))
: encodeURIComponent(meetingUUID);
const response = await fetch(
`https://api.zoom.us/v2/meetings/${encodedUUID}/meeting_summary`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
return response.json();
}
// Response example
{
"meeting_uuid": "abc123...",
"meeting_id": 12345678901,
"meeting_topic": "Weekly Team Sync",
"meeting_start_time": "2024-01-15T10:00:00Z",
"meeting_end_time": "2024-01-15T10:45:00Z",
"summary_start_time": "2024-01-15T10:00:00Z",
"summary_end_time": "2024-01-15T10:45:00Z",
"summary_content": {
"summary": "The team discussed Q1 roadmap priorities...",
"next_steps": [
"John to finalize design specs by Friday",
"Sarah to schedule customer interviews"
],
"keywords": ["roadmap", "Q1", "design", "customers"]
}
}/Transcripts are accessed via the Cloud Recording API.
GET /v2/meetings/{meetingId}/recordingsasync function getMeetingTranscript(meetingId) {
const response = await fetch(
`https://api.zoom.us/v2/meetings/${meetingId}/recordings`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
const data = await response.json();
// Find transcript files
const transcriptFiles = data.recording_files.filter(
file => file.file_type === 'TRANSCRIPT' ||
file.file_type === 'CC' ||
file.file_type === 'SUMMARY'
);
// Download transcript
for (const file of transcriptFiles) {
const transcriptResponse = await fetch(file.download_url, {
headers: { 'Authorization': `Bearer ${accessToken}` }
});
if (file.file_extension === 'VTT') {
const vttContent = await transcriptResponse.text();
console.log('VTT Transcript:', vttContent);
} else if (file.file_extension === 'JSON') {
const jsonContent = await transcriptResponse.json();
console.log('JSON Transcript:', jsonContent);
}
}
return transcriptFiles;
}| File Type | Extension | Description |
|---|---|---|
TRANSCRIPT | VTT, JSON | Full meeting transcript |
CC | VTT | Closed captions |
SUMMARY | JSON | AI-generated summary |
Listen for when AI content is ready:
// Webhook handler
app.post('/webhook', (req, res) => {
const { event, payload } = req.body;
switch (event) {
case 'recording.transcript_completed':
// Transcript is ready
console.log('Transcript ready for meeting:', payload.object.uuid);
fetchAndStoreTranscript(payload.object.uuid);
break;
case 'recording.completed':
// Recording processing complete (may include summary)
console.log('Recording ready:', payload.object.uuid);
break;
case 'meeting.ended':
// Meeting ended - summary will be generated soon
console.log('Meeting ended:', payload.object.uuid);
break;
}
res.sendStatus(200);
});For live transcript streaming during meetings, use RTMS SDK.
import { RTMSClient } from "@zoom/rtms";
const client = new RTMSClient({
clientId: process.env.ZOOM_CLIENT_ID,
clientSecret: process.env.ZOOM_CLIENT_SECRET,
secretToken: process.env.ZOOM_SECRET_TOKEN
});
// Connect to meeting
await client.joinMeeting({
meetingUuid: meetingUUID,
streamId: streamId,
serverUrl: "wss://rtms.zoom.us"
});
// Listen for transcript events
client.on('transcript', (data) => {
console.log(`[${data.speakerName}]: ${data.text}`);
// Process real-time transcript
// - Send to AI for sentiment analysis
// - Display live captions
// - Log for compliance
});See rtms skill for full RTMS documentation.
Control AI Companion features in embedded meetings.
// Check if AI Companion is available
const aiCompanionStatus = ZoomMtg.getAICompanionStatus();
// AI Companion features are controlled by meeting settings
// The SDK respects account/meeting-level AI Companion settingsUse InMeetingAICompanionController:
// Android example
InMeetingAICompanionController aiController =
ZoomSDK.getInstance().getInMeetingService().getInMeetingAICompanionController();
// Check AI Companion status
boolean isEnabled = aiController.isAICompanionEnabled();
// Get available features
AICompanionFeature[] features = aiController.getAvailableFeatures();
// Features: QUERY, SMART_SUMMARY, SMART_RECORDING// iOS example
let aiController = MobileRTC.shared().getMeetingService()?.getInMeetingAICompanionController()
if let isEnabled = aiController?.isAICompanionEnabled() {
print("AI Companion enabled: \(isEnabled)")
}| Feature | Description |
|---|---|
QUERY | Ask AI Companion questions |
SMART_SUMMARY | Meeting summary generation |
SMART_RECORDING | Smart recording highlights |
Archive AI Companion panel conversations (new September 2025).
// Get conversation archives
async function getConversationArchives(userId) {
const response = await fetch(
`https://api.zoom.us/v2/users/${userId}/conversation_archive`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
return response.json();
}// 1. Listen for meeting end
webhooks.on('meeting.ended', async (meeting) => {
// 2. Wait for transcript to be ready (or use webhook)
await delay(60000); // Processing time varies
// 3. Fetch summary
const summary = await getMeetingSummary(meeting.uuid);
// 4. Store or distribute
await saveSummaryToDatabase(summary);
await sendSummaryToParticipants(meeting.participants, summary);
});// Using RTMS for live processing
rtmsClient.on('transcript', async (data) => {
// Send to your AI service for analysis
const sentiment = await analyzesentiment(data.text);
const actionItems = await extractActionItems(data.text);
// Update live dashboard
updateDashboard({ sentiment, actionItems });
});// Archive all AI-generated content
async function archiveMeetingAIContent(meetingId) {
const [summary, transcript, archives] = await Promise.all([
getMeetingSummary(meetingId),
getMeetingTranscript(meetingId),
getConversationArchives(meetingId)
]);
await complianceStore.save({
meetingId,
summary,
transcript,
aiConversations: archives,
archivedAt: new Date()
});
}| Scope | Description |
|---|---|
meeting:read:admin | Read meeting data including summaries |
recording:read:admin | Access recordings and transcripts |
user:read:admin | Read user data for archives |
| Limitation | Notes |
|---|---|
| AI Companion Panel | Most panel features NOT available via API |
| Admin access | Some endpoints require admin role |
| Processing time | Summaries/transcripts not instant after meeting |
| RTMS approval | Real-time access requires Zoom approval |
| Bot restrictions | Meeting SDK does NOT support bots (use RTMS) |