Nylas Notetaker is a real-time meeting bot that you can invite to online meetings to record and transcribe your discussions.
How Notetaker works
Section titled “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 four ways:
- On the fly: Make a
POST /v3/notetakersorPOST /v3/grants/<NYLAS_GRANT_ID>/notetakersrequest with the link to a meeting that’s already started and omit thejoin_time. - On a schedule: Make a
POST /v3/notetakersorPOST /v3/grants/<NYLAS_GRANT_ID>/notetakersrequest 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.
- With Scheduler: Automatically add Notetaker bots to meetings booked through Nylas Scheduler. When enabled, Notetaker automatically joins meetings created through Scheduler bookings. For more information, see Scheduler & Notetaker Integration.
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.
Integrate Notetaker with Scheduler
Section titled “Integrate Notetaker with Scheduler”You can automatically add Notetaker bots to meetings booked through Nylas Scheduler. When enabled, Notetaker automatically joins meetings created through Scheduler bookings, records the session, and generates transcripts and summaries. For detailed information about setting up this integration, see Scheduler & Notetaker Integration.
Set up Notetaker
Section titled “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
Section titled “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
Section titled “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' \ --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" }'{ "request_id": "5fa64c92-e840-4357-86b9-2aa364d35b88", "data": { "id": "<NOTETAKER_ID>", "name": "Nyla's Notetaker", "join_time": 1732657774, "meeting_link": "<MEETING_URL>", "meeting_provider": "Google Meet", "state": "scheduled", "meeting_settings": { "action_items": true, "action_items_settings": { "custom_instructions": "Only return the 5 most important action items." }, "audio_recording": true, "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 } }}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, "data": { "application_id": "<NYLAS_APPLICATION_ID>", "object": { "id": "<NOTETAKER_ID>", "grant_id": "<NYLAS_GRANT_ID>", "meeting_settings": { "video_recording": true, "audio_recording": true, "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"], "fallback_language": "en" }, "summary": true, "summary_settings": { "custom_instructions": "Focus on action items related to the product launch." }, "action_items": true, "action_items_settings": { "custom_instructions": "Group action items by team member." }, "leave_after_silence_seconds": 300 }, "meeting_provider": "Google Meet", "meeting_link": "https://meet.google.com/abc-defg-hij", "join_time": 1737500936450, "event": { "ical_uid": "<ICAL_UID>", "event_id": "<EVENT_ID>", "master_event_id": "<MASTER_EVENT_ID>" }, "object": "notetaker", "status": "connecting", "state": "connecting", "meeting_state": "waiting_for_entry" } }}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.
Enable summaries and action items
Section titled “Enable summaries and action items”When you invite a Notetaker bot to a meeting or update a scheduled Notetaker, you can also enable summaries and action items for the meeting by setting summary and action_items to true. Nylas automatically generates a short summary of the meeting and a list of action items based on your conversation.
If you want to pass custom instructions for either the summary or list of action items, you can specify summary_settings.custom_instructions and action_items_settings.custom_instructions in your request. Nylas’ AI model takes these instructions into consideration while generating the information.
Nylas returns URLs for files that contain the summary and action items. For information on downloading those files, see Handling Notetaker media files.
Set transcription languages
Section titled “Set transcription languages”meeting_settings.transcription_settings tunes how Notetaker transcribes a meeting. It carries two independent controls: language hints that steer automatic language detection, and keyword hints that bias recognition toward specific terms. Set either, both, or neither. transcription must be true for any of these settings to take effect.
By default, Notetaker uses automatic language detection on every transcription. If your users consistently speak one or more languages and you’ve seen Notetaker mis-identify them (for example, Portuguese coming back as Spanish, or a single-language meeting bouncing between codes), pass language hints in transcription_settings. The hints either force a single language (pass one code in expected_languages) or narrow what auto-detect considers (pass two or more). The recognizer then chooses from the codes you provide instead of guessing across every supported language.
Language hints affect detection only. Notetaker transcribes each meeting in the language spoken and doesn’t translate the transcript into another language.
You can set transcription_settings anywhere meeting_settings is accepted:
- When you invite or update a Notetaker (grant-based or standalone).
- When you enable Notetaker on a calendar so all matching events inherit the setting.
- When you set Notetaker on a specific event, which overrides anything inherited from the calendar.
expected_languages and fallback_language
Section titled “expected_languages and fallback_language”The language hints in transcription_settings are two fields:
expected_languages— An array of language codes the audio is expected to contain. Optional. When you set it, it must contain at least one supported code and cannot benullor empty. Omit it and transcription considers all supported languages.fallback_language— Optional. Whenexpected_languagesis set, the fallback must be one of those codes. When you omitexpected_languages, it can be any supported code. Leave it out and the transcriber auto-detects the language. The field isn’t stored, so aGETwon’t return it.
The simplest valid object just declares the expected languages:
{ "meeting_settings": { "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"] } }}If you omit fallback_language, the transcriber auto-detects the language. Passing "auto" explicitly does the same thing.
If you want a deterministic fallback, set fallback_language to a concrete code that is also in expected_languages:
{ "meeting_settings": { "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"], "fallback_language": "en" } }}When you omit expected_languages, transcription considers all supported languages, and fallback_language isn’t limited to a list. You can set it to any supported code:
{ "meeting_settings": { "transcription": true, "transcription_settings": { "fallback_language": "en" } }}Improve recognition of names and jargon
Section titled “Improve recognition of names and jargon”Keyword hints bias the transcriber toward domain-specific terms it would otherwise mis-hear, such as people’s names, company names, product names, and acronyms. Like language hints, they live in transcription_settings, and transcription must be true. These two fields are independent of expected_languages, so you can set them on their own.
keywords— An array of terms to prioritize during transcription. Up to 200 terms. Each term must be 1 to 200 characters and cannot contain control characters. Cannot benull.use_speaker_names_as_keywords— A boolean. Whentrue, Notetaker adds known speaker names to the keyword set so they’re transcribed accurately. Cannot benull.
{ "meeting_settings": { "transcription": true, "transcription_settings": { "keywords": ["Nylas", "AssemblyAI", "OAuth"], "use_speaker_names_as_keywords": true } }}You can combine keyword hints with language hints in the same object:
{ "meeting_settings": { "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"], "keywords": ["Nylas", "AssemblyAI"] } }}transcription_settings is replaced as a whole
Section titled “transcription_settings is replaced as a whole”transcription_settings is treated as one composite setting. Nylas does not field-merge it. To change anything inside it, whether that’s a language code, the fallback, or the keyword list, send the full object you want to end up with. You can’t, for example, add a keyword while inheriting expected_languages from a parent calendar; send every field you want together, or omit the object entirely to inherit it unchanged.
Clear transcription settings
Section titled “Clear transcription settings”To clear transcription_settings, whether to remove settings already on a Notetaker or to override settings inherited from a calendar on a single event, send transcription_settings as either null or {}. The two are equivalent: both remove inherited language and keyword hints and return the Notetaker to default transcription behavior.
{ "meeting_settings": { "transcription_settings": null }}Supported language codes
Section titled “Supported language codes”These codes are valid in both expected_languages and fallback_language.
| Code | Language | Code | Language | Code | Language | Code | Language |
|---|---|---|---|---|---|---|---|
af | Afrikaans | am | Amharic | ar | Arabic | as | Assamese |
az | Azerbaijani | ba | Bashkir | be | Belarusian | bg | Bulgarian |
bn | Bengali | bo | Tibetan | br | Breton | bs | Bosnian |
ca | Catalan | cs | Czech | cy | Welsh | da | Danish |
de | German | el | Greek | en | English | en_au | English (Australian) |
en_uk | English (British) | en_us | English (American) | es | Spanish | et | Estonian |
eu | Basque | fa | Persian | fi | Finnish | fo | Faroese |
fr | French | gl | Galician | gu | Gujarati | ha | Hausa |
haw | Hawaiian | he | Hebrew | hi | Hindi | hr | Croatian |
ht | Haitian Creole | hu | Hungarian | hy | Armenian | id | Indonesian |
is | Icelandic | it | Italian | ja | Japanese | jw | Javanese |
ka | Georgian | kk | Kazakh | km | Khmer | kn | Kannada |
ko | Korean | la | Latin | lb | Luxembourgish | ln | Lingala |
lo | Lao | lt | Lithuanian | lv | Latvian | mg | Malagasy |
mi | Maori | mk | Macedonian | ml | Malayalam | mn | Mongolian |
mr | Marathi | ms | Malay | mt | Maltese | my | Burmese |
ne | Nepali | nl | Dutch | nn | Norwegian Nynorsk | no | Norwegian |
oc | Occitan | pa | Punjabi | pl | Polish | ps | Pashto |
pt | Portuguese | ro | Romanian | ru | Russian | sa | Sanskrit |
sd | Sindhi | si | Sinhala | sk | Slovak | sl | Slovenian |
sn | Shona | so | Somali | sq | Albanian | sr | Serbian |
su | Sundanese | sv | Swedish | sw | Swahili | ta | Tamil |
te | Telugu | tg | Tajik | th | Thai | tk | Turkmen |
tl | Tagalog | tr | Turkish | tt | Tatar | uk | Ukrainian |
ur | Urdu | uz | Uzbek | vi | Vietnamese | yi | Yiddish |
yo | Yoruba | zh | Chinese |
auto is valid only for fallback_language, not expected_languages. Omitting fallback_language produces the same auto-detection.
Get a list of scheduled Notetakers
Section titled “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' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'Cancel a Notetaker before it joins
Section titled “Cancel a Notetaker before it joins”If you no longer need Notetaker before it starts attending a 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 Notetaker bot. Use this request while the Notetaker’s status is scheduled, connecting, or waiting_for_entry.
curl --request DELETE \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/cancel" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'Delete a Notetaker
Section titled “Delete a Notetaker”To permanently delete a Notetaker in any state, make a DELETE /v3/notetakers/<NOTETAKER_ID> or DELETE /v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID> request. Unlike the cancel endpoint, which only works before Notetaker joins a meeting, the delete endpoint works regardless of the Notetaker’s current state.
curl --request DELETE \ --url "https://api.us.nylas.com/v3/notetakers/<NOTETAKER_ID>" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'When a Notetaker is deleted, Nylas sends a notetaker.deleted webhook notification.
Remove Notetaker from a meeting
Section titled “Remove Notetaker from a meeting”Notetaker continues recording your meeting until you either remove it from the session, the meeting ends, or it automatically leaves due to silence detection. 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. Use this request only after Notetaker is attending the meeting. If Notetaker hasn’t joined yet, use the cancel request instead.
curl --request POST \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/leave" \ --header 'Accept: application/json' \ --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", "state": "disconnected", "meeting_state": "api_request" } }}Silence detection
Section titled “Silence detection”By default, Notetaker automatically leaves a meeting after 5 minutes (300 seconds) of continuous silence. This helps end recordings when meetings have concluded but participants haven’t disconnected the call.
You can customize the silence detection threshold using the leave_after_silence_seconds field in meeting_settings. The value must be between 10 and 3600 seconds (1 hour). Set a lower value for shorter meetings, or increase it for meetings with expected long pauses.
Troubleshoot Notetaker using history events
Section titled “Troubleshoot Notetaker using history events”The Notetaker history endpoints give you a complete, ordered timeline of everything that happened to a specific bot so you can see the journey it’s taken.
- Grant-based Notetakers
- Standalone Notetakers
Call the history endpoint
Section titled “Call the history endpoint”Use your Nylas API key and the Notetaker ID from an API response or webhook notification.
curl --request GET \ --url "https://api.us.nylas.com/v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/history" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'curl --request GET \ --url "https://api.us.nylas.com/v3/notetakers/<NOTETAKER_ID>/history" \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <NYLAS_API_KEY>'{ "request_id": "abc-123-def", "data": { "events": [ { "created_at": 1700000300, "event_type": "notetaker.media", "data": { "grant_id": "d4e78fca-2a90-4b6e-91c3-a7f2bcb0d498", "id": "71c807752c744ad0902f64d43e6cc399", "meeting_link": "https://meet.google.com/abc-def-ghi", "meeting_provider": "Google Meet", "join_time": 1700000050, "object": "notetaker", "state": "available", "status": "available", "meeting_settings": { "audio_recording": true, "video_recording": true, "transcription": true, "transcription_settings": { "expected_languages": ["en", "es"], "fallback_language": "en" }, "summary": true, "action_items": true }, "media": { "recording": "https://storage.googleapis.com/nylas-notetaker-uc1-prod-notetaker/recording.mp4", "recording_duration": "3600", "transcript": "https://storage.googleapis.com/nylas-notetaker-uc1-prod-notetaker/transcript.json", "thumbnail": "https://storage.googleapis.com/nylas-notetaker-uc1-prod-notetaker/thumbnail.jpg", "summary": "https://storage.googleapis.com/nylas-notetaker-uc1-prod-notetaker/summary.txt", "action_items": "https://storage.googleapis.com/nylas-notetaker-uc1-prod-notetaker/action_items.json" } } }, { "created_at": 1700000200, "event_type": "notetaker.meeting_state", "data": { "grant_id": "d4e78fca-2a90-4b6e-91c3-a7f2bcb0d498", "id": "71c807752c744ad0902f64d43e6cc399", "meeting_link": "https://meet.google.com/abc-def-ghi", "meeting_provider": "Google Meet", "join_time": 1700000050, "object": "notetaker", "state": "disconnected", "status": "disconnected", "meeting_state": "meeting_ended" } }, { "created_at": 1700000000, "event_type": "notetaker.created", "data": { "grant_id": "d4e78fca-2a90-4b6e-91c3-a7f2bcb0d498", "id": "71c807752c744ad0902f64d43e6cc399", "meeting_link": "https://meet.google.com/abc-def-ghi", "meeting_provider": "Google Meet", "join_time": 1700000050, "object": "notetaker", "state": "scheduled", "status": "scheduled" } } ] }}The data.events array is ordered most recent first. Each item represents a snapshot of the Notetaker bot at a specific point in time, with:
created_at: When the event was recorded (Unix timestamp, in seconds).event_type: The kind of change that occurred (notetaker.created,notetaker.updated,notetaker.meeting_state,notetaker.media, ornotetaker.deleted).data: The Notetaker payload at that moment, including fields such asstate,meeting_state, and (for media events) amediaobject.
Use history events to debug common issues
Section titled “Use history events to debug common issues”-
Notetaker never joined the meeting
- Look for a
notetaker.createdevent to confirm the bot was scheduled. - Check later
notetaker.meeting_stateevents:- Repeated
connectingor a finalfailed_entryvalue usually indicates a join or lobby issue on the meeting provider side. - If there are no
notetaker.meeting_stateevents at all, verify that the meeting link is valid and thejoin_timeis correct.
- Repeated
- Look for a
-
Notetaker left the meeting earlier than expected
- Find the last
notetaker.meeting_stateevent wheredata.meeting_statemight bemeeting_ended,kicked, orapi_request. - Compare the
created_attimestamp to your expected meeting duration to see whether the call ended early or the bot was removed.
- Find the last
-
Media or transcripts never arrived
- Confirm that there is at least one
notetaker.meeting_stateevent showing the bot in anattendingstate withmeeting_stateset torecording_active. - Look for a
notetaker.mediaevent:- If present, inspect the
data.mediaobject for links torecording,transcript,summary, andaction_items, and check whether your project downloaded them. - If there is no
notetaker.mediaevent, the recording or processing likely failed; you can share the full history payload with Nylas Support for further investigation.
- If present, inspect the
- Confirm that there is at least one
-
Configuration or scheduling changed unexpectedly
- Review
notetaker.updatedevents to see how fields such asjoin_time,meeting_link, ormeeting_settingschanged over time. - Because events are most recent first, you can step backwards through the array to reconstruct exactly how the Notetaker configuration evolved.
- Review