When a Notetaker doesn’t behave the way you expected, the history endpoint is the first place to look. It returns every state change for a single bot in order, so you can see whether it was scheduled, whether it joined, when it left, and whether media was produced. This page covers how to read that timeline and the four problems it most often explains.
Get the history of a Notetaker
Section titled “Get the history of a Notetaker”The history endpoints return an ordered timeline of everything that happened to one bot. There’s one for each Notetaker form:
- Grant-based Notetakers:
GET /v3/grants/<NYLAS_GRANT_ID>/notetakers/<NOTETAKER_ID>/history - Standalone Notetakers:
GET /v3/notetakers/<NOTETAKER_ID>/history
Call the endpoint with your API key and the Notetaker ID from an API response or webhook notification. The response holds one entry per event, up to 5 event types, and each entry is a snapshot of the whole Notetaker at that moment rather than a diff.
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 has three fields:
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, includingstate,meeting_state, and (for media events) amediaobject. History entries use the same shape as webhook payloads, so settings appear under the legacy namemeeting_settingseven when you sent them asnotetaker_settings.
Notetaker never joined the meeting
Section titled “Notetaker never joined the meeting”Notetaker is always a non-signed-in user on the meeting platform. If the meeting is limited to organization members, or the host has a waiting room, someone has to admit the bot. If nobody does within 10 minutes of the scheduled join time, the bot gives up and Nylas sends a notetaker.meeting_state webhook with status set to failed_entry.
To confirm what happened, check the history:
- Look for a
notetaker.createdevent to confirm the bot was scheduled at all. - Check the later
notetaker.meeting_stateevents. Repeatedconnectingor a finalfailed_entryvalue points to a join or lobby issue on the meeting provider’s side. - If there are no
notetaker.meeting_stateevents, verify that the meeting link is valid and thejoin_timeis correct. - If the request itself returned
400 Bad Requestwith the messagenotetaker dispatch is disabled, dispatch is paused for that grant, workspace, or application.
Notetaker left the meeting earlier than expected
Section titled “Notetaker left the meeting earlier than expected”By default a Notetaker leaves after 300 seconds of continuous silence, and it also leaves when the meeting ends, when a participant removes it, or when you call the leave endpoint. The history tells you which one it was.
- Find the last
notetaker.meeting_stateevent and readdata.meeting_state.meeting_endedmeans the call closed,kickedmeans a participant removed the bot, andapi_requestmeans your app called the leave endpoint. - Compare that event’s
created_atto the meeting’s expected duration. A gap that matches yourleave_after_silence_secondsvalue usually means silence detection ended the recording.
Media or transcripts never arrived
Section titled “Media or transcripts never arrived”Nylas needs a few minutes after the bot leaves to process the recording, and the download URLs in the resulting webhook expire after 60 minutes. Most “missing media” reports are one of those two, and the history confirms which.
- Confirm there’s at least one
notetaker.meeting_stateevent with the bot in anattendingstate andmeeting_stateset torecording_active. Without it, nothing was recorded. - Look for a
notetaker.mediaevent. If it’s present, inspectdata.mediafor therecording,transcript,summary, andaction_itemsentries and check whether your app downloaded them before the URLs expired. Fresh URLs come from the media endpoint. - If there’s no
notetaker.mediaevent, processing failed. Share the full history payload with Nylas Support.
The media endpoint’s status code also narrows it down. A 404 means media is still processing, or the Notetaker never reached media_available. A 410 with the body media deleted means the retention window passed or someone deleted the Notetaker, and the files are gone.
Settings or schedule changed unexpectedly
Section titled “Settings or schedule changed unexpectedly”Because settings are read when the bot joins rather than when it’s scheduled, a Notetaker can join with different values than the ones you sent if a configuration changed in between. The notetaker.updated events show exactly what changed and when.
- Review each
notetaker.updatedevent for changes tojoin_time,meeting_link, ormeeting_settings. Calendar sync produces these when an event moves or its details change. - Because events are most recent first, step backwards through the array to reconstruct how the Notetaker’s settings evolved. The
meeting_settingsobject in each snapshot is the resolved result of the configuration hierarchy at that moment, not just what you passed inline.
Related topics
Section titled “Related topics”- Using Nylas Notetaker for the invite flow, cancel, delete, and leave endpoints.
- Handling Notetaker media files for download URLs and regeneration.
- Notetaker webhook notifications for the payloads the history mirrors.