> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mavioapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook Events

> Reference for all webhook event types, their payloads, and when they are triggered.

## Event types

Subscribe to the events relevant to your integration. Each event includes a `type` string and a `data` object with event-specific fields.

| Event                   | Description                                                      |
| ----------------------- | ---------------------------------------------------------------- |
| `meeting.completed`     | A meeting recording has finished and the recording is available. |
| `transcript.ready`      | A transcript has been generated and is available for retrieval.  |
| `summary.ready`         | A summary has been generated (including after regeneration).     |
| `action_item.created`   | One or more action items were extracted from a meeting.          |
| `action_item.completed` | An action item was marked as completed.                          |

***

## meeting.completed

Fired when a meeting recording ends and the recording file is processed. This is typically the first event in the pipeline after a meeting finishes.

```json Payload theme={null}
{
  "id": "evt_mc_a1b2c3d4",
  "type": "meeting.completed",
  "created_at": "2026-04-10T14:48:00Z",
  "data": {
    "meeting_id": "mtg_8f3k2j1m4n5p",
    "title": "Weekly Product Sync",
    "platform": "zoom",
    "started_at": "2026-04-10T14:00:00Z",
    "ended_at": "2026-04-10T14:47:32Z",
    "duration_seconds": 2852,
    "participant_count": 6,
    "recording": {
      "file_size_bytes": 34521088,
      "format": "webm"
    }
  }
}
```

<ResponseField name="data.meeting_id" type="string">
  The unique meeting identifier. Use this to fetch the full meeting object via [GET /meetings/:id](/api-reference/meetings/get-meeting).
</ResponseField>

<ResponseField name="data.title" type="string">
  The meeting title.
</ResponseField>

<ResponseField name="data.platform" type="string">
  Platform where the meeting was recorded.
</ResponseField>

<ResponseField name="data.started_at" type="string">
  When the recording started.
</ResponseField>

<ResponseField name="data.ended_at" type="string">
  When the recording ended.
</ResponseField>

<ResponseField name="data.duration_seconds" type="integer">
  Duration in seconds.
</ResponseField>

<ResponseField name="data.participant_count" type="integer">
  Number of identified participants.
</ResponseField>

<ResponseField name="data.recording" type="object">
  Recording metadata including `file_size_bytes` and `format`.
</ResponseField>

***

## transcript.ready

Fired when the transcript for a meeting has been generated. This typically occurs 1-3 minutes after `meeting.completed`, depending on the meeting length.

```json Payload theme={null}
{
  "id": "evt_tr_e5f6g7h8",
  "type": "transcript.ready",
  "created_at": "2026-04-10T14:50:22Z",
  "data": {
    "meeting_id": "mtg_8f3k2j1m4n5p",
    "transcript_id": "trs_9a2b3c4d5e6f",
    "language": "en",
    "duration_seconds": 2852,
    "word_count": 4231,
    "confidence": 0.96,
    "segment_count": 87
  }
}
```

<ResponseField name="data.meeting_id" type="string">
  The meeting this transcript belongs to.
</ResponseField>

<ResponseField name="data.transcript_id" type="string">
  The transcript identifier. Use this to fetch the full transcript via [GET /transcripts/:id](/api-reference/transcripts/get-transcript).
</ResponseField>

<ResponseField name="data.language" type="string">
  Detected language (ISO 639-1).
</ResponseField>

<ResponseField name="data.duration_seconds" type="integer">
  Duration of the transcribed audio.
</ResponseField>

<ResponseField name="data.word_count" type="integer">
  Total words in the transcript.
</ResponseField>

<ResponseField name="data.confidence" type="number">
  Overall transcription confidence score (0 to 1).
</ResponseField>

<ResponseField name="data.segment_count" type="integer">
  Number of speaker-attributed segments.
</ResponseField>

***

## summary.ready

Fired when a summary has been generated or regenerated. This typically occurs 15-30 seconds after `transcript.ready`.

```json Payload theme={null}
{
  "id": "evt_sr_i9j0k1l2",
  "type": "summary.ready",
  "created_at": "2026-04-10T14:51:44Z",
  "data": {
    "meeting_id": "mtg_8f3k2j1m4n5p",
    "summary_id": "sum_1g2h3i4j5k6l",
    "format": "structured",
    "language": "en",
    "action_item_count": 4,
    "decision_count": 2,
    "is_regeneration": false
  }
}
```

<ResponseField name="data.meeting_id" type="string">
  The meeting this summary belongs to.
</ResponseField>

<ResponseField name="data.summary_id" type="string">
  The summary identifier. Use this to fetch the full summary via [GET /summaries/:id](/api-reference/summaries/get-summary).
</ResponseField>

<ResponseField name="data.format" type="string">
  Summary format: `structured`, `narrative`, or `bullet_points`.
</ResponseField>

<ResponseField name="data.language" type="string">
  Language of the summary.
</ResponseField>

<ResponseField name="data.action_item_count" type="integer">
  Number of action items extracted.
</ResponseField>

<ResponseField name="data.decision_count" type="integer">
  Number of key decisions identified.
</ResponseField>

<ResponseField name="data.is_regeneration" type="boolean">
  `true` if this summary was produced by a [regeneration request](/api-reference/summaries/regenerate-summary), `false` if it was the initial generation.
</ResponseField>

***

## action\_item.created

Fired when action items are extracted from a meeting. This event fires once per meeting and includes all action items identified in that meeting.

```json Payload theme={null}
{
  "id": "evt_ac_m3n4o5p6",
  "type": "action_item.created",
  "created_at": "2026-04-10T14:51:44Z",
  "data": {
    "meeting_id": "mtg_8f3k2j1m4n5p",
    "meeting_title": "Weekly Product Sync",
    "action_items": [
      {
        "id": "act_p6q7r8",
        "title": "Complete Stripe payment integration testing",
        "assignee": "Priya Patel",
        "due_date": "2026-04-11",
        "priority": "high"
      },
      {
        "id": "act_s9t0u1",
        "title": "Fix checkout page crash on Safari (BUG-442)",
        "assignee": "James Rodriguez",
        "due_date": "2026-04-14",
        "priority": "high"
      },
      {
        "id": "act_v2w3x4",
        "title": "Fix email notification delay (BUG-445)",
        "assignee": "James Rodriguez",
        "due_date": "2026-04-14",
        "priority": "high"
      },
      {
        "id": "act_y5z6a7",
        "title": "Prepare sprint 14 backlog for Friday planning",
        "assignee": "Sarah Chen",
        "due_date": "2026-04-12",
        "priority": "medium"
      }
    ]
  }
}
```

<ResponseField name="data.meeting_id" type="string">
  The meeting where these action items were identified.
</ResponseField>

<ResponseField name="data.meeting_title" type="string">
  Title of the meeting.
</ResponseField>

<ResponseField name="data.action_items" type="array">
  Array of action item summaries. Each includes `id`, `title`, `assignee`, `due_date`, and `priority`. Use the [List action items](/api-reference/action-items/list-action-items) endpoint for full details.
</ResponseField>

***

## action\_item.completed

Fired when an action item is marked as completed, either via the API or from the Mavio dashboard.

```json Payload theme={null}
{
  "id": "evt_ao_q7r8s9t0",
  "type": "action_item.completed",
  "created_at": "2026-04-11T16:32:08Z",
  "data": {
    "action_item_id": "act_p6q7r8",
    "title": "Complete Stripe payment integration testing",
    "assignee": "Priya Patel",
    "meeting_id": "mtg_8f3k2j1m4n5p",
    "meeting_title": "Weekly Product Sync",
    "completed_at": "2026-04-11T16:32:08Z",
    "completed_by": "api"
  }
}
```

<ResponseField name="data.action_item_id" type="string">
  The completed action item identifier.
</ResponseField>

<ResponseField name="data.title" type="string">
  Title of the completed action item.
</ResponseField>

<ResponseField name="data.assignee" type="string">
  Name of the person who was assigned.
</ResponseField>

<ResponseField name="data.meeting_id" type="string">
  The meeting this action item came from.
</ResponseField>

<ResponseField name="data.meeting_title" type="string">
  Title of the meeting.
</ResponseField>

<ResponseField name="data.completed_at" type="string">
  ISO 8601 timestamp of completion.
</ResponseField>

<ResponseField name="data.completed_by" type="string">
  How the item was completed: `api` (via the API), `dashboard` (via the Mavio web app), or `integration` (via a connected integration like Slack).
</ResponseField>

***

## Event timeline

For a typical meeting, events fire in this order:

```
meeting.completed     →  Recording is ready
    ↓ (~1-3 min)
transcript.ready      →  Transcript is available
    ↓ (~15-30 sec)
summary.ready         →  Summary is generated
action_item.created   →  Action items are extracted (fires with summary.ready)
```

<Tip>
  If you only need to know when a meeting is fully processed, subscribe to `summary.ready`. By the time this event fires, the transcript, summary, and action items are all available.
</Tip>
