---
title: "Get a meeting's results"
method: GET
path: "/meetings/{id}/results"
tags: ["Meetings"]
---

# Get a meeting's results

`GET /meetings/{id}/results`

## Request

- Base URL: `https://www.happyscribe.com/api/v1`
- URL: `https://www.happyscribe.com/api/v1/meetings/{id}/results`
- Auth: API key in header `Authorization`

Transcript, speakers, summary and media in one read. Each part has its own
`status`: the transcript is ready before the summary. Media URLs are signed for one
hour (`media.expires_at`); read the results again for fresh ones.

This is the one place a meeting's results are read, whichever way it was recorded.

## Query parameters

- `include` 'words'

## Response `200`

The results.

- MeetingResults
  - `object` string: Always `meeting_results`.
  - `meeting_id` string: The meeting these results belong to.
  - `status` 'processing' | 'ready' | 'failed' | 'none': `none` until a recording produces it (and for good when nothing was recorded, or no summary for a failed transcript), `processing` while it is made, then `ready` or `failed`. Results never forecast: whether a recording will come is the meeting's `phase`, `recordings` and `effective_policy.recording`.
  - `transcript` object: The transcript as speaker turns.
    - `status` 'processing' | 'ready' | 'failed' | 'none': `none` until a recording produces it (and for good when nothing was recorded, or no summary for a failed transcript), `processing` while it is made, then `ready` or `failed`. Results never forecast: whether a recording will come is the meeting's `phase`, `recordings` and `effective_policy.recording`.
    - `language` string, nullable: The transcript's language tag.
    - `segments` object[]: Speaker turns, in order. Empty until the transcript is ready.
      - `speaker_id` string, nullable: A `speakers[].id`, or null where no speaker was detected.
      - `start_seconds` number: Start of the turn, in seconds from the start of the recording.
      - `end_seconds` number: End of the turn, in seconds.
      - `text` string: What was said.
      - `words` object[]: Each spoken word with its timing. Present only when the request asks for `include=words`.
        - `text` string: The word as transcribed.
        - `start_seconds` number: When the word starts, in seconds from the start of the recording.
        - `end_seconds` number: When the word ends, in seconds from the start of the recording.
  - `speakers` object[]: Everyone who spoke, listed once.
    - `id` string: Unique within this meeting only (`spk_1`, `spk_2`…).
    - `label` string: The speaker's name when identified, otherwise a neutral label such as `Speaker 2`.
    - `name` string, nullable: The speaker's name when identified, otherwise `null`.
    - `email` string, nullable: The speaker's email when identified, otherwise `null`.
    - `member_id` string, nullable: Set when the speaker is a member of the workspace.
    - `identified` boolean: False leaves `name`, `email` and `member_id` null. We never guess.
    - `talk_time_seconds` number: How long this speaker talked, in seconds.
  - `summary` object: The summary and its action items.
    - `status` 'processing' | 'ready' | 'failed' | 'none': `none` until a recording produces it (and for good when nothing was recorded, or no summary for a failed transcript), `processing` while it is made, then `ready` or `failed`. Results never forecast: whether a recording will come is the meeting's `phase`, `recordings` and `effective_policy.recording`.
    - `markdown` string, nullable: The whole summary, ready to render.
    - `sections` SummarySection[]: The same content as data: a `heading`, then `text` or a list of `items`.
      - `heading` string, nullable: The section heading as the summary template defines it. `null` for text that precedes the first heading.
      - `text` string, nullable: The section's paragraphs as plain text, separated by blank lines. `null` when the section holds only bullets.
      - `items` string[]: The section's bullet points as plain text, nested bullets flattened in order.
    - `action_items` object[]: The follow-ups.
      - `text` string: The action item.
      - `assignee` MeetingPerson
        - `name` string, nullable: The person's name, or `null` when unknown.
        - `email` string, nullable: The person's email, or `null` when unknown.
        - `member_id` string, nullable: Set when the person is a member of the meeting's workspace.
  - `media` object: The recording.
    - `status` 'processing' | 'ready' | 'failed' | 'none': `none` until a recording produces it (and for good when nothing was recorded, or no summary for a failed transcript), `processing` while it is made, then `ready` or `failed`. Results never forecast: whether a recording will come is the meeting's `phase`, `recordings` and `effective_policy.recording`.
    - `duration_seconds` number, nullable: Length of the recording, in seconds.
    - `audio_url` string, nullable: Signed link to the audio, valid until `expires_at`.
    - `video_url` string, nullable: Null for audio-only recordings.
    - `expires_at` string, date-time, nullable: When the signed links stop working, one hour after the read.

## Other responses

- `400`: `include` names something other than `words`.
- `401`: Missing or invalid API key, or the key is not an owner or admin of the workspace.
- `404`: No meeting with that ID, or not one the key can see.

---

[API](https://skmtc.dev/happyscribe/apis/happyscribe-api.md) - [All operations](https://skmtc.dev/happyscribe/apis/happyscribe-api/llms.txt) - [OpenAPI document](https://skmtc.dev/happyscribe/apis/happyscribe-api/revisions/1281bd968c3d?raw)
