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

# A finished meeting

> The summary, action items, transcript, speakers and audio of a meeting, in one read after it finishes.

When a recorded meeting's results are ready, your user opens it and sees what was said,
by whom, and what was decided.

<Frame>
  <img src="https://mintcdn.com/meeting-kit/DnaA9m78FJYvG19R/images/diagrams/meeting-detail.svg?fit=max&auto=format&n=DnaA9m78FJYvG19R&q=85&s=1874e02db492d45eebd564a55505efa9" alt="A meeting page with a summary, an action item assigned to Laia, a transcript by speaker and an audio player. Notes: the meeting.finished webhook, then GET /meetings/{id}/results; summary.sections, summary.action_items, transcript.segments with speakers member_id, and media.audio_url." width="680" height="780" data-path="images/diagrams/meeting-detail.svg" />
</Frame>

## When the meeting finishes

`meeting.finished` fires once, when the results are `ready` or `failed`. Read them all in
one call:

```bash theme={null}
curl "https://api.meetingkit.com/api/v1/meetings/mtg_01k6a2r9s8x7c2dvq3m5n6p4ab/results" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12"
```

```json 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?"
      },
      {
        "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": "Ana García",
      "name": "Ana García",
      "email": "ana@acme.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": "Ana: send revised pricing",
        "assignee": {
          "name": "Ana García",
          "email": "ana@acme.com",
          "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
        }
      }
    ]
  },
  "media": {
    "status": "ready",
    "duration_seconds": 1834.0,
    "audio_url": "https://storage.meetingkit.com/…",
    "video_url": "https://storage.meetingkit.com/…",
    "expires_at": "2026-10-13T10:41:10Z"
  }
}
```

A meeting has one set of results, however many bots were sent to it.

## What each part gives you

* **Transcript:** `segments` are speaker turns, in order, each pointing at a speaker by
  `speaker_id`. Add `?include=words` to get word timings in each segment's `words`.
* **Speakers:** each is listed once. A speaker who is one of your users carries their
  `member_id`. A guest MeetingKit recognises has a `name` and `email`. When
  `identified` is `false`, all three are `null` and `label` is neutral (`Speaker 2`):
  MeetingKit never guesses. `spk_` ids are unique within one meeting only.
* **Summary:** `markdown` is ready to render; `sections` is the same content as data.
  `action_items` are the follow-ups, with an `assignee` when an item names one known person.
* **Media:** `audio_url` and `video_url` are signed links valid until `expires_at`, one hour.
  Download what you keep, or read the results again for fresh links. `video_url` is `null`
  for audio-only recordings.

## Statuses

The top-level `status` and each part's `status` are one of:

| Status | Meaning |
| - | - |
| `none` | Nothing yet, and it stays `none` when nothing was recorded. |
| `processing` | Being made. |
| `ready` | Done. |
| `failed` | It could not be made. |

The transcript is ready before the summary: `meeting.updated` fires as each part changes,
so you can show the transcript first.
