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 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. - 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 when Notetaker has an update about a media file. To set this up, make a POST /v3/webhooks
request with your webhook_url
, and include the trigger types you want to subscribe to. You can subscribe to the following Notetaker webhook triggers:
The following example subscribes to notetaker.media
and notetaker.meeting_state
notifications.
curl --request POST \ --url 'https://api.us.nylas.com/v3/webhooks/' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>' \ --data-raw '{ "trigger_types": ["notetaker.media", "notetaker.meeting_state"], "description": "Notifications about Notetaker meeting states and updated files.", "webhook_url": "<WEBHOOK_URL>", "notification_email_addresses": ["[email protected]"] }'
Invite Notetaker to a meeting
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", "status": "connecting", "meeting_state": "dispatched" } }}
Notetaker is always considered a non-signed-in user. 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" } }}
Download processed files
If you’re subscribed to notetaker.media
webhook notifications, Nylas sends a notification when a meeting recording or transcription is processing, available to download, or deleted. You can use the media.recording
and media.transcript
URLs to download the files when they’re available.
{ "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", "status": "available", "media": { "recording": "<RECORDING_URL>", "transcript": "<TRANSCRIPT_URL>" } } }}
You can also download the processed meeting files by making a GET /v3/notetakers/<NOTETAKER_ID>/media
or GET /v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/media
request. Nylas responds with a link to the recording and a link to the transcript, if available. The links are valid for up to an hour; after that, you need to make another request to get the updated links.
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>'
{ "request_id": "5fa64c92-e840-4357-86b9-2aa364d35b88", "data": { "recording": { "url": "<NOTETAKER_RECORDING_URL>", "size": 1024 }, "transcript": { "url": "<NOTETAKER_TRANSCRIPT_URL>", "size": 1024 } }}