Zoom Meeting Bots
Send API-controlled bots into Zoom meetings to record, transcribe, and interact
MeetStream bots join Zoom meetings through the Zoom Meeting SDK. Zoom is the one platform that needs a one-time setup (Google Meet and Microsoft Teams work with zero configuration) — after that, sending a bot is the same single create_bot call as everywhere else.
One-time setup
- Create a General App in the Zoom App Marketplace (Develop → Build App → General App). User-managed or admin-managed both work.
- Set the OAuth Redirect URL to
https://api.meetstream.ai/api/v1/admin/zoom/oauth/callbackand addhttps://meetstream.aito the OAuth Allow List. - Under Features → Embed, enable Meeting SDK (leave Device OAuth off).
- Copy the Client ID and Client Secret into the MeetStream Dashboard → Integrations → Zoom, and complete the OAuth authorization.
Full walkthrough: Zoom Marketplace App Setup.
Development-mode limitation: with development credentials your bot can only join meetings hosted by your own Zoom account. To join anyone’s meetings, submit the app for production approval — see Zoom App Production Submission. Review typically takes a few business days.
Joining as your end users (OBF / hosted OAuth)
If you’re building a product where your customers connect their own Zoom accounts, use MeetStream’s hosted On-Behalf-Of flow. You register one Zoom OAuth app; each end user authorizes it once, and MeetStream stores one connection per end user keyed by their Zoom user ID.
Connection management endpoints (/api/v1/zoom/oauth/...) never return token material — only identity and connection state. Full flow, required scopes (user:read:user, user:read:token), and error handling: Zoom OBF Implementation.
The recording permission flow
Zoom is the only platform where recording is gated on host consent. After bot.inmeeting, the bot requests recording permission and waits — so there can be a visible gap before bot.recording (on Meet and Teams it fires within about a second).
- Host grants →
bot.recording_permission_allowed→bot.recording - Host denies, or doesn’t respond within
recording_permission_denied_timeout→bot.recording_permission_denied→bot.leaving→bot.stopped(a clean stop, notbot.denied)
recording_permission_denied_timeout accepts 60–300 seconds (default 60) and is ignored on the other platforms.
Zoom-specific behavior at a glance
Troubleshooting joins
The usual causes when a Zoom bot fails to join:
- Invalid or expired meeting link
- App still in development mode and the meeting isn’t hosted by your account
- Bot stuck in the waiting room until
waiting_room_timeoutfired (bot.notallowed) - Password-protected meeting link missing its
?pwd=component - OBF: the end user’s connection was revoked (password change, app uninstall, or 90+ days idle) — they need to reconnect
Watch it live with meetstream listen or the Debugging guide.
