// Webhooks

Webhooks integration

MeetStream webhooks push every step of a bot's life to your endpoint the moment it happens: dispatch, lobby, admission, recording, how it left.

18 event typesHMAC-SHA256 signingWorkspace or per-botBest-effort delivery
Overview

What you get with webhooks

Each post-call artefact is pushed as it lands, so nothing waits on a timer.

One request returns an MP4 recording, per-participant audio and video, and a transcript
Send a meeting link, and every step of the call reaches your endpoint.
Every lifecycle change

The bot lifecycle reaches your endpoint as it happens, with the reason.

Post-call artefacts

Audio, transcript and video, each sent as it becomes ready to fetch.

Workspace endpoints

Subscriptions, a signing secret and a delivery log, all in the dashboard.

A URL per bot

For tenant routing, with your own attributes echoed in every event.

Deliveries from a workspace endpoint carry HMAC-SHA256 signatures and timestamps, and the CLI has a listen command for work on your own machine.

Lifecycle

Why webhooks and not polling

The moments that matter in a bot's life are changes of state, and each one has a reason attached.

  • Did the host admit the bot?
    And did they answer the recording prompt on Zoom?
  • Why did the bot leave?
    Because everyone left, or because the host removed it.
  • Work starts right away
    The summary, the CRM write or the chat post begins on the event.
A polling loopYou ask, on a timerReads the end state lateKeeps none of the reasonsMost replies say nothing changedWebhooksWe call you, on the eventEach change arrives with its reasonThen one event per artefactYour work starts right away
The same three questions, answered two ways.

The full lifecycle, event by event

Lifecycle stepWhen it firesNotes
ScheduledA scheduled bot is confirmedFires when you book a join time. The payload carries that time
DispatchedThe bot is on its way to the meetingFires up to three times when you turn on join retries
In the waiting roomThe bot asked to join and is waitingUnder Meet host management, hosts and co-hosts see the request
In the meetingThe host admitted the botExactly once per bot
Recording allowedThe Zoom host granted recordingZoom only
Recording declinedThe Zoom host declined or the prompt timed outZoom only. The bot then leaves and closes cleanly
RecordingCapture beganOn Meet and Teams this follows admission within about a second
LeavingThe bot is on its way outComes just before the final event on graceful exits
Final eventThe bot is goneExactly one of the five outcomes below
bot.scheduledoptionalbot.joiningup to 3xbot.in_waiting_roomhost admitsbot.inmeetingexactly oncebot.recordingcapture onterminalexactly once
The lifecycle phase, where the terminal event is one of bot.stopped, bot.kicked, bot.denied, bot.notallowed or bot.failed, and post-call events follow later.
Lifecycle

Why did the bot leave the meeting?

Five outcomes, one event each, so your product can say what actually happened.

  • Route on the event name
    A removed bot and a clean exit share one status, and the event name tells them apart.
  • Map them to your wording
    Then people see the real reason a bot left.
  • The exact names
    The webhook events guide lists every one.
How did the bot leave?Everyone left, or you stopped itA clean exitThe host removed itKickedThe host never admitted itDenied or not allowedSomething brokeFailed
Five outcomes, one event each. The table above has the exact names.
OutcomeCauseStatus code
Clean exitThe meeting ended, the API stopped the bot, a timeout hit, or the host ended the call200
RemovedThe host or another participant removed the bot200
Join declinedThe host turned down the join request500
Lobby timeoutThe lobby or waiting-room timeout ran out500
Ended earlyThe session ended before the bot finished the call500

Post-call events for every artefact

Once the bot leaves, the audio, transcript and video are prepared. Each one reports in as it is done.

An audio event

The mixed recording and the per-participant audio are ready to fetch.

A transcript event

The post-call transcript is ready. Streaming engines deliver text live instead.

A video event

The MP4 and the per-participant video are ready to fetch.

Completion and deletion

One says every artefact is finished. One says media has expired, so cached links can be dropped.

Bot leavesTerminal eventAudio readyMixed and per personTranscript readyOr streamed liveVideo readyMP4 and per personBot leavesTerminal eventAudio readyMixed and per personTranscript readyOr streamed liveVideo readyMP4 and per person
They arrive in any order, each at most once.

Fetch each artefact on its own event rather than waiting for the completion event.

Store your media in your own S3 bucket to keep it as long as you like.

Delivery

What a webhook payload contains

Route on the event name, and read the status code beside it.

  • 200 or 500
    A success or a clean exit reads 200. Every other outcome reads 500, with a message naming the cause.
  • Your own attributes
    Anything you set when you create the bot comes back in every event.
  • Multi-tenant routing
    That is how a product sends each delivery straight to the right customer.
A lifecycle event, as deliveredjson
{
  "bot_event": "bot.inmeeting",
  "bot_id": "6667fd0c-0165-471a-a880-06a1180be377",
  "bot_status": "InMeeting",
  "message": "Bot successfully joined the meeting",
  "status_code": 200,
  "timestamp": "2026-02-27T07:11:51.863543+00:00",
  "custom_attributes": { "tenant": "acme", "env": "prod" }
}

Webhook delivery guarantees

GuaranteeWhat MeetStream promises
DeliveryBest-effort. Every event is sent once, at the moment it happens
UniquenessAdmission and the final event fire exactly once per bot. Post-call events fire at most once each
OrderingLifecycle events are sent in order. Post-call artefact events arrive as each one becomes ready
RepeatsDispatch repeats up to three times when join retries are on

Design for the first row. Reply fast, process later.

Event happensOnce, at the momentOne POSTTo your endpointYou reply 2xxThen do the workMissed it?Poll bot statusEvent happensOnce, at the momentOne POSTTo your endpointYou reply 2xxThen do the workMissed it?Poll bot status
One send per event. Polling bot status is the fallback.

Keep the bot status endpoint as your fallback for any delivery that lands while your service restarts. Talk to us about retry and delivery terms for your workload.

Security

Enterprise-level security, keep your data private.

The certificate, the audit status and the Trust Center are all on the security page.

Robust and reliable

MeetStream is ISO 27001 certified. SOC 2 Type 2 is under audit rather than complete.

GDPR compliant

MeetStream is GDPR compliant, and bots run in the United States by default.

Signed on every delivery

Workspace endpoints issue a signing secret once, at creation.

SOC 2Type 2 (Under Audit)
ISO 27001Certified
GDPRCompliant

Build a reliable webhook handler

Reply first, work later

Respond with a 2xx at once, so a slow system of your own still receives every event.

Check the signature

On deliveries from a workspace endpoint.

Route on the event name

Final events close the session, and each artefact event triggers its own fetch.

Store and de-duplicate

Keep the bot, the event and the timestamp together, then drop duplicates.

Poll bot status for any session that has gone quiet past your own timeout.

Register endpoints: per bot or for the workspaceWorkspace webhooks guide: request, response and options in the docs

Signing and verification

Every delivery carries a signature header holding the HMAC-SHA256 of the raw request body, and a timestamp header in ISO 8601 form.

Work out the HMAC again over the exact bytes you received and compare in constant time. Accept only what falls inside your tolerance window.

Secret issuedOnce, at creationTwo headersSignature andtimestampRecompute HMACSHA256, raw bodyCompareConstant time, inwindowSecret issuedOnce, at creationTwo headersSignature and timestampRecompute HMACSHA256, raw bodyCompareConstant time, in window
Four steps, on the exact bytes you received.

The verification guide has the header names and reference code.

FAQ

Got a question? We got the answer.

Common questions about webhooks. Event names, delivery, signing and how to build a handler.

Which events does MeetStream send?

The lifecycle runs from scheduled to dispatched, waiting room, admitted, recording, the two Zoom recording-permission events, leaving, then one final event out of five.

After the call you get one event each for audio, transcript and video, a completion event and a deletion event.

The webhooks guide lists the exact names.

Are webhooks retried if my endpoint is down?

Delivery is best-effort, so each event is sent once at the moment it happens.

Reply with a 2xx straight away and do the work afterwards.

Keep polling on bot status as a fallback for anything that has to land.

How do I know a webhook really came from MeetStream?

Signing comes with workspace endpoints, so set one up in the dashboard and you get a signing secret.

Each delivery then carries a signature header, an HMAC-SHA256 of the raw body, plus a timestamp header.

Work out the HMAC with your secret and compare the two.

Can I set one endpoint for everything?

Yes. A workspace endpoint in the dashboard receives every event you subscribe to, for every bot you run.

Per-bot callback URLs still work for tenant routing, and your own attributes travel in every event.

In what order do post-call events arrive?

The audio, transcript and video events arrive in any order, each at most once.

A completion event fires when every artefact is finished. Fetch each on its own event and the order stops mattering.

Why did the join event fire more than once?

Join retries. The dispatch event fires up to three times when you turn retries on.

Admission and the final event fire exactly once per bot, so key your state on those two.

How do I test webhooks locally?

Run the listen command in the MeetStream CLI.

Or open a local server behind a tunnel such as ngrok and point the bot callback at that URL.

The dashboard Logs tab shows every recent delivery.

Every step of the call, at your endpoint.

Point an endpoint at MeetStream, send a bot to a test meeting, and watch every event arrive.

18 event types
HMAC-SHA256 signing
Per-bot routing
Post-call artefacts
Delivery log

Wire your first webhook in ten minutes

Point an endpoint at MeetStream, send a bot to a test meeting, and watch every event arrive.