Web-client adapter
Today's path. Puppeteer + Chrome. No Zoom SDK key needed; works on free-tier and paid Zoom alike.
bot api · zoom
web shipping today · linux SDK Q3POST a zoom.us URL into POST /v1/bots; we join via the web client today (no Zoom SDK key required, no native binary on your side). The Zoom Linux Meeting SDK lands in M5 for paid hosts who need authenticated joins.
overview
Two adapter paths. Today: the Zoom Web client. Same Puppeteer + Chrome stack as Meet and Teams; works for free-tier hosts, doesn't require a Zoom SDK key from you, doesn't need a native binary anywhere in your stack. Per-speaker audio comes from the WebRTC SSRC mapping; participant names from the People pane; captions from Zoom's caption WebSocket where enabled. Webhook contract identical to the other platforms.
The Linux SDK upgrade in M5. We've applied for Zoom's Linux Meeting SDK license — when it's approved (4-week wait), we'll route paid Zoom hosts through the native SDK via a Bun FFI binding. That means no more weekly DOM-breakage games with Zoom's web client and a much higher reliability ceiling for the customers who need it. The Web adapter stays in place as the fallback for free-tier hosts the SDK can't authenticate against.
Signed-in bots later. M3 brings Zoom OAuth on top of the SDK path — you register a Zoom OAuth app, your end-users go through OAuth, we store the ZAK + OBO tokens, and the bot joins as an authenticated host. That bypasses the lobby on free Zoom plans and means we can record without the host being present. This is the same "hosted multi-tenant OAuth" pattern we're rolling out for Google + Microsoft in parallel.
what you get back
Today's path. Puppeteer + Chrome. No Zoom SDK key needed; works on free-tier and paid Zoom alike.
M5 (Q3 2026). C++ FFI from Bun via bun:ffi. Higher reliability for paid Zoom hosts; replaces Web adapter for those accounts.
M3. Customer registers a Zoom OAuth app; end-users authorize; bot joins as authenticated host. Bypasses lobby on free Zoom plans.
WebRTC SSRC mapping joined to Zoom's People-pane participant names. Same JSONL shape as Meet/Teams.
Where the host has captions enabled, we read finalized utterances off Zoom's caption WebSocket. DOM-scrape fallback otherwise.
waiting_for_host, host_denied_admission, removed_from_meeting, meeting_ended, recording_disabled, lobby_timeout — surfaced on the webhook.