Event catalogue
The scope model, the full list of events, the delivery envelope, and how the frozen workflow trigger ids map to them.
Every event Meetily can push - over a webhook or through an SSE wait - is catalogued here: what it means, what scope it needs, and the fields it carries. See Webhooks & SSE for how to subscribe, verify, and handle delivery.
Scope model
The access model is observe = Read, control = Record. Subscribing to any event below - including every recording.* event - only needs the Read scope. Controlling recording (the /v1/recording/* start/stop routes) still needs Record; watching that a recording happened is a read, not a control.
The 17 events
recording.*
| Event | Scope | Note |
|---|---|---|
recording.started | Read | |
recording.stopped | Read | Terminal. Also the recording/wait terminal state. |
recording.paused | Read | |
recording.resumed | Read | |
recording.failed | Read | Failed to start. |
recording.stop_failed | Read | Failed to stop. |
recording.error | Read | Non-terminal error detail mid-recording. |
job.*
| Event | Scope | Note |
|---|---|---|
job.submitted | Read | |
job.completed | Read | Terminal. |
job.failed | Read | Terminal. |
job.cancelled | Read | Terminal. |
job.paused | Read | |
job.resumed | Read | |
job.removed | Read | Terminal, force-remove. |
summary.*
| Event | Scope | Note |
|---|---|---|
summary.completed | Read | See "summary.completed can mean a regeneration failed" below. |
summary.failed | Read | Terminal summary failure. |
transcript.updated
| Event | Scope | Note |
|---|---|---|
transcript.updated | Read | Fires as the live transcript advances during a recording. Notification-only - carries no transcript text. |
meeting.* is not subscribable
There is no meeting.created, meeting.updated, or meeting.deleted in this catalogue. Subscribing to a meeting.* name returns 400 bad_request rather than silently accepting a subscription that would never deliver.
The envelope
Every delivery, webhook or SSE, carries the same envelope. Required keys:
| Key | Description |
|---|---|
schema_version | Envelope version. |
event_id | The dedup key. An idempotent handler keys off this, not off timing or order. |
event | One of the event names above. |
occurred_at | When the event happened. |
resource | {kind, id} - what the event is about. |
delivery_id | Identifies this specific delivery attempt. |
Present only when they apply: message, still_recording, run_id, operation_id, content_preserved.
{
"schema_version": 1,
"event_id": "0f9a1c3e-5b2d-4a71-9c84-6e0d2f8b3a15",
"event": "job.completed",
"occurred_at": "2023-11-14T22:13:20+00:00",
"resource": { "kind": "job", "id": "job-abc123" },
"delivery_id": "delivery-xyz789"
}No transcript text, summary content, or meeting content ever appears in this envelope. Fetch the actual content with your token once the event arrives - see Meetily APIs.
summary.completed can mean a regeneration failed
If you regenerate a summary and Meetily preserves the previous content instead of losing it, that outcome still fires summary.completed, not summary.failed - marked with a content_preserved field. A subscriber that only watches summary.failed for problems will miss this. Check for content_preserved on summary.completed before treating it as a clean success.
Frozen workflow trigger ids
Four public trigger ids are frozen (ADR 0024) and map onto events in this catalogue:
| Trigger id | Backing event | State |
|---|---|---|
recording-ends | recording.stopped | Live |
summary-ready | summary.completed | Live |
import-finishes | job.completed (for an import job) | Live |
transcript-ready | transcription.completed | Dormant - reserved |
transcript-ready is frozen as a contract but has no producer yet - transcription.completed isn't in the event table above, and there's no ETA for when it ships. It's reserved, not dropped: a subscription won't resolve it until the Workflows release adds the producer. See Workflows for what's planned around these ids.
Last updated on
