Meetily

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

EventScopeNote
recording.startedRead
recording.stoppedReadTerminal. Also the recording/wait terminal state.
recording.pausedRead
recording.resumedRead
recording.failedReadFailed to start.
recording.stop_failedReadFailed to stop.
recording.errorReadNon-terminal error detail mid-recording.

job.*

EventScopeNote
job.submittedRead
job.completedReadTerminal.
job.failedReadTerminal.
job.cancelledReadTerminal.
job.pausedRead
job.resumedRead
job.removedReadTerminal, force-remove.

summary.*

EventScopeNote
summary.completedReadSee "summary.completed can mean a regeneration failed" below.
summary.failedReadTerminal summary failure.

transcript.updated

EventScopeNote
transcript.updatedReadFires 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:

KeyDescription
schema_versionEnvelope version.
event_idThe dedup key. An idempotent handler keys off this, not off timing or order.
eventOne of the event names above.
occurred_atWhen the event happened.
resource{kind, id} - what the event is about.
delivery_idIdentifies 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 idBacking eventState
recording-endsrecording.stoppedLive
summary-readysummary.completedLive
import-finishesjob.completed (for an import job)Live
transcript-readytranscription.completedDormant - 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

On this page