Web-client adapter
Puppeteer + Chrome inside Xvfb. No Teams SDK key, no admin consent in your tenant — bot joins the meeting URL like any anonymous guest.
bot api · microsoft teams
shipping todayDrop a teams.microsoft.com or teams.live.com URL into POST /v1/bots; we join via the web client as an anonymous guest, capture per-speaker audio, and emit a signed webhook with the manifest path on exit.
overview
Web client only, by design. No native Teams SDK key required, no installable Teams app to register, no admin consent in your tenant. The bot drives a Puppeteer-piloted Chrome that loads teams.microsoft.com/meetingjoin with the URL you posted, fills the join form with your displayName, and lands in the lobby for the host to admit. Same Docker container, same orchestrator, same webhook contract as the Meet and Zoom adapters.
Captions + names. Teams sends finalized caption events through a data channel we intercept inside the bot's Chrome — we don't DOM-scrape the captions UI, so the captions don't drop when participants resize their windows or move panels around. Real participant names come from the People pane (which Teams keeps stable across their UI redesigns); audio is per-speaker keyed off the WebRTC SSRC mapping just like the Meet adapter.
What's not here yet. No compliance-bot path yet — that's the /product/compliance-recording-api Q4 roadmap item. No Teams Live Events (broadcast, not meeting). No Skype-for-Business legacy meetings (deprecated by MS anyway). For everything else — scheduled Teams meetings, ad-hoc meet-now sessions, channel meetings, breakout rooms (single-room) — the web adapter handles it today, at the same $0.30/hr flat as Meet and Zoom.
what you get back
Puppeteer + Chrome inside Xvfb. No Teams SDK key, no admin consent in your tenant — bot joins the meeting URL like any anonymous guest.
We tap Teams' caption-event WebSocket inside the page so captions are stable across UI redesigns and window resizes.
Real participant names from the People pane, joined to per-speaker audio via WebRTC SSRC. No 'speaker_2' anonymity in the JSONL.
Bot waits in the lobby for the organizer to admit. lobby_timeout sub-code on the webhook if nobody admits within the configured window.
VP9 tab capture and inbound chat messages, same shape as Meet/Zoom outputs. Drop-in if you're already consuming the bot API.
host_denied_admission, lobby_timeout, removed_from_meeting, meeting_ended, recording_disabled — surfaced on the completion webhook.