You want transcripts and recordings of your users’ Zoom, Teams, and Google Meet calls. Building that yourself means writing a meeting bot for each platform, handling join flows and media capture three different ways, then bolting on speech-to-text. It’s months of work before you transcribe a single sentence.
Notetaker does it with one request. You send a bot to a meeting link, it joins the call, and it returns the recording, a transcript, a summary, and action items. The same endpoint works for Google Meet, Microsoft Teams, and Zoom, so you write the integration once.
How do I record and transcribe a meeting?
Section titled “How do I record and transcribe a meeting?”Send a POST /v3/notetakers request with the meeting URL in meeting_link. A standalone Notetaker bot joins the call and starts capturing it, with no connected calendar required. One endpoint covers all 3 supported platforms: Google Meet, Microsoft Teams, and Zoom. The quickstart sends your first bot in under 5 minutes, and the response returns the Notetaker’s id, which you pass as the {notetaker_id} path parameter when you fetch the media later.
The request below sends a bot to a meeting and turns on recording, transcription, a summary, and action items.
curl --request POST \ --url "https://api.us.nylas.com/v3/notetakers" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>' \ --header 'Content-Type: application/json' \ --data '{ "join_time": 1732657774, "meeting_link": "https://meet.google.com/xyz-abcd-ijk", "meeting_settings": { "action_items": true, "action_items_settings": { "custom_instructions": "Only return the 5 most important action items." }, "audio_recording": true, "leave_after_silence_seconds": 360, "summary": true, "summary_settings": { "custom_instructions": "Return this summary in the MEDPIC sales methodology." }, "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"], "fallback_language": "en" }, "video_recording": true }, "name": "Nylas Notetaker" }'import Nylas from "nylas";
const nylas = new Nylas({ apiKey: "<NYLAS_API_KEY>", apiUri: "<NYLAS_API_URI>",});
async function inviteStandaloneNotetaker() { try { const notetaker = await nylas.notetakers.create({ requestBody: { meetingLink: "https://meet.google.com/abc-defg-hij", name: "Nylas Notetaker", meetingSettings: { videoRecording: true, audioRecording: true, transcription: true, }, }, });
console.log("Standalone notetaker:", notetaker); } catch (error) { console.error("Error inviting notetaker:", error); }}
inviteStandaloneNotetaker();from nylas import Client
nylas = Client( "<NYLAS_API_KEY>", "<NYLAS_API_URI>",)
notetaker = nylas.notetakers.invite( request_body={ "meeting_link": "https://meet.google.com/abc-defg-hij", "name": "Nylas Notetaker", "meeting_settings": { "video_recording": True, "audio_recording": True, "transcription": True, }, },)
print("Invited standalone notetaker:", notetaker)What can the Notetaker capture?
Section titled “What can the Notetaker capture?”The meeting_settings object controls what the bot produces, and the outputs build on each other. audio_recording and video_recording are the base; transcription requires both recording flags on; and summary and action_items each require transcription plus both recordings. You can steer summary and action_items with custom_instructions, for example returning a summary in a specific sales methodology.
Transcription defaults to automatic language detection. If your meetings are consistently in one or two languages, pass transcription_settings.expected_languages with the relevant codes to force or narrow detection. The bot also accepts leave_after_silence_seconds, which defaults to 5 minutes (300 seconds) of continuous silence before it leaves an empty call. See Notetaker media and settings for every option.
How do I get the recording and transcript?
Section titled “How do I get the recording and transcript?”The media isn’t ready instantly; the bot has to finish the meeting and process it. Subscribe a webhook to the notetaker.media trigger, which fires when the recording and transcript are available, and to notetaker.meeting_state to track the bot through joining, recording, and leaving. These are 2 of the 5 Notetaker triggers. Nylas keeps media files for up to 14 days, so download them promptly.
When notetaker.media fires, fetch the output with a GET /v3/notetakers/{notetaker_id}/media request. It returns URLs for the recording and transcript that you download and store. The request below retrieves the media for one Notetaker.
curl --request GET \ --url "https://api.us.nylas.com/v3/notetakers/<NOTETAKER_ID>/media" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'For the webhook setup itself, see Get real-time updates with webhooks.
Things to know about the Notetaker
Section titled “Things to know about the Notetaker”One behavior to plan for: Nylas doesn’t de-duplicate bots. Every POST /v3/notetakers request invites a new bot to the meeting, so if your code retries a failed request you can end up with 2 bots in the same call. Track the notetaker_id and cancel duplicates rather than re-sending blindly. When you fetch media, each download URL is valid for 60 minutes, so regenerate it through the media endpoint if a download fails.
This recipe uses standalone Notetakers, which take a raw meeting_link and need only your API key. If you instead want a bot to join meetings on a user’s connected calendar automatically, use the grant-based POST /v3/grants/{grant_id}/notetakers endpoint and Notetaker’s calendar sync. To attach recording to a booking flow, see Add scheduling with Notetaker.
What’s next
Section titled “What’s next”- Notetaker overview for the full API and supported platforms
- Notetaker media and settings for every recording and transcription option
- Get real-time updates with webhooks to know when media is ready
- Add scheduling with Notetaker to record meetings booked through Scheduler