MeetStream Guide: Webhook Events
This guide explains how to receive webhook events from MeetStream, what each event means, and how to trigger follow-up actions like fetching audio, video, or transcription.
Applies to: Google Meet, Zoom, Microsoft Teams.
Support: docs.meetstream.ai • API: api.meetstream.ai
1) Add your webhook URL while creating the bot
When you create a bot, include your webhook endpoint in the payload as:
MeetStream will send HTTP POST requests to your callback_url whenever the bot’s status changes during its lifecycle and when post-call processing completes.
Example (Create Agent + callback_url)
Docs: https://docs.meetstream.ai/api-reference/api-reference/bot-endpoints/create-agent
Tip: Your webhook should respond quickly with 2xx (e.g., 200) to acknowledge receipt.
2) Webhook payload format
Every webhook notification follows this structure:
Fields
event— event type (see below)bot_id— unique identifier for the bot sessionbot_status— status detail (see Status Reference)message— human readable explanationstatus_code— always200timestamp— ISO-8601 timestampcustom_attributes— echoed back if you provided it when creating the bot
3) Event types (what you’ll receive)
MeetStream sends two categories of webhook events: bot lifecycle events and post-call processing events.
A) Bot lifecycle events
These events track the bot’s presence in the meeting:
Important notes:
- Every bot starts with
bot.joining. - If the bot joins successfully, you will receive
bot.inmeeting. - The lifecycle ends with exactly one
bot.stoppedevent. - If the bot fails to join (timeout/denied/error), you may get
bot.stoppedright afterbot.joiningwithout abot.inmeeting.
B) Post-call processing events
After bot.stopped, MeetStream continues processing the recorded session in the background. You will receive additional webhook events as each artifact finishes processing:
These events arrive asynchronously after the bot has stopped — the order and timing depend on processing duration for each artifact.
Example payloads
audio.processed
transcription.processed
video.processed
data_deletion
4) Status reference (bot_status)
bot_status gives more detail, especially for bot.stopped.
5) Recommended actions based on webhook events
Your server can react to webhook events and run follow-up workflows.
A) On bot.inmeeting
Typical actions:
- Update your UI/state: “bot is live”
- Start timers / internal tracking
- Notify other systems that recording has started
B) On bot.stopped (terminal)
This is the moment to mark the session as complete. Artifacts may still be processing at this point.
Recommended flow:
- Receive
bot.stopped - Read
bot_status - If
bot_statusisStopped(normal exit), wait for processing events before fetching outputs. - If
bot_statusisNotAllowed/Denied/Error, log the reason (message) and alert/handle accordingly.
C) On post-call processing events
Once you receive audio.processed, transcription.processed, or video.processed, the corresponding artifact is ready to fetch:
- Audio: https://docs.meetstream.ai/api-reference/api-reference/bot-endpoints/get-bot-audio
- Video: https://docs.meetstream.ai/api-reference/api-reference/bot-endpoints/get-bot-video
D) On data_deletion
Confirms that bot data has been removed. Update your records accordingly — further fetch requests for this bot’s artifacts will fail.
6) Webhook signing (optional but recommended)
If you configure a webhook secret, MeetStream includes an HMAC signature in headers:
X-MeetStream-Signature:sha256=<hex_digest>X-MeetStream-Timestamp: ISO 8601 timestamp
Verification steps:
- Compute
HMAC-SHA256(your_secret, raw_request_body) - Compare with
X-MeetStream-Signature(stripsha256=prefix) - Optionally validate timestamp is within an acceptable window (replay protection)
7) Retry behavior (important)
- Webhook delivery is best-effort.
- If your endpoint returns a non-2xx, the webhook is not retried.
- A bot may send up to 3
bot.joiningevents if join retries are configured. bot.inmeetingandbot.stoppedare sent at most once.- Post-call processing events (
audio.processed,transcription.processed,video.processed,data_deletion) are sent at most once.
8) Minimal webhook handler checklist
- ✅ Accept
POSTrequests atcallback_url - ✅ Verify signature (if enabled)
- ✅ Always respond 2xx quickly
- ✅ Idempotent handling (store processed event IDs or de-dupe by
{bot_id, event, timestamp}) - ✅ On
bot.stopped, mark session complete - ✅ On
audio.processed/video.processed/transcription.processed, fetch the corresponding artifact - ✅ On
data_deletion, clean up local references
If you want, share your preferred stack (Node/FastAPI/Cloudflare Workers), and I’ll provide a ready-to-paste webhook handler example.
