MeetStream Guide: Per-Participant Video Streams
This guide explains how to capture individual video recordings per participant in a meeting. Instead of a single composite screen recording, you receive a separate WebM video file for each participant’s webcam and any screen shares.
Supported platforms: Google Meet, Zoom, Microsoft Teams.
1) What you need
- A MeetStream API key (see the Quickstart Guide).
- A meeting link (Google Meet, Zoom, or Microsoft Teams).
- Set
video_separate_streams: truein your Create Bot request.
2) Create a bot with per-participant video
Use the Create Agent endpoint: https://docs.meetstream.ai/api-reference/api-reference/bot-endpoints/create-agent
Minimal example
Full example with recording config
Parameter reference
Tip: You can also pass
video_separate_streamsnested insiderecording_config:The top-level parameter takes precedence if both are set.
3) What happens during the meeting
Once the bot joins, it automatically:
- Captures each participant’s webcam feed as a separate video stream.
- Captures screen shares as separate streams.
- Records up to 6 concurrent webcam streams. If more than 6 participants have cameras on, additional cameras are queued and start recording when a slot frees up.
- Screen shares are always captured (1 concurrent on Teams/Zoom, multiple possible on Google Meet).
No additional configuration is needed per participant — the bot handles everything.
4) Retrieve per-participant video streams
After the bot leaves and video processing completes, call:
Response when processing is complete
Response when processing is still in progress
HTTP status 202 is returned when processing is not yet complete. The stage field indicates the current processing step. Poll again after 10-30 seconds.
5) Download the video files
Each segment in the response contains a url field — a presigned S3 URL that allows direct download without additional authentication.
Important: Presigned URLs expire after 10 minutes. If a URL has expired, call
get_recording_streamsagain to get fresh URLs.
File format
Audio is available separately via the standard Get Bot Audio endpoint.
6) Understanding segments
A participant may have multiple segments. A new segment is created when:
- A screen share resolution changes (e.g., switching from fullscreen 1080p to a smaller window) on Teams or Zoom.
- A participant shares their screen multiple times (each share session is a separate segment).
- A webcam video dimension change occurs on Teams.
Camera off/on does not create a new segment — the bot maintains a continuous recording file per participant across camera toggles.
Segments are ordered by segment_index and are chronologically sequential. Use the duration_seconds field to determine segment timing.
7) Video resolution by platform
Webcam and screen share resolutions differ by platform:
8) Using both composite and per-participant video
You can enable both video_required and video_separate_streams simultaneously:
This produces:
- A composite MP4 (single screen recording of the meeting view) — retrieve via the Get Bot Video endpoint.
- Per-participant WebM files — retrieve via the Get Recording Streams endpoint.
9) Webhook notifications
If you have webhooks configured, you will receive notifications when video processing starts and completes. Use the video_status field in webhook payloads or poll get_recording_streams until video_status is "Success".
10) Troubleshooting
-
recording_streams_available: falsewithvideo_status: "Success"?- The bot may have been in the meeting but no participant had their camera on. Per-participant streams are only produced for participants whose cameras were active.
-
Missing a participant’s video?
- The bot captures up to 6 concurrent webcam streams. If more than 6 cameras were active, some participants may not have been captured.
- Participants who never turned on their camera will not appear in the response.
-
Getting
video_status: "processing"?- Video processing takes a short time after the bot exits. Poll again after 10-30 seconds.
-
Presigned URL returns 403 Forbidden?
- The URL has expired (10-minute lifetime). Call
get_recording_streamsagain for fresh URLs.
- The URL has expired (10-minute lifetime). Call
-
Video file has no audio?
- Per-participant video files are video-only. Use the Get Bot Audio endpoint to retrieve the meeting audio separately.
