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 to a webhook is catalogued here: what it means, what scope it needs, and the fields it carries. Route-specific SSE waits observe only the transitions defined by their own endpoint. 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 | Capture ended, not necessarily saved meeting content. 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. |
Stopped does not mean ready
recording.stopped can arrive before Meetily finishes the transcript and saves the meeting. A fixed delay is not a readiness guarantee; check that the content you need is available before acting. For a finished summary, watch summary.completed instead. There is no callable saved-recording observation route yet; see Recording observation.
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
Gateway events share one envelope across webhook and event-wait transports. 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. |
Webhook bodies additionally carry delivery_id, the logical delivery/history-row id. It stays the same across every retry of that delivery. SSE GatewayEvent frames do not carry it.
Present only when they apply: meeting_id, message, still_recording, content_preserved.
This webhook example includes delivery_id:
{
"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 trigger ids are reserved for packaged Workflows, which are not available yet. The first three have live backing webhook events, not runnable workflow triggers:
| Trigger id | Backing event | Available today |
|---|---|---|
recording-ends | recording.stopped | Webhook event live; workflow trigger reserved |
summary-ready | summary.completed | Webhook event live; workflow trigger reserved |
import-finishes | job.completed (for an import job) | Webhook event live; workflow trigger reserved |
transcript-ready | transcription.completed | No event producer; workflow trigger 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
Meetily APIs
The full HTTP API surface: every route, its scope, request and response shapes, the error envelope, and the operation annotations - grounded in the running gateway.
Webhooks & SSE
Register webhooks, verify delivery signatures, and use the SSE wait endpoints to react to events without polling.
