A survey of knowledge workers across North America, Europe, and Australia found that individual contributors are spending an average of 20% of their work week in meetings. This number rises to 35% for team leaders.
The interactions captured during meetings are going to become non-negotiables. The same way that it’s almost unthinkable for a customer-driven organization to operate without a CRM, it’s becoming just as unrealistic to watch meeting data disappear into thin air after hitting the “Leave meeting” button.
Building secure, reliable meeting data infrastructure is hard — but that’s where an AI meeting bot API becomes a differentiator. AI meeting bots join virtual meetings automatically to record sessions and deliver accurate, diarized transcripts. But with an API, you get cross-platform compatibility and calendar integrations that help your meeting bots keep up with fluctuating schedules and recurring events. You can’t really ignore calendar invites if you’re thinking about scheduling a virtual meeting, right?
In this guide, we’ll walk through the value of recording meetings in your app with an AI meeting bot API and step-by-step integration guide with real code examples to help you get started.
Think about how many important things you can talk about in roughly 480 minutes a week. Here’s a question for product and engineering leaders: How much of that conversational value is currently being lost, and how much of that value can you reclaim to build software that meets the demand for more productive meetings?
A single cross-platform AI meeting bot API helps you speed up development for features core to your product strategy:
SaaS platforms today are under pressure to anticipate user needs, redesign user experiences, and adapt to new technologies fast. But building something truly different into your product takes more time, focus, and technical headroom than expected.
That’s why more builders are turning to APIs as accelerators. When you’re no longer weighed down by infrastructure, you have the bandwidth to challenge legacy software models and build something that moves the needle in our market.
An AI meeting bot API like the Nylas Notetaker helps you embed conversational intelligence into the core of your product. Here’s what that looks like:
A cross-platform AI meeting bot unlocks opportunities across the engineering org to become more efficient, build for impact, and ship developments faster.
If you’re building a meeting software, there are three platforms that you can’t afford to ignore: Zoom, Microsoft Teams, and Google Meet. Supporting recording and transcription capabilities across these platforms keeps your product relevant and adaptable to meet users where they are. But integrating with each presents its unique set of challenges.
Zoom is the most widely used video conferencing platform, with over 300 million daily meeting participants. It offers APIs for meeting and recording management, but there are limitations:
Teams is heavily used in enterprise environments where security and compliance are top priorities. Meeting recordings are subject to organizational policies and regulatory standards like HIPAA and GDPR. Developers working with the Microsoft Graph API face added challenges:
Google Meet, part of the Google Workspace ecosystem, is used by over 300 million monthly users — and it’s tightly tied to Google Calendar, which has over 500 million users. It’s a major opportunity, but also difficult to work with:
What does an AI meeting bot look like in action? Let’s use the Nylas Notetaker as an example. This API lets you build an AI meeting bot that joins meetings, records audio and video, while also providing accurate transcriptions.
This tutorial will walk you through how to get started with integrating a meeting recorder in your application. Here’s what you’ll need:
1. In your development environment, set an environment variable for your Nylas API key — which you’ll obtain from the Nylas dashboard.
Replace <YOUR_NYLAS_API_KEY>
with the actual key from your Nylas dashboard. You’ll also reference your grantId (the connected account’s grant ID) in API calls.
Set up your environment
# Set environment variables for reuse
export NYLAS_API_KEY="<YOUR_NYLAS_API_KEY>"
If you’re building an application where users connect their own accounts (e.g., Google, Microsoft), you’ll guide them through an OAuth 2.0 authentication flow. This process grants your application specific permissions and provides you with a grantId for that user. Follow the instructions in this guide to complete the authentication process or create a test grant in the Nylas dashboard.
You can also start an authorization request using the Nylas SDKs.
Authenticate with the API
import "dotenv/config";
import express from "express";
import Nylas from "nylas";
const config = {
clientId: process.env.NYLAS_CLIENT_ID,
callbackUri: "http://localhost:3000/oauth/exchange",
apiKey: process.env.NYLAS_API_KEY,
apiUri: process.env.NYLAS_API_URI,
};
const nylas = new Nylas({
apiKey: config.apiKey,
apiUri: config.apiUri,
});
const app = express();
const port = 3000;
// Route to initialize authentication
app.get("/nylas/auth", (req, res) => {
const authUrl = nylas.auth.urlForOAuth2({
clientId: config.clientId,
provider: "google",
redirectUri: config.callbackUri,
loginHint: "email_to_connect",
});
res.redirect(authUrl);
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
from dotenv import load_dotenv
load_dotenv()
import json
import os
from functools import wraps
from io import BytesIO
from flask import Flask, request, redirect
from nylas import Client
nylas = Client(
os.environ.get("NYLAS_CLIENT_ID"),
os.environ.get("NYLAS_API_URI")
)
REDIRECT_CLIENT_URI = 'http://localhost:9000/oauth/exchange'
flask_app = Flask(__name__)
CORS(flask_app, supports_credentials=True)
@flask_app.route("/nylas/generate-auth-url", methods=["GET"])
def build_auth_url():
auth_url = nylas.auth.url_for_oauth2(
config={
"client_id": os.environ.get("NYLAS_CLIENT_ID"),
"provider": 'google',
"redirect_uri": REDIRECT_CLIENT_URI,
"login_hint": "email_to_connect"
}
)
return redirect(auth_url)
require 'nylas'
require 'sinatra'
nylas = Nylas::Client.new(api_key: "<NYLAS_API_KEY>")
get '/nylas/auth' do
config = {
client_id: "<NYLAS_CLIENT_ID>",
provider: "google",
redirect_uri: "http://localhost:4567/oauth/exchange",
login_hint: "<email_to_connect>"
}
url = nylas.auth.url_for_oauth2(config)
redirect url
end
import java.util.*;
import static spark.Spark.*;
import com.nylas.NylasClient;
import com.nylas.models.*;
public class AuthRequest {
public static void main(String[] args) throws NylasSdkTimeoutError, NylasApiError {
NylasClient nylas = new NylasClient.Builder("<NYLAS_API_KEY>").build();
get("/nylas/auth", (request, response) -> {
List<String> scope = new ArrayList<>();
scope.add("https://www.googleapis.com/auth/userinfo.email");
UrlForAuthenticationConfig config = new UrlForAuthenticationConfig(
"<NYLAS_CLIENT_ID>",
"http://localhost:4567/oauth/exchange",
AccessType.ONLINE,
AuthProvider.GOOGLE,
Prompt.DETECT,
scope,
true,
"sQ6vFQN",
"<email_to_connect>"
);
String url = nylas.auth().urlForOAuth2(config);
response.redirect(url);
return null;
});
}
}
import com.nylas.NylasClient
import com.nylas.models.AccessType
import com.nylas.models.AuthProvider
import com.nylas.models.Prompt
import com.nylas.models.UrlForAuthenticationConfig
import spark.kotlin.Http
import spark.kotlin.ignite
fun main(args: Array<String>) {
val nylas: NylasClient = NylasClient(apiKey = "<NYLAS_API_KEY>")
val http: Http = ignite()
http.get("/nylas/auth") {
val scope = listOf("https://www.googleapis.com/auth/userinfo.email")
val config : UrlForAuthenticationConfig = UrlForAuthenticationConfig(
"<NYLAS_CLIENT_ID>",
"http://localhost:4567/oauth/exchange",
AccessType.ONLINE,
AuthProvider.GOOGLE,
Prompt.DETECT,
scope,
true,
"sQ6vFQN",
"<email_to_connect>"
)
val url = nylas.auth().urlForOAuth2(config)
response.redirect(url)
}
}
With authentication sorted, you’re ready to create your AI meeting bot! You’ll send a POST
request to the /v3/grants/<NYLAS_GRANT_ID>/notetakers
endpoint. This tells Nylas to prepare a bot to join a specific meeting.
Create your first meeting bot
curl --request POST \
--url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers" \
--header 'Accept: application/json, application/gzip' \
--header 'Authorization: Bearer <NYLAS_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"meeting_link": "<MEETING_URL>",
"name": "Nylas Notetaker",
"join_time": 1732657774,
"meeting_settings": {
"video_recording": true,
"audio_recording": true,
"transcription": true
}
}'
Creating bots manually is cool for testing, but the real power of an AI meeting bot comes from a smooth, automated process. Let’s explore two ways to have your bot automatically join future meetings:
a. Set up scheduled bots for specific meetings
If you know the details of a future meeting, you can schedule a Notetaker bot in advance. This is very similar to Step 3, but you’ll set the join_time to when that future meeting starts.
Make a POST
request to /v3/grants/<NYLAS_GRANT_ID>/notetakers
with the meeting details. The bot will then patiently wait and join at the specified join_time
.
Set up scheduled bots for specific meetings
curl --request POST \
--url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers" \
--header 'Accept: application/json, application/gzip' \
--header 'Authorization: Bearer <NYLAS_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"meeting_link": "<MEETING_URL>",
"name": "Nylas Notetaker",
"join_time": 1732657774,
"meeting_settings": {
"video_recording": true,
"audio_recording": true,
"transcription": true
}
}'
b. By integrating your meeting bot with your calendar
For the best “set it and forget it” experience, you can configure Nylas to automatically send a Notetaker bot to meetings based on rules applied to a user’s calendar. This integration creates the most unified experience for end users.
You’ll make a PUT request to update a specific calendar’s settings using the /v3/grants/<NYLAS_GRANT_ID>/calendars/<CALENDAR_ID>
endpoint.
<CALENDAR_ID>
: The ID of the calendar you want to apply these rules to. You can get calendar IDs using the Nylas Calendar API.In the request body, you define the notetaker configuration, including rules like event_selection (e.g., “internal,” “external” meetings) and participant_filter (e.g., minimum/maximum number of attendees).
Integrating your meeting bot with your calendar
curl --request PUT \
--url 'https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/calendars/<CALENDAR_ID>' \
--header 'Accept: application/json, application/gzip' \
--header 'Authorization: Bearer <NYLAS_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"notetaker": {
"name": "My Notetaker",
"meeting_settings": {
"video_recording": true,
"audio_recording": true,
"transcription": true
},
"rules": {
"event_selection": ["internal","external"],
"participant_filter": {
"participants_gte": 3,
"participants_lte": 10
}
}
}
}'
Once your bot has started capturing meeting recordings, it’s ready for you to take that conversational data and turn it into something better. You can make a make a GET request to fetch the media files directly on-demand:
Get meeting recordings and transcriptions
curl --request GET \
--url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/media" \
--header 'Accept: application/json, application/gzip' \
--header 'Authorization: Bearer <NYLAS_API_KEY>'
Nylas responds with a link to the recording and a link to the transcript, if available.
Important Note: These links are temporary and typically valid for up to an hour. If you need access later, you’ll have to make this API call again to get fresh links. For persistent storage, download the files.
You can also set up webhook notifications to automatically let you know when media files are ready! In your Nylas Dashboard, configure a webhook to listen for the notetaker.media event. Point it to an endpoint on your server that can receive POST requests.
When a recording and/or transcript is ready, Nylas will send a payload to your webhook URL similar to this:
Response
{
"specversion": "1.0",
"type": "notetaker.media",
"source": "/nylas/notetaker",
"id": "<WEBHOOK_ID>",
"time": 1737500935555,
"webhook_delivery_attempt": 0,
"data": {
"application_id": "<NYLAS_APPLICATION_ID>",
"object": {
"id": "<NOTETAKER_ID>",
"object": "notetaker",
"state": "available",
"media": {
"recording": "<RECORDING_URL>",
"transcript": "<TRANSCRIPT_URL>"
}
}
}
}
Let’s wrap up this guide with a few best to keep in mind as you build a product with an AI meeting bot.
Each platform handles permissions differently. For example, Zoom requires explicit consent from participants, requiring developers to build their own recording consent notification system for bots entering meetings. Managing platform-specific differences manually and incorrectly can quickly turn your product into a compliance risk. You need to always verify permissions before dispatching a bot and make it clear to users when and how recording is initiated.
Meeting recordings can contain sensitive or regulated information. Storing them improperly — or exposing them through public URLs — puts your product and users at risk. You’ll need to store recordings in secure storage (e.g., AWS S3) using signed URLs or access tokens and set clear expiration times and access controls to protect data integrity.
Real-time systems like meeting bots can fail due to platform outages, invalid meeting links, or permissions issues. Without fallback logic, you risk losing valuable meeting data. It’s important to implement robust error handling with retry logic for bot joins, recording status, and transcription processing. Make sure to Log failures with enough context to troubleshoot quickly.
Most meeting APIs enforce rate limits, especially around meeting joins and media requests. Use sandbox environments and test accounts to simulate meeting joins and bot behavior. This will help you monitor rate limit headers and implement exponential backoff in high-volume applications.
Meeting bots need to know when to join, and your app needs to know when a meeting is done, the transcript is ready, or the recording is available. Without real-time sync and notifications, your workflows break and your entire product experience becomes slow and tedious. By syncing meeting joins with calendar events and using webhooks, you can trigger downstream workflows as soon as recording or transcription is complete.
Building reliable, scalable meeting features shouldn’t mean managing platform quirks, compliance risks, or fragile infrastructure. The Nylas Notetaker API helps developers build and integrate AI meeting bots in the most productive and efficient way:
✅ Platform-specific permissions: Built-in support for Zoom, Teams, and Google Meet permission models.
✅ Secure media delivery: Signed, time-limited URLs for recordings and transcripts keep sensitive data protected.
✅ Structured error handling: Clear API responses and webhooks make it easy to retry failed requests and handle edge cases.
✅ Calendar sync and real-time notifications: Bots auto-join at the right time, and your app gets updates when recordings and transcripts are ready.