# Record and transcribe meetings with Notetaker

Source: https://developer.nylas.com/docs/cookbook/use-cases/build/record-transcribe-meetings/

You want transcripts and recordings of your users' Zoom, Teams, and Google Meet calls. Building that yourself means writing a meeting bot for each platform, handling join flows and media capture three different ways, then bolting on speech-to-text. It's months of work before you transcribe a single sentence.

Notetaker does it with one request. You send a bot to a meeting link, it joins the call, and it returns the recording, a transcript, a summary, and action items. The same endpoint works for Google Meet, Microsoft Teams, and Zoom, so you write the integration once.

## How do I record and transcribe a meeting?

Send a `POST /v3/notetakers` request with the meeting URL in `meeting_link`. A standalone Notetaker bot joins the call and starts capturing it, with no connected calendar required. One endpoint covers all 3 supported platforms: Google Meet, Microsoft Teams, and Zoom. The [quickstart](/docs/v3/getting-started/notetaker/) sends your first bot in under 5 minutes, and the response returns the Notetaker's `id`, which you pass as the `{notetaker_id}` path parameter when you fetch the media later.

The request below sends a bot to a meeting and turns on recording, transcription, a summary, and action items.

```bash
curl --request POST \
  --url "https://api.us.nylas.com/v3/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"
  }'

```

```js [inviteNotetaker-Node.js]

import Nylas from "nylas";

const nylas = new Nylas({
  apiKey: "<NYLAS_API_KEY>",
  apiUri: "<NYLAS_API_URI>",
});

async function inviteStandaloneNotetaker() {
  try {
    const notetaker = await nylas.notetakers.create({
      requestBody: {
        meetingLink: "https://meet.google.com/abc-defg-hij",
        name: "Nylas Notetaker",
        meetingSettings: {
          videoRecording: true,
          audioRecording: true,
          transcription: true,
        },
      },
    });

    console.log("Standalone notetaker:", notetaker);
  } catch (error) {
    console.error("Error inviting notetaker:", error);
  }
}

inviteStandaloneNotetaker();


```

```python
from nylas import Client

nylas = Client(
    "<NYLAS_API_KEY>",
    "<NYLAS_API_URI>",
)

notetaker = nylas.notetakers.invite(
    request_body={
        "meeting_link": "https://meet.google.com/abc-defg-hij",
        "name": "Nylas Notetaker",
        "meeting_settings": {
            "video_recording": True,
            "audio_recording": True,
            "transcription": True,
        },
    },
)

print("Invited standalone notetaker:", notetaker)


```

## What can the Notetaker capture?

The `meeting_settings` object controls what the bot produces, and the outputs build on each other. `audio_recording` and `video_recording` are the base; `transcription` requires both recording flags on; and `summary` and `action_items` each require transcription plus both recordings. You can steer `summary` and `action_items` with `custom_instructions`, for example returning a summary in a specific sales methodology.

Transcription defaults to automatic language detection. If your meetings are consistently in one or two languages, pass `transcription_settings.expected_languages` with the relevant codes to force or narrow detection. The bot also accepts `leave_after_silence_seconds`, which defaults to 5 minutes (300 seconds) of continuous silence before it leaves an empty call. See [Notetaker media and settings](/docs/v3/notetaker/media-handling/) for every option.

## How do I get the recording and transcript?

The media isn't ready instantly; the bot has to finish the meeting and process it. Subscribe a webhook to the `notetaker.media` trigger, which fires when the recording and transcript are available, and to `notetaker.meeting_state` to track the bot through joining, recording, and leaving. These are 2 of the 5 Notetaker triggers. Nylas keeps media files for up to 14 days, so download them promptly.

When `notetaker.media` fires, fetch the output with a `GET /v3/notetakers/{notetaker_id}/media` request. It returns URLs for the recording and transcript that you download and store. The request below retrieves the media for one Notetaker.

```bash
curl --request GET \
  --url "https://api.us.nylas.com/v3/notetakers/<NOTETAKER_ID>/media" \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <NYLAS_API_KEY>'

```

For the webhook setup itself, see [Get real-time updates with webhooks](/docs/cookbook/use-cases/build/realtime-webhooks/).

## Things to know about the Notetaker

One behavior to plan for: Nylas doesn't de-duplicate bots. Every `POST /v3/notetakers` request invites a new bot to the meeting, so if your code retries a failed request you can end up with 2 bots in the same call. Track the `notetaker_id` and cancel duplicates rather than re-sending blindly. When you fetch media, each download URL is valid for 60 minutes, so regenerate it through the media endpoint if a download fails.

This recipe uses standalone Notetakers, which take a raw `meeting_link` and need only your API key. If you instead want a bot to join meetings on a user's connected calendar automatically, use the grant-based `POST /v3/grants/{grant_id}/notetakers` endpoint and Notetaker's calendar sync. To attach recording to a booking flow, see [Add scheduling with Notetaker](/docs/cookbook/use-cases/build/scheduling-with-notetaking/).

## What's next

- [Notetaker overview](/docs/v3/notetaker/) for the full API and supported platforms
- [Notetaker media and settings](/docs/v3/notetaker/media-handling/) for every recording and transcription option
- [Get real-time updates with webhooks](/docs/cookbook/use-cases/build/realtime-webhooks/) to know when media is ready
- [Add scheduling with Notetaker](/docs/cookbook/use-cases/build/scheduling-with-notetaking/) to record meetings booked through Scheduler