This guide compares approaches developers can take to retrieve transcripts from Microsoft Teams meetings.
What you’ll learn:
Who it’s for: Platform builders who want to tap into meeting data for customer-facing SaaS applications with AI-powered user experiences.
When we think about meeting ecosystems at work, we think Microsoft Teams. With over 300 million users on the platform in 2024, Teams has become a popular platform of choice for many enterprises and Fortune 100 companies. It’s a platform known for its strong organizational permission system, keeping enterprise data safe within the larger Microsoft Office world.
But these restrictive permission models do create unique developer challenges that don’t exist with any other platform. If you’re building an application to help customers get transcriptions from Microsoft Teams meetings, then using Teams’ built-in transcription or native API isn’t the best long-term choice as more meeting audio gets processed.
We’re going to talk about a few popular methods developers can use to get Teams transcripts. From Microsoft’s native Graph API to the workarounds developers use in production, we’ll help you narrow down the best options to build with.
Microsoft Teams does provide native transcription functionality, but it’s meant to meet the needs of company policies rather than for giving developers the necessary controls to build automation at scale.
Here’s how individual Microsoft Teams users can enable recordings and transcriptions for their meetings:
A starting point for developers to work with Microsoft’s native tools for programmatic transcriptions is Microsoft’s REST API. You can use the API to retrieve meeting transcripts for scheduled meetings via your application, but you would have to build around granular permission requirements that make development a lot more complex.
Microsoft Teams is architectured around restrictive permissions, which means applications would either have to:
You would also run into a few other issues building a production-ready app:
Platform lock-in: Graph APIs only work for Teams meetings. Your customers use Zoom and Google Meet too, requiring separate integrations for each platform with different auth flows, data formats, and reliability characteristics.
Complex auth setup: Configuring permissions on Microsoft Entra ID, setting up app registration, and navigating Microsoft’s Byzantine permission model takes significant development time upfront.
Manual transcription triggers: There’s no API to start recordings programmatically. Someone has to physically click “Record” in every meeting, or your app gets nothing.
Beyond the Graph API, here are some other methods you can use:
This method involves using headless browsers using tools like Puppeteer or Selenium to join Teams meetings and extract captions directly from the web interface. You would deploy automated browser instances that navigate to meeting URLs, handle authentication flows, and parse caption elements from the page DOM. This method works well for internal tooling or specific enterprise use cases where you control meeting access.
Pros:
Cons:
With a transcription API like AssemblyAI or Deepgram, you can process audio that you capture separately to create more accurate transcripts. These APIs provide better accuracy, speaker identification, and custom language models. It’s most suitable for applications where transcription quality is the primary concern.
Pros:
Cons:
The Nylas API is a platform that manages meeting bots for you so you don’t have to take on the work of building and maintaining meeting data infrastructure yourself. Instead of dealing with workarounds and developing platform-specific solutions for capturing meeting data, Nylas gives you a single API to send bots to meetings on Microsoft Teams, Google Meet, and Zoom. The API also includes a direct integration with AssemblyAI that Nylas manages. This means you get a single cross-platform integration that also includes transcriptions, speaker diarization, and Nylas’ native calendar API. This method is best for customer-facing applications or internal applications that need reliable, high-volume transcription retrievals.
Pros:
Cons:
You’ll need to have the following before you take the Nylas Notetaker for a spin:
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
Send meeting bot to join and record a specific Microsoft Teams meeting’s video and audio.
Deploy a bot to get Microsoft Teams transcripts
// Create a notetaker for transcript capture from a Microsoft Teams meeting
async function createTranscriptBot(meetingLink, meetingTitle) {
try {
const notetaker = await nylas.notetakers.create({
identifier: grantId,
requestBody: {
meetingLink, // e.g., "https://teams.microsoft.com/l/meetup-join/..."
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://teams.microsoft.com/l/meetup-join/19%3ameeting_M2IzYzk3YTctYjg0Yi00ODE0LWFjOGQtMmQzMjkxYmZhNjdh%40thread.v2/0?context=%7b%22Tid%22%3a%2212345678-1234-1234-1234-123456789012%22%2c%22Oid%22%3a%2287654321-4321-4321-4321-210987654321%22%7d",
"Sales Team Weekly Sync"
);
or
Use the Nylas Calendar Sync to automatically monitor your calendar and send a meeting bot to a Microsoft Teams 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');
});
Once you have reliable access to meeting transcripts and calendar integration, here are the types of applications developers are shipping:
Here’s a summary of all the different methods mentioned in this article for programmatically getting Microsoft Teams transcripts.
Method | Setup complexity | Customization | Data source | Pricing model |
---|---|---|---|---|
Microsoft Graph API | High (Requires building around Microsoft Entra ID app registration, navigating Byzantine permission models, and restrictive permissions) | Low (Structured access to transcript data with timestamps and metadata only) | Microsoft Teams only | Part of Microsoft 365 subscription |
Browser automation | Very high (Requires headless browser infrastructure, authentication flows, DOM parsing logic, and ongoing maintenance for UI changes) | High (Full control over data extraction, caption processing, and real-time capture methods) | Multi-platform | Self-hosted infrastructure costs + development resources |
Transcription APIs | Medium (Custom data processing and vocabulary libraries) | Medium (Audio capture must be developed separately) | Any audio input | Usage-based pricing |
Nylas Notetaker API | Low (All bot infrastructure and partnerships with transcription APIs handled by Nylas.) | High (Integrate meeting bot infrastructure into existing application architecture, integrations, or custom AI models.) | Zoom, Google Meet, Microsoft Teams | Usage-based pricing |
Based on our experience building meeting recording and transcription infrastructure that works predictably and accurately on Microsoft Teams, here’s what we think:
Choose Graph APIs if you’re building internal tools for a single Teams organization and post-meeting access meets your requirements.
Avoid browser automation unless you’re experimenting or learning because the maintenance burden typically exceeds value in production.
Choose Transcription APIs when you need the highest accuracy and advanced NLP features on top of existing audio capture. But remember that you’ll need to pair it with another audio capture method, like using the Graph API or standalone meeting recording tool.
Choose Nylas when you need production-ready, cross-platform meeting intelligence without meeting bot infrastructure complexity. If you can’t commit to the higher technical development and maintenance costs of building your own meeting bot infrastructure, working with an API partner will help you stay focused on core product development.