Skip to main content

Meeting ended

Webhook 

Fires once a meeting's transcript and AI summary are ready. The payload mirrors /meeting.info so handlers do not need a follow-up fetch in the common case.

Personal destinations only receive meetings the authorizing user participated in. Organization destinations are roam-wide only with admin:meetings:read; otherwise the install's bot must have access to the meeting.

Event name: meeting.ended

Filter on webhook.subscribe:

{
"url": "https://example.com/hooks/meetings",
"event": "meeting.ended",
"filter": { "hasVideo": true }
}

Only deliver when the meeting was video recorded. The filter keys on "was recorded", not "the recording is ready to fetch", so a matching delivery normally arrives while the upload is still in flight. Omit filter to receive every meeting.ended event. {"hasVideo": false} is rejected at subscribe time so it is not silently treated as no filter.

No videoStatus here. /meeting.info and /meeting.list carry a videoStatus field (none, processing, available); this payload deliberately does not. meeting.ended fires once, at meeting end, when the value would be processing for essentially every recorded meeting and would already be stale by the time the delivery landed. To find out whether a recording is playable, call /meeting.info for a fresh read.

Delivered inside the standard event envelope; the schema below shows the full delivery body with this event's payload under data.

Required scope: meetings:read (user:read to include participants and the host, user:read.email for emails).

Request

Responses

Return a 200 status to acknowledge receipt of the event