> ## 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 meeting object

> One meeting occurrence, from any source, with its schedule, people and results.

A meeting is one real-world occurrence in one workspace. Its `mtg_` id survives reschedules, a new link, recording changes and bot retries. See [Meetings list](/meetingkit/meetings).

## Attributes

<ResponseField name="id" type="string">
  Beginning with `mtg_`. Stays the same through reschedules, URL changes and bot retries.
</ResponseField>

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

<ResponseField name="workspace_id" type="string">
  Workspace ID, beginning with `wks_`. Treat it as an opaque string.
</ResponseField>

<ResponseField name="source" type="string">
  * `calendar_connection`: From a calendar the member connected.
  * `calendar_sync`: From an event you pushed.
  * `bot`: From a bot you sent with `POST /bots`.
</ResponseField>

<ResponseField name="phase" type="string">
  About time only; what happens after the call is in `results`.

  * `upcoming`: Not started, and nothing recording yet.
  * `live`: A recording is active. An early start counts: activity beats the calendar.
  * `past`: The recording ended, or the scheduled end went by.
  * `cancelled`: The calendar event was cancelled. Listed only when you ask for `phase=cancelled`.
</ResponseField>

<ResponseField name="title" type="string | null">
  The calendar event's title, or a generated one for a bot sent without a calendar event.
</ResponseField>

<ResponseField name="starts_at" type="string | null">
  A bot meeting starts at the bot's `join_at`.
</ResponseField>

<ResponseField name="ends_at" type="string | null">
  Scheduled end, or `null` when unknown.
</ResponseField>

<ResponseField name="meeting_url" type="string | null">
  The link to join the call, or `null` when the event has none.
</ResponseField>

<ResponseField name="platform" type="string | null">
  The meeting platform, from the link. `null` for any other link (Webex, a dial-in page) or none.

  * `meet`: Google Meet.
  * `zoom`: Zoom.
  * `teams`: Microsoft Teams, Teams Live included.
</ResponseField>

<ResponseField name="organizer" type="object | null">
  Who organizes the meeting, or `null` when unknown.

  <Expandable title="properties">
    <ResponseField name="name" type="string | null">
      The person's name, or `null` when unknown.
    </ResponseField>

    <ResponseField name="email" type="string | null">
      The person's email, or `null` when unknown.
    </ResponseField>

    <ResponseField name="member_id" type="string | null">
      Set when the person is a member of the meeting's workspace.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="participants" type="object[]">
  The people on the invite, or given when the bot was sent.

  <Expandable title="properties">
    <ResponseField name="name" type="string | null">
      The person's name, or `null` when unknown.
    </ResponseField>

    <ResponseField name="email" type="string | null">
      The person's email, or `null` when unknown.
    </ResponseField>

    <ResponseField name="member_id" type="string | null">
      Set when the person is a member of the meeting's workspace.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="calendar_event" type="object | null">
  The calendar event of this meeting, the object `POST /calendar_events` returns. `null` for bot
  meetings. See [the calendar event object](/api-reference/calendar-events/object).
</ResponseField>

<ResponseField name="settings" type="object">
  What applies to this meeting, which assignment supplied each value, and every assignment that
  reaches it. On `GET /meetings`, only with `include=settings`. See [the settings
  block](/api-reference/settings/block-object).
</ResponseField>

<ResponseField name="recordings" type="object[]">
  How audio came in. Each bot sent to the meeting, oldest first.

  <Expandable title="properties">
    <ResponseField name="id" type="string">
      The bot's `bot_` ID.
    </ResponseField>

    <ResponseField name="type" type="string">
      How the audio came in. Only `bot` for now.

      Available options: `bot`.
    </ResponseField>

    <ResponseField name="status" type="string">
      * `queued`: Scheduled or waiting to join.
      * `joining`: Joining the call.
      * `in_call`: In the call and recording.
      * `completed`: Left the call; what it recorded is being or has been processed.
      * `failed`: Ended without a recording.
      * `cancelled`: Cancelled before it joined.
    </ResponseField>

    <ResponseField name="started_at" type="string | null">
      When the bot joined, or is scheduled to join.
    </ResponseField>

    <ResponseField name="ended_at" type="string | null">
      When the bot left.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="results" type="object">
  Statuses only. The content is at `GET /meetings/{id}/results`.

  <Expandable title="properties">
    <ResponseField name="status" type="string">
      The results as a whole.

      * `processing`: Being made.
      * `ready`: Done.
      * `failed`: It could not be made.
      * `none`: Nothing yet: no recording has produced it. It stays `none` when nothing was recorded, or when there is no transcript to summarize.
    </ResponseField>

    <ResponseField name="transcript" type="object">
      The transcript: its status and language.

      <Expandable title="properties">
        <ResponseField name="status" type="string">
          * `processing`: Being made.
          * `ready`: Done.
          * `failed`: It could not be made.
          * `none`: Nothing yet: no recording has produced it. It stays `none` when nothing was recorded, or when there is no transcript to summarize.
        </ResponseField>

        <ResponseField name="language" type="string | null">
          The transcript's language tag.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="summary" type="object">
      The summary: its status.

      <Expandable title="properties">
        <ResponseField name="status" type="string">
          * `processing`: Being made.
          * `ready`: Done.
          * `failed`: It could not be made.
          * `none`: Nothing yet: no recording has produced it. It stays `none` when nothing was recorded, or when there is no transcript to summarize.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="media" type="object">
      The recording: its status and length.

      <Expandable title="properties">
        <ResponseField name="status" type="string">
          * `processing`: Being made.
          * `ready`: Done.
          * `failed`: It could not be made.
          * `none`: Nothing yet: no recording has produced it. It stays `none` when nothing was recorded, or when there is no transcript to summarize.
        </ResponseField>

        <ResponseField name="duration_seconds" type="number | null">
          Length of the recording, in seconds.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="metadata" type="object">
  Your key-value pairs on this meeting, set with `PATCH /meetings/{id}`. Never used to identify a
  meeting. See [metadata](/meetingkit/setup#a-workspace-per-customer).
</ResponseField>

<ResponseField name="created_at" type="string">
  When the meeting first appeared, in ISO 8601.
</ResponseField>

<ResponseField name="updated_at" type="string">
  When anything in the meeting last changed, in ISO 8601.
</ResponseField>

<ResponseExample>
  ```json The meeting object theme={null}
  {
    "id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "object": "meeting",
    "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "source": "calendar_connection",
    "phase": "past",
    "title": "Weekly sync with Acme",
    "starts_at": "2026-09-29T09:00:00Z",
    "ends_at": "2026-09-29T09:30:00Z",
    "meeting_url": "https://meet.google.com/abc-defg-hij",
    "platform": "meet",
    "organizer": {
      "name": "Marc",
      "email": "marc@gurusup.com",
      "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
    },
    "participants": [
      {
        "name": "Marc",
        "email": "marc@gurusup.com",
        "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
      },
      {
        "name": "Ana Ruiz",
        "email": "ana@acme.com",
        "member_id": null
      }
    ],
    "calendar_event": {
      "id": "cev_01k6a2r9s8x7c2dvq3m5n6p4ab",
      "object": "calendar_event",
      "meeting_id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
      "ical_uid": "7kq2b@google.com",
      "recurring": true,
      "title": "Weekly sync with Acme",
      "starts_at": "2026-09-29T09:00:00Z",
      "ends_at": "2026-09-29T09:30:00Z",
      "meeting_url": "https://meet.google.com/abc-defg-hij",
      "organizer": { "name": "Marc", "email": "marc@gurusup.com", "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab" },
      "attendees": [
        { "name": "Marc", "email": "marc@gurusup.com", "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab", "response": "accepted" },
        { "name": "Ana Ruiz", "email": "ana@acme.com", "member_id": null, "response": "needs_action" }
      ],
      "source": "calendar_connection",
      "metadata": {},
      "cancelled_at": null,
      "created_at": "2026-09-22T08:00:00Z",
      "updated_at": "2026-09-29T09:31:10Z"
    },
    "settings": {
      "recording": {
        "enabled": true,
        "methods": {
          "bot": {
            "start": "on_join",
            "mode": "audio_and_video",
            "silence_detection": {
              "alert": true
            }
          }
        }
      },
      "transcription": {
        "language": "auto"
      },
      "summary": {
        "template": "general_meeting_notes",
        "language": "same_as_transcript"
      },
      "branding": {
        "brand_kit_id": "none"
      },
      "sources": {
        "recording.enabled": { "assignment_id": "asg_01k6a3ext00000000000000000" },
        "recording.methods.bot.start": { "assignment_id": "asg_01k6a1ana00000000000000000" },
        "recording.methods.bot.mode": { "assignment_id": "asg_01k6a1ana00000000000000000" },
        "recording.methods.bot.silence_detection.alert": { "assignment_id": "asg_01k6a1ana00000000000000000" },
        "transcription.language": { "assignment_id": "asg_01k6a1ana00000000000000000" },
        "summary.template": { "assignment_id": null, "reason": "happyscribe_default" },
        "summary.language": { "assignment_id": "asg_01k6a1ana00000000000000000" },
        "branding.brand_kit_id": { "assignment_id": "asg_01k6a0wks00000000000000000" }
      },
      "assignments": [
        { "id": "asg_01k6a3ext00000000000000000", "settings_id": "set_01k6rec00000000000000000000", "scope": ["member:mem_01k69x9s8x7c2dvq3m5n6p4ab", "meetings:external"], "own": false },
        { "id": "asg_01k6a1ana00000000000000000", "settings_id": "set_01k6sa1es0000000000000000a", "scope": ["member:mem_01k69x9s8x7c2dvq3m5n6p4ab"], "own": false },
        { "id": "asg_01k6a0wks00000000000000000", "settings_id": "set_01k6wks00000000000000000000", "scope": ["workspace:wks_01k6a2r9s8x7c2dvq3m5n6p4ab"], "own": false }
      ]
    },
    "recordings": [
      {
        "id": "bot_01k6b0r9s8x7c2dvq3m5n6p4ab",
        "type": "bot",
        "status": "completed",
        "started_at": "2026-09-29T09:00:00Z",
        "ended_at": "2026-09-29T09:31:10Z"
      }
    ],
    "results": {
      "status": "ready",
      "transcript": {
        "status": "ready",
        "language": "en"
      },
      "summary": {
        "status": "ready"
      },
      "media": {
        "status": "ready",
        "duration_seconds": 1834.0
      }
    },
    "metadata": {},
    "created_at": "2026-09-22T10:14:03Z",
    "updated_at": "2026-09-29T09:41:10Z"
  }
  ```
</ResponseExample>
