Skip to content
Skip to main content

Send the recording when Notetaker is ready

Last updated:

Notetaker finishes processing minutes after a call ends, and until someone checks the API nobody knows the recording exists. A notetaker.media workflow pushes it out the moment it’s ready.

An email announcing the recording is ready, with download links for the recording and transcript, the file format, and a watch button

When processing completes and the media is downloadable. The payload arrives with state set to available and a media object holding signed URLs for each artefact Notetaker produced.

"media": {
"recording": "<SIGNED_URL>",
"transcript": "<SIGNED_URL>",
"summary": "<SIGNED_URL>",
"thumbnail": "<SIGNED_URL>",
"recording_duration": "1800",
"recording_file_format": "mp4"
}

Which keys are present depends on what the session was configured to capture. A session with transcription off has no transcript, and one with video_recording off has no recording. Guard every one of them, because the renderer throws on a missing key and sends nothing.

Not the meeting attendees. notetaker.media carries an event object with only ical_uid, event_id, and master_event_id, so there is no participant list to address. Send a test to confirm which address receives the message before you enable this for customers. A standalone Notetaker has no grant behind it at all.

If attendees need the recording, send it from your own code: take event.event_id from the payload, fetch the event to get its participants, and send through transactional send. A workflow can’t do that lookup.

Point an application-level workflow at notetaker.media. Notetaker sessions are created deliberately, so the volume is low and an application-level workflow is safe here.

curl -X POST 'https://api.us.nylas.com/v3/workflows' \
-H "Authorization: Bearer $NYLAS_API_KEY" -H 'Content-Type: application/json' \
-d '{
"name": "Recording ready",
"trigger_event": "notetaker.media",
"template_id": "<TEMPLATE_ID>",
"delay": 0,
"is_enabled": true,
"from": { "email": "[email protected]", "name": "Your Company" }
}'

Use delay: 0. The value of this email decays fast, and the links it carries have a limited life of their own.

Say so in the email. The URLs in media are signed and time-limited, so a recipient who opens the message a week later finds dead links and assumes the recording is gone.

Two ways to handle it. The simple one is to tell people to download what they want to keep, which the template below does in its footer. The durable one is to point the button at a page in your own product that fetches a fresh URL on demand, using the Notetaker id from the payload:

<a href="https://yourapp.com/recordings/{{id}}">Watch the recording</a>

That costs you a route and removes the expiry problem entirely. It also means you control who can open the recording, which a signed URL forwarded in an email doesn’t.

How does the template handle missing media?

Section titled “How does the template handle missing media?”

Every media key is guarded separately, so a session that recorded audio but not video still produces a sensible email rather than failing to render.

{{#if media}}{{#if media.recording}}
<a href="{{media.recording}}">Download the recording</a>
{{else}}not available{{/if}}{{/if}}

Both levels are needed. media itself is absent on a session that produced nothing at all, and reaching through it throws. The {{else}} branch matters as much as the guard: a row that silently disappears leaves the reader wondering whether the transcript failed or was never requested.

recording_duration is a string of seconds rather than a formatted length, so 1800 means 30 minutes. There’s no helper for converting it, so either print it as seconds, as the template does, or format it in your own product and link out.

This renders the email above and handles a session missing any combination of recording, transcript, or duration.

Render it with POST /v3/templates/render against a payload with media absent as well as a full one. The Notetaker notification reference publishes the full payload shape.