> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meetingkit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The bot object

> A notetaker sent to one call: one way of recording a meeting.

A bot joins one Zoom, Google Meet or Microsoft Teams call and records it. It is one way of recording a [meeting](/api-reference/meetings/object): sending a bot creates the meeting at once (`meeting_id`), the bot appears on it under `recordings`, and what the call produced is read from the meeting's [results](/api-reference/meetings/results-object). See [Send bots](/meetingkit/send-bot).

The recording choices on the bot (`language`, `recording_start`, `recording_mode`, `silence_alert`, `summary_language`, `summary_template`) are the meeting's: a value sent on `POST /bots` becomes the meeting's own [settings](/api-reference/settings/object), a value left out follows the member's and the workspace's, and a later `PATCH /settings/{id}` of the meeting's settings changes what the bot shows.

## Attributes

<ResponseField name="id" type="string">
  Stable typed bot ID beginning with `bot_`. Treat it as an opaque string.
</ResponseField>

<ResponseField name="object" type="string">
  Always `bot`.
</ResponseField>

<ResponseField name="meeting_id" type="string">
  The meeting this bot records, beginning with `mtg_`. It exists from the moment the bot is queued;
  read its results with `GET /meetings/{meeting_id}/results`.
</ResponseField>

<ResponseField name="meeting_url" type="string">
  Normalized URL supplied at creation. Treat as sensitive — it may contain credentials.
</ResponseField>

<ResponseField name="join_at" type="string | null">
  Requested ISO 8601 join time, or `null` for an immediate dispatch.
</ResponseField>

<ResponseField name="status" type="string">
  * `queued`: Accepted, waiting to join now or at `join_at`.
  * `joining`: Joining the call.
  * `in_call`: In the call and recording.
  * `processing`: The recording is being transcribed and summarized.
  * `completed`: The transcript and summary are ready on the meeting.
  * `failed`: Ended without a usable result. `reason` says why.
  * `cancelled`: Cancelled before it finished.
</ResponseField>

<ResponseField name="bot_name" type="string">
  Display name of the notetaker in the call.
</ResponseField>

<ResponseField name="welcome_message" type="string | null">
  Chat message the notetaker posts when it joins, or `null` when it posts none.
</ResponseField>

<ResponseField name="language" type="string">
  Transcription language as a BCP-47 code, `auto` or `multi`. The meeting's
  `settings.transcription.language`.
</ResponseField>

<ResponseField name="recording_start" type="string">
  When the notetaker starts recording. The meeting's `settings.recording.methods.bot.start`.

  * `on_join`: as soon as it joins the call.
  * `on_command`: when someone in the call asks it to.
</ResponseField>

<ResponseField name="recording_mode" type="string">
  What the notetaker records. The meeting's `settings.recording.methods.bot.mode`.

  * `audio_and_video`: audio and video.
  * `audio_only`: audio only.
</ResponseField>

<ResponseField name="silence_alert" type="boolean">
  Whether the notetaker posts an audible and chat alert after a long silence, in case it is
  recording nothing. The meeting's `settings.recording.methods.bot.silence_detection.alert`.
</ResponseField>

<ResponseField name="summary_language" type="string | null">
  Language of the summary as a BCP-47 code, or `null` to follow the transcription. The meeting's
  `settings.summary.language`.
</ResponseField>

<ResponseField name="summary_template" type="string | null">
  The summary template that runs, a built-in slug or a custom template's `tpl_` id. The meeting's
  `settings.summary.template`.
</ResponseField>

<ResponseField name="participants" type="object[]">
  Everyone invited to the meeting. Meeting rooms and the notetaker itself are excluded.

  <Expandable title="properties">
    <ResponseField name="email" type="string">
      The participant's email. Used to name speakers.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      Resolved from the calendar invite, anything supplied at creation, the names people displayed
      in the call, and the people the workspace already knows, keeping the fullest. Null when no
      source knew one.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="metadata" type="object">
  Your key-value pairs on this bot: a flat map of strings from 2026-10-12, merged by `PATCH /bots/   {id}`. Before 2026-10-12, the JSON object stored at creation, returned as stored. See
  [metadata](/meetingkit/setup#a-workspace-per-customer).
</ResponseField>

<ResponseField name="created_at" type="string">
  When the bot was created.
</ResponseField>

<ResponseField name="ended_at" type="string | null">
  When the recording first became available. `null` until then, and for a bot that never recorded.
  Reprocessing does not change it.
</ResponseField>

<ResponseField name="reason" type="string">
  Machine-readable failure reason. Present only for failed bots.

  * `no_recording`: the call ended without anything recorded.
  * `invalid_meeting_url`: the meeting URL could not be joined.
  * `bot_error`: the notetaker failed in the call.
  * `transcription_failed`: the recording could not be transcribed.
</ResponseField>

<ResponseField name="failure_message" type="string | null">
  Human-readable failure detail for debugging. Present only for failed bots. Do not match on its
  text; use `reason`.
</ResponseField>

<ResponseExample>
  ```json The bot object theme={null}
  {
    "id": "bot_01k0h4r9s8x7c2dvq3m5n6p4ab",
    "object": "bot",
    "meeting_id": "mtg_01k0h4r9s8x7c2dvq3m5n6p4ab",
    "meeting_url": "https://zoom.us/j/123456789",
    "join_at": "2026-07-20T14:00:00Z",
    "status": "queued",
    "bot_name": "Acme Notetaker",
    "welcome_message": "Recording this meeting for Acme",
    "language": "en",
    "recording_start": "on_join",
    "recording_mode": "audio_only",
    "silence_alert": true,
    "summary_language": "en",
    "summary_template": "discovery_call",
    "participants": [
      {
        "email": "carmen@example.com",
        "name": "Carmen"
      }
    ],
    "metadata": {
      "partner_meeting_id": "meeting-123"
    },
    "created_at": "2026-07-20T13:58:12Z",
    "ended_at": null
  }
  ```
</ResponseExample>
