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

# Meetings list

> The user's live, upcoming and past meetings, each with a label, and a switch to record one or not.

The meetings screen has three sections: live now, upcoming and past. Every meeting carries its
label, and before the call a switch to record it or not.

<Frame>
  <img src="https://mintcdn.com/meeting-kit/DnaA9m78FJYvG19R/images/diagrams/meetings-list.svg?fit=max&auto=format&n=DnaA9m78FJYvG19R&q=85&s=ffef9629a6a41f9cc6d547768b613e92" alt="A meetings screen with Live now, Upcoming and Past sections. Rows read Recording (live), Will record or Won't record with a switch, Processing, Ready, or Not recorded. Notes: each section is GET /meetings with member_id and phase; Recording is phase live; Will record and Won't record are settings.recording.enabled; the switch is a meeting: settings assignment; Processing and Ready are results.status; Not recorded is past with results.status none." width="680" height="705" data-path="images/diagrams/meetings-list.svg" />
</Frame>

## The sections

```bash theme={null}
curl -G "https://api.meetingkit.com/api/v1/meetings" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -d workspace_id=wks_01k6a2r9s8x7c2dvq3m5n6p4ab \
  -d member_id=mem_01k69x9s8x7c2dvq3m5n6p4ab \
  -d phase=upcoming \
  -d include=settings
```

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
      "object": "meeting",
      "source": "calendar_connection",
      "phase": "upcoming",
      "title": "Weekly sync with Acme",
      "starts_at": "2026-10-13T09:00:00Z",
      "ends_at": "2026-10-13T09:30:00Z",
      "meeting_url": "https://meet.google.com/abc-defg-hij",
      "platform": "meet",
      "participants": [
        {
          "name": "Ana García",
          "email": "ana@acme.com",
          "member_id": "mem_01k69x9s8x7c2dvq3m5n6p4ab"
        },
        { "name": "Leo Park", "email": "leo@client.com", "member_id": null }
      ],
      "settings": {
        "recording": { "enabled": true, "…": "…" },
        "sources": {
          "recording.enabled": { "assignment_id": "asg_01k6a3ext00000000000000000" },
          "…": "…"
        },
        "…": "…"
      },
      "results": { "status": "none", "…": "…" },
      "…": "…"
    }
  ],
  "has_more": true,
  "_links": { "next": { "url": "https://api.meetingkit.com/api/v1/meetings?…&cursor=…" } }
}
```

| Section | `phase` | Order |
| - | - | - |
| Live now | `live` | Latest first |
| Upcoming | `upcoming` | Soonest first |
| Past | `past` | Latest first |

`member_id` keeps the meetings the user is invited to, or sent the bot to, under either
their email or the calendar account they connected. `starts_after` and `starts_before`
narrow a section to a window. While `has_more` is `true`, request `_links.next.url` as it is.
Cancelled meetings are listed only with `phase=cancelled`.

Every calendar event is a meeting, including those with no link to join: they carry
`settings.sources["recording.enabled"].reason: "no_meeting_url"` and can't be recorded. Hide
them by default, or show them without the switch.

`platform` is `meet`, `zoom` or `teams` (`null` for other links). A participant who is one
of your users carries their `member_id`.

## The label

| Label | Read |
| - | - |
| Will record | `phase: "upcoming"` and `settings.recording.enabled` |
| Won't record | `phase: "upcoming"` and not `settings.recording.enabled` |
| Live | `phase: "live"`: the notetaker is joining or in the call |
| Processing | `results.status: "processing"` |
| Ready | `results.status: "ready"` |
| Not recorded | `phase` is `past` or `cancelled`, and `results.status: "none"` |

`settings.sources["recording.enabled"]` says which assignment decided, or why none did, if
you want to show it: see [the settings block](/api-reference/settings/block-object).

## The switch

Record one meeting, or skip it, whatever the user's and the company's rules say:

```bash theme={null}
curl -X POST "https://api.meetingkit.com/api/v1/settings" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{
    "recording": { "enabled": false },
    "assignments": [{ "scope": ["meeting:mtg_01k6a2r9s8x7c2dvq3m5n6p4ab"] }]
  }'
```

The switch applies to this occurrence only. Once the meeting has its own settings (its
`settings.assignments` has one with `own: true`), flip it with `PATCH /settings/{id}`, and hand
the meeting back to the user's and the company's rules with `recording.enabled: "inherit"`.
Turning a live meeting off makes the notetaker leave; what it recorded so far is kept. While a
bot is still joining, this answers `503 provider_unavailable`: try again a few seconds later.

## Keep the list current

Your webhook endpoint receives, for the workspace's meetings:

| Event | Sent when |
| - | - |
| `meeting.created` | A meeting first appears. |
| `meeting.updated` | Anything changes: schedule, people, the recording decision, phase, results. |
| `meeting.finished` | Once, when its results are `ready` or `failed`. |

On each one, read `GET /meetings/{id}` and save what it returns: events can arrive out of
order, and the read is the current state. A meeting that becomes `past` only because its end
time went by, with nothing recorded, sends no event.

To attach your own ids to a meeting, `PATCH /meetings/{id}` with `metadata`.
