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

> Everything a finished meeting produced: transcript, speakers, summary and media.

A meeting has one set of results, however many bots were sent to it. Read it after `meeting.finished`. See [A finished meeting](/meetingkit/results).

## Attributes

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

<ResponseField name="meeting_id" type="string">
  The meeting these results belong to.
</ResponseField>

<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 as speaker turns.

  <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>

    <ResponseField name="segments" type="object[]">
      Speaker turns, in order. Empty until the transcript is ready.

      <Expandable title="properties">
        <ResponseField name="speaker_id" type="string | null">
          A `speakers[].id`, or null where no speaker was detected.
        </ResponseField>

        <ResponseField name="start_seconds" type="number">
          Start of the turn, in seconds from the start of the recording.
        </ResponseField>

        <ResponseField name="end_seconds" type="number">
          End of the turn, in seconds.
        </ResponseField>

        <ResponseField name="text" type="string">
          What was said.
        </ResponseField>

        <ResponseField name="words" type="object[]">
          Each spoken word with its timing. Present only when the request asks for `include=words`.

          <Expandable title="properties">
            <ResponseField name="text" type="string">
              The word as transcribed.
            </ResponseField>

            <ResponseField name="start_seconds" type="number">
              When the word starts, in seconds from the start of the recording.
            </ResponseField>

            <ResponseField name="end_seconds" type="number">
              When the word ends, in seconds from the start of the recording.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="speakers" type="object[]">
  Everyone who spoke, listed once.

  <Expandable title="properties">
    <ResponseField name="id" type="string">
      Unique within this meeting only (`spk_1`, `spk_2`…).
    </ResponseField>

    <ResponseField name="label" type="string">
      The speaker's name when identified, otherwise a neutral label such as `Speaker 2`.
    </ResponseField>

    <ResponseField name="name" type="string | null">
      The speaker's name when identified, otherwise `null`.
    </ResponseField>

    <ResponseField name="email" type="string | null">
      The speaker's email when identified, otherwise `null`.
    </ResponseField>

    <ResponseField name="member_id" type="string | null">
      Set when the speaker is a member of the workspace.
    </ResponseField>

    <ResponseField name="identified" type="boolean">
      False leaves `name`, `email` and `member_id` null. We never guess.
    </ResponseField>

    <ResponseField name="talk_time_seconds" type="number">
      How long this speaker talked, in seconds.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="summary" type="object">
  The summary and its action items.

  <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="markdown" type="string | null">
      The whole summary, ready to render.
    </ResponseField>

    <ResponseField name="sections" type="object[]">
      The same content as data: a `heading`, then `text` or a list of `items`.

      <Expandable title="properties">
        <ResponseField name="heading" type="string | null">
          The section heading as the summary template defines it. `null` for text that precedes the first heading.
        </ResponseField>

        <ResponseField name="text" type="string | null">
          The section's paragraphs as plain text, separated by blank lines. `null` when the section holds only bullets.
        </ResponseField>

        <ResponseField name="items" type="string[]">
          The section's bullet points as plain text, nested bullets flattened in order.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="action_items" type="object[]">
      The follow-ups.

      <Expandable title="properties">
        <ResponseField name="text" type="string">
          The action item.
        </ResponseField>

        <ResponseField name="assignee" type="object | null">
          Set only when the item opens with the name of exactly one known person.

          <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>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="media" type="object">
  The recording.

  <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>

    <ResponseField name="audio_url" type="string | null">
      Signed link to the audio, valid until `expires_at`.
    </ResponseField>

    <ResponseField name="video_url" type="string | null">
      Null for audio-only recordings.
    </ResponseField>

    <ResponseField name="expires_at" type="string | null">
      When the signed links stop working, one hour after the read.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json The meeting results object theme={null}
  {
    "object": "meeting_results",
    "meeting_id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "status": "ready",
    "transcript": {
      "status": "ready",
      "language": "en",
      "segments": [
        {
          "speaker_id": "spk_1",
          "start_seconds": 0.0,
          "end_seconds": 14.2,
          "text": "Morning all, shall we start with the renewal?",
          "words": [
            { "text": "Morning", "start_seconds": 0.0, "end_seconds": 0.42 },
            { "text": "all,", "start_seconds": 0.42, "end_seconds": 0.7 }
          ]
        },
        {
          "speaker_id": "spk_2",
          "start_seconds": 14.2,
          "end_seconds": 31.8,
          "text": "Yes. We're keen, but pricing needs to move."
        }
      ]
    },
    "speakers": [
      {
        "id": "spk_1",
        "label": "Marc",
        "name": "Marc",
        "email": "marc@gurusup.com",
        "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab",
        "identified": true,
        "talk_time_seconds": 812.4
      },
      {
        "id": "spk_2",
        "label": "Speaker 2",
        "name": null,
        "email": null,
        "member_id": null,
        "identified": false,
        "talk_time_seconds": 640.1
      }
    ],
    "summary": {
      "status": "ready",
      "markdown": "## Renewal\n- Acme wants to renew",
      "sections": [
        {
          "heading": "Renewal",
          "text": null,
          "items": [
            "Acme wants to renew"
          ]
        }
      ],
      "action_items": [
        {
          "text": "Marc: send revised pricing",
          "assignee": {
            "name": "Marc",
            "email": "marc@gurusup.com",
            "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
          }
        }
      ]
    },
    "media": {
      "status": "ready",
      "duration_seconds": 1834.0,
      "audio_url": "https://storage.meetingkit.com/signed-audio",
      "video_url": "https://storage.meetingkit.com/signed-video",
      "expires_at": "2026-09-29T09:46:10Z"
    }
  }
  ```
</ResponseExample>
