Nylas Notetaker is a real-time meeting bot that you can invite to online meetings to record and transcribe your discussions.
How Notetaker works
When you invite Notetaker to a meeting, it joins the session as a user and records your discussion. It then transcribes your meeting and sends status updates to you using webhook notifications.
Notetaker sends a message to attendees using the meeting provider’s messaging function a few minutes after joining the call. This message informs users that Notetaker is recording and transcribing the meeting, and that it’s the meeting host’s responsibility to collect consent.
Notetaker can join meetings in three ways:
- On the fly: Make a
POST /v3/notetakers
orPOST /v3/grants/<NYLAS_GRANT_ID>/notetakers
request with the link to a meeting that’s already started and omit thejoin_time
. - On a schedule: Make a
POST /v3/notetakers
orPOST /v3/grants/<NYLAS_GRANT_ID>/notetakers
request with a link to a scheduled meeting and itsjoin_time
. - Automatically: Use the calendar sync feature to let Notetaker join meetings on your calendar automatically.
Notetaker records the meeting until you either remove it from the session or the meeting ends. Then, it processes the data it recorded. Nylas sends notetaker.media
webhook notifications as each processed file becomes available for download.
Set up Notetaker
To follow along with the samples on this page, you first need to sign up for a Nylas developer account, which gets you a free Nylas application and API key.
For a guided introduction, you can follow the Getting started guide to set up a Nylas account and Sandbox application. When you have those, you can connect an account from a calendar provider (such as Google, Microsoft, or iCloud) and use your API key with the sample API calls on this page to access that account’s data.
Set up Notetaker notifications
Nylas can send webhook notifications about Notetakers, like when they join calls and when recordings are available. You can set this up through the Nylas Dashboard or by making a POST /v3/webhooks
request with your webhook_url
and the trigger types you want to subscribe to. You can subscribe to the following Notetaker webhook triggers:
Invite Notetaker to a meeting
Notetaker currently supports Google Meet, Microsoft Teams, and Zoom sessions.
When you’re ready, invite Notetaker to a meeting by making a POST /v3/notetakers
or POST /v3/grants/<NYLAS_GRANT_ID>/notetakers
request with a link to your session. The join_time
is an optional parameter. If you leave it blank, Notetaker joins the meeting immediately.
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 } }'
{ "request_id": "5fa64c92-e840-4357-86b9-2aa364d35b88", "data": { "notetaker_id": "<NOTETAKER_ID>" }}
When you invite Notetaker to a meeting, Nylas sends a notetaker.meeting_state
webhook notification showing that it’s attempting to join.
{ "specversion": "1.0", "type": "notetaker.meeting_state", "source": "/nylas/notetaker", "id": "<WEBHOOK_ID>", "time": 1737500935555, "webhook_delivery_attempt": 0, "data": { "application_id": "<NYLAS_APPLICATION_ID>", "object": { "id": "<NOTETAKER_ID>", "grant_id": "<NYLAS_GRANT_ID>", "calendar_id": "<CALENDAR_ID>", "event": { "ical_uid": "<ICAL_UID>", "event_id": "<EVENT_ID>", "master_event_id": "<MASTER_EVENT_ID>" }, "object": "notetaker", "state": "connecting", "meeting_state": "dispatched" } }}
Notetaker is always considered a non-signed-in user on the meeting platform. If your meeting is limited to organization members only, you need to approve Notetaker when it tries to join. If you don’t approve its join request within 10 minutes of the scheduled join time, it times out and sends a notetaker.meeting_state
webhook notification with the status
set to failed_entry
.
Nylas doesn’t de-duplicate Notetaker bots. Every POST /v3/notetakers
or POST /v3/grants/<NYLAS_GRANT_ID>/notetakers
request you make invites a new Notetaker to the specified meeting.
Get a list of scheduled Notetakers
You can make a GET /v3/notetakers
or GET /v3/grants/<NYLAS_GRANT_ID>/notetakers
request to get a list of scheduled Notetaker bots.
curl --request GET \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers" \ --header 'Accept: application/json, application/gzip' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'
Cancel a scheduled Notetaker
If you no longer need Notetaker in an upcoming meeting, you can make a DELETE /v3/notetakers/<NOTETAKER_ID>/cancel
or DELETE /v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/cancel
request to cancel the scheduled Notetaker bot.
curl --request DELETE \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/cancel" \ --header 'Accept: application/json, application/gzip' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'
Remove Notetaker from a meeting
Notetaker continues recording your meeting until you either remove it from the session or end the meeting, then it processes the recorded data. If you want to stop recording your meeting before it ends, you can make a POST /v3/notetakers/<NOTETAKER_ID>/leave
or POST /v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/leave
request to remove Notetaker from your session.
curl --request POST \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/leave" \ --header 'Accept: application/json, application/gzip' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'
Nylas sends a notetaker.meeting_state
webhook notification when Notetaker is removed from a meeting.
{ "specversion": "1.0", "type": "notetaker.meeting_state", "source": "/nylas/notetaker", "id": "<WEBHOOK_ID>", "time": 1737500935555, "webhook_delivery_attempt": 0, "data": { "application_id": "<NYLAS_APPLICATION_ID>", "object": { "id": "<NOTETAKER_ID>", "grant_id": "<NYLAS_GRANT_ID>", "calendar_id": "<CALENDAR_ID>", "event": { "ical_uid": "<ICAL_UID>", "event_id": "<EVENT_ID>", "master_event_id": "<MASTER_EVENT_ID>" }, "object": "notetaker", "status": "disconnected", "meeting_state": "api_request" } }}