Most developers building meeting transcription features get stuck debugging Zoom’s inconsistent APIs and rebuilding infrastructure for each meeting platform. This guide compares technical approaches to capturing Zoom transcripts — from Zoom SDKs to cross-platform meeting bot solutions — so you can choose the method that works best for your app.
What you’ll learn:
Who it’s for: Software engineers, product managers, and technical leads building SaaS applications that need meeting transcript functionality. Whether you’re adding CRM intelligence, building training platforms, or developing collaboration tools, this article helps you evaluate transcript capture methods based on development complexity and scalability requirements.
Building meeting transcription features shouldn’t require a six-month engineering project. Yet most developers who start with Zoom’s APIs find themselves debugging missing transcript files, managing separate integrations for each meeting platform, and scaling infrastructure they never wanted to build in the first place.
There are better approaches. This guide walks through seven methods for getting Zoom transcripts programmatically, from Zoom’s native options to meeting bot APIs that work across platforms. We’ll cover what actually works in production, what breaks at scale, and how to choose the right approach for your application’s needs.
Let’s start with the most straightforward approach: Zoom’s built-in transcription feature. This works fine for personal use, but understanding its limitations helps explain why developers need more sophisticated solutions.
To get transcriptions directly from Zoom, you need a Pro, Business, Education, and Enterprise plan. The most basic workflow would be to:
If you’re downloading meeting transcripts for personal use, then this would be manageable. But programmatic transcriptions are what you’re looking for if you’re experimenting and building products on top of user transcripts. Getting transcripts with an API means you get to work around limitations with:
If you want to stick within the Zoom platform, you have the option of using the Zoom Cloud Recording API. The Zoom Cloud Recording API lets you programmatically access completed meeting recordings — including transcripts — when they’re available. You would:
recording.completed
event to get notified when recordings are processed (or use recording.transcript_completed
for transcript-specific notifications)GET /users/{userId}/recordings
or GET /meetings/{meetingId}/recordings
) to get download URLs for all recording filesfile_type: "TRANSCRIPT"
and recording_type: "audio_transcript"
in the responseHere’s how you would subscribe to the webhook event to fetch recordings and download them.
Using the Zoom Cloud Recording API to get transcripts programmatically
// 1. Set up webhook to receive notifications
app.post('/zoom-webhook', async (req, res) => {
const { event, payload } = req.body;
if (event === 'recording.completed') {
const meetingId = payload.object.uuid || payload.object.id;
await processRecording(meetingId);
}
res.status(200).send('OK');
});
// 2. Fetch recordings and filter for transcripts
async function processRecording(meetingId) {
const response = await fetch(
`https://api.zoom.us/v2/meetings/${meetingId}/recordings`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
const data = await response.json();
// Filter for transcript files
const transcripts = data.recording_files?.filter(
file => file.file_type === 'TRANSCRIPT'
) || [];
// Download each transcript
for (const transcript of transcripts) {
const content = await fetch(transcript.download_url, {
headers: { 'Authorization': `Bearer ${accessToken}` }
}).then(r => r.text());
// Store transcript content
await storeTranscript(meetingId, content);
}
}
The Zoom Cloud Recording API isn’t a go-to choice for everyone, though. The Zoom Cloud Recording API works fine if you’re building tools for people who control their own meeting environments. This could be a personal productivity tool that you’re vibe coding or an internal company tool where an IT team controls all meeting accounts and host settings.
But if you’re building customer-facing SaaS or products that serve multiple organizations, then you’re going to be limited by the Cloud Recording API’s:
When Zoom’s Cloud Recording API isn’t sufficient, developers typically turn to one of these approaches:
Zoom’s Real-Time Media Streams (RTMS) provides WebSocket-based access to live meeting transcripts as they happen. You register a Zoom General App and connect to meeting streams via WebSocket. Transcript events arrive with speaker identification and timestamps as participants speak, delivering transcription data with minimal latency.
Pros:
Cons:
Building a custom Zoom meeting bot involves using the Zoom Meeting SDK (primarily Linux version for headless bots) to programmatically join meetings and capture raw audio/video streams. You would need to send processed audio to transcription APIs like AssemblyAI, Deepgram, or OpenAI Whisper since the Zoom SDK doesn’t provide built-in transcription for bot-captured audio. The process for building a custom meeting bot requires significant infrastructure setup compared to other methods.
Pros:
Cons:
You can use transcription APIs like AssemblyAI, Deepgram, or OpenAI Whisper to process audio from multiple Zoom recording sources. These transcription providers work with the Zoom RTMS API, meeting bots developed with the Zoom Meeting SDK, or desktop recordings and web-captured audio.
Pros:
Cons:
Standalone meeting tools join meetings as AI assistants, automatically record conversations, and provide webhook notifications or API access when transcripts are ready. You would integrate with their APIs to pull transcript data into your application.
Pros:
Cons:
Instead of building a custom meeting bot yourself, you can use the Nylas API to send an AI meeting bot to your Zoom meetings and retrieve audio and video files. With Nylas, developers can send meeting bots to Zoom, Teams, and Google Meet with a single API that also handles transcriptions, speaker diarization, webhooks, and calendar syncs.
Pros:
Cons:
Before you start building with the Nylas Notetaker, make sure you have:
Create a Nylas account for free to record up to 5 hours of meetings free! Start your 14-day free trial of the Nylas Notetaker to start building in our sandbox.
Set up your development environment with the necessary credentials.
Development environment setup
#Install the Nylas SDK
npm install nylas dotenv
# Create .env file
echo "NYLAS_API_KEY=your_api_key_here" > .env
echo "NYLAS_GRANT_ID=your_grant_id_here" >> .env
Import packages and initialize Nylas SDK
import Nylas from 'nylas';
import 'dotenv/config';
// Initialize the Nylas client
const nylas = new Nylas({
apiKey: process.env.NYLAS_API_KEY,
});
const grantId = process.env.NYLAS_GRANT_ID;
If you don’t already have a Grant ID, you’ll need to authenticate a user and obtain one through Nylas’s OAuth flow.
Obtain Grant ID
"41009df5-bf11-4c97-aa18-b285b5f2e386"; // Example Grant ID
Deploy a meeting bot to join and record a specific Zoom meeting.
Deploy a bot to get Zoom transcripts
// Create a notetaker for transcript capture from a Zoom meeting
async function createTranscriptBot(meetingLink, meetingTitle) {
try {
const notetaker = await nylas.notetakers.create({
identifier: grantId,
requestBody: {
meetingLink, // e.g., "https://zoom.us/j/123456789"
name: `Transcript Bot - ${meetingTitle}`,
settings: {
transcription: true, // Generate transcripts
speakerLabels: true, // Identify who said what
audioRecording: true, // Record audio for backup
videoRecording: false // Audio-only for transcripts
}
}
});
console.log(`Transcript bot created with ID: ${notetaker.data.id}`);
return notetaker.data.id;
} catch (error) {
console.error('Error creating transcript bot:', error);
}
}
// Example usage
const transcriptBotId = await createTranscriptBot(
"https://zoom.us/j/123456789",
"Sales Team Weekly Sync"
);
or
Use the Nylas Calendar Sync to automatically monitor your calendar and send a meeting bot to a Zoom meeting based on rules you configure.
Deploy a meeting bot with Calendar sync
// Set up automatic transcript bot deployment for future calendar meetings
async function setupAutoTranscription() {
try {
const calendarSync = await nylas.calendars.update({
identifier: grantId,
calendarId: "primary",
requestBody: {
// Configuration for all auto-deployed transcript bots
notetaker: {
name: "Meeting Transcript Bot",
settings: {
transcription: true, // Generate transcripts
speakerLabels: true, // Identify speakers
audioRecording: true, // Record audio
videoRecording: false // Transcript-focused
}
}
}
});
console.log('Auto-transcription configured:', calendarSync.data);
return calendarSync.data.id;
} catch (error) {
console.error('Error setting up auto-transcription:', error);
}
}
Set up webhook handling to receive and process transcripts when they’re ready.
Receive transcript data
// Webhook notifications (recommended for real-time processing)
app.post('/webhooks/notetaker', async (req, res) => {
const webhookData = req.body;
// Check for transcript availability notification
if (webhookData.type === 'notetaker.media' &&
webhookData.data.object.state === 'available') {
const { data } = webhookData;
const notetakerId = data.object.id;
const mediaUrls = data.object.media;
console.log('Transcript URL:', mediaUrls.transcript);
console.log('Recording URL (if needed):', mediaUrls.recording);
// Download and process the transcript
await processTranscript(mediaUrls.transcript, notetakerId);
}
res.status(200).send('Webhook received');
});
With programmatic access to meeting transcript data and calendar syncs, you can spin up features like:
Method | Setup complexity | Customization | Data source | Pricing model |
---|---|---|---|---|
Zoom Cloud Recording API | Medium (Needs OAuth, configured webhooks, and cloud recording enabled in a host’s Zoom account) | No customization for transcript formatting or data processing | Zoom only | Free with paid Zoom plans |
Zoom RTMS SDK | High (Needs custom WebSocket authentication, streaming protocol management, and Zoom app reviews) | High (Custom WebSocket handling for data processing, custom data storage, wide integration options) | Zoom only | Usage-based pricing |
Custom meeting bots with Zoom Meeting SDK | Very high (Needs custom server infrastructure, raw media processing, container orchestration, and Zoom app reviews) | High (Complete control over audio/video processing, UI/UX, bot appearance and behavior) | Zoom only | Usage-based pricing. Builders also take on higher costs for infrastructure development and maintenance. |
Transcription APIs | High (Custom data processing and vocabulary libraries) | Medium (Audio capture must be developed separately) | Any audio input | Usage-based pricing |
Standalone software | Low (User creates account to start using software) | Low (Locked into infrastructure and UI/UX of selected software, minimal API access for custom setups) | Any audio input | License-based pricing |
Nylas Notetaker API | Low (All bot infrastructure and partnerships with transcription APIs handled by Nylas.) | High (Integrate meeting bot infrastructurinto existing application architecture, integrations, or custom AI models.) | Zoom, Google Meet, Microsoft Teams | Usage-based pricing |
For developers building customer-facing SaaS applications, a meeting bot API gives you the most practical path to adding transcript functionality that users actually want. According to our 2025 State of Meeting Recordings report, SaaS users see the most value in meeting tools and notetakers that give them access to video and audio files, followed by transcription-based features like post-meeting summaries and speaker-labeled transcripts. Meeting bot APIs deliver both components without requiring you to build recording infrastructure from scratch.
If you’re looking to add meeting transcript functionality without the infrastructure complexity, Nylas Notetaker provides simplified meeting bot development with native calendar sync across Google, Microsoft, and other providers. You can deploy transcript bots, process structured transcript data, and integrate meeting intelligence into your application in weeks rather than months.