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
- 200
Return a 200 status to acknowledge receipt of the event