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.
Troubleshoot a Notetaker from its history
state and meeting_state values to a symptom. Each side card shows the value to look for and what to do.Diagram as text
- Your app: Get the Notetaker's history:
GET /or the grant-based version. Newest event first.v3/ notetakers/ {notetaker_id}/ history - Check that it joined: Look for a
notetaker.meeting_stateevent withrecording_active.failed_entry:no_responseorentry_denied→ Never joined the meeting: Not admitted within about 10 minutes, or denied. Ask the host to admit it.failed_entry: link or access reason → Couldn't open the meeting:bad_meeting_link,meeting_passcode_required, orhost_sign_in_required. Fix the link or allow guests.
- Check why it left: Read
meeting_stateon thedisconnectedevent.meeting_endedis a normal exit. (Joined)no_activity→ Left after silence: Default is 300 seconds of silence. Raiseleave_after_silence_seconds.no_participantsorkicked→ Left the meeting early: Everyone else left, or a participant removed the bot.
- Check the media: Look for a
notetaker.mediaevent after the bot leaves. (Left the meeting)processing→ Media still processing: Wait for theavailablenotification. The media endpoint returns404until then.media_error→ Media never arrived: Processing failed. Share the full history payload with Nylas Support.
- Check for setting changes: Compare the
notetaker.updatedevents, oldest to newest. (Wrong time, link, or settings)- Calendar event changed → Calendar sync updated it: Changed events are re-checked against calendar rules. Events that no longer match lose their Notetaker.
- Configuration changed → Settings resolved at dispatch: Configuration edits apply until dispatch. Inspect sources with
config_details=true.
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 about 10 minutes after the bot asks to join, the bot gives up and Nylas sends a notetaker.meeting_state webhook with status set to failed_entry. To tell the host while the meeting is still running, see Tell the host when Notetaker can’t join.
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. It also leaves when the meeting ends, when the other participants leave, 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,no_activitymeans silence detection ended the recording,no_participantsmeans the other participants left,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. Current URLs come from the media endpoint. - If the last
notetaker.mediaevent hasstateset tomedia_error, processing failed. Share the full history payload with Nylas Support.
The media endpoint’s status code also narrows it down. A 404 means the media isn’t ready: the bot hasn’t left the meeting yet, the files are still processing, or processing failed with media_error. Ready media shows as the available state in webhooks and history, and as media_available in a Get Notetaker response. A 410 with the body media deleted means the retention window passed or someone deleted the Notetaker, and the files are gone. A 410 with the body media unavailable means the bot never got into the meeting (failed_entry).
Settings or schedule changed unexpectedly
Section titled “Settings or schedule changed unexpectedly”Nylas resolves settings at dispatch, so a Notetaker can use different defaults if a parent configuration changes after scheduling but before dispatch. After dispatch, the run keeps its captured settings. Use config_details=true on the individual Notetaker GET to inspect setting sources and dependency normalization.
- 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.