Debugging Bots
When a bot doesn’t do what you expected, the answer is almost always in one of three places: the status timeline, the webhook events, or a timeout that fired. This page maps symptoms to causes.
Start at the dashboard
The All Bots view shows every bot with its live status, duration, and platform — filterable by lifecycle stage (Scheduled, Joining, In Waiting Room, In Meeting, Recording, …), date, and platform, with CSV export:

For any single bot, GET /api/v1/bots/{bot_id}/detail returns the full session: platform, timings, StatusTimeline, the original request payload, and the transcript_id.
The lifecycle
A successful recording bot moves through:
Key semantics:
- Exactly one terminal in-meeting event per bot:
bot.stopped,bot.kicked,bot.denied,bot.notallowed, orbot.failed. bot.stoppedcarries abot_statusthat says why:Stopped(normal),NotAllowed,Denied, orError.bot.kickedcarriesbot_status: "Stopped"— branch on the event name to detect kicks.- Clean terminals use
status_code: 200; failure terminals usestatus_code: 500. Failuremessagestrings are prefixed"Error: ..."(unexpected) or"Failed: ..."(handled: validation, timeout, denial) — useful for alert routing. bot.donealways hasstatus_code: 200: it means the post-call pipeline finished, not that every step succeeded — check the individual artifact events.- On Zoom only,
bot.recording_permission_allowed/deniedfire betweenbot.inmeetingandbot.recording— see Zoom bots.
Live integrations receive the envelope under the event key. Older payloads may use bot_event — the CLI and MCP server implement the live-verified event model.
Symptom → cause
Watch it live
Two fast feedback loops while developing:
Or let your agent do it: the MeetStream MCP server exposes bot status, details, and transcripts as tools, so Claude can debug a bot session for you.
Status reference
Wire values you’ll see in GET /bots/{id} and webhook payloads:
Scheduled · Joining · InWaitingRoom · InMeeting · Recording · RecordingPermissionAllowed · RecordingPermissionDenied · Leaving · Stopped · NotAllowed · Denied · Error · MediaProcessing · Done · MediaExpired
MediaProcessing (post-call pipeline running) has no webhook of its own; Done corresponds to bot.done, MediaExpired to data_deletion.
Next steps
- Webhooks and Events — full payload reference
- Automatic Leave Configuration — every timeout, range, and default
- Set Up Local Server for Webhook
