Per-Participant Video Streams: Separate Video for Every Participant
Get one video file per participant webcam and per screen share, instead of (or as well as) a single composite recording of the meeting.
Supported platforms: Zoom, Google Meet, Microsoft Teams.
Platform support
When more cameras are on than the platform limit, the extra cameras are not recorded until a slot frees up. Plan around the limit on Teams in particular: in a meeting with more than six cameras on, some participants will not have a video file.
See the capability matrix for the rest of what each platform supports.
Per-participant video is opt-in and off by default. A bot never records one file per participant unless you set video_separate_streams: true yourself, because it multiplies processing and storage by the number of participants. Leave it unset for ordinary recording.
1) What you need
- A MeetStream API key (see Create your first bot).
- A meeting link (Zoom, Google Meet or Microsoft Teams).
video_separate_streams: truein your Create Bot request. On Zoom, alsovideo_required: true.
2) Create a bot with per-participant video
Use the Create Bot endpoint.
Minimal example
Sending video_required: true works on every platform and is required on Zoom.
To try it without code, open API Playground in the dashboard and go to the Streams step:

Full example with transcription
The composite recording here uses video_layout: "speaker_view" so the single MP4 follows whoever is talking, which is what you want for review and clipping. The per-participant WebM files are unaffected by the layout.
Parameter reference
Tip: You can also pass
video_separate_streamsinsiderecording_config:The top-level parameter takes precedence if both are set.
3) What happens during the meeting
Once the bot is admitted, it automatically:
- Captures each participant’s webcam as a separate stream.
- Captures each screen share as a separate stream.
- Keeps each file on the meeting’s timeline, so files line up with the mixed audio and with each other.
No per-participant configuration is needed. If you pause recording, every per-participant file shows black video for the paused stretch.
4) Retrieve per-participant video streams
After the bot leaves and video processing finishes (the video.processed webhook), call:
Response when processing is complete (200)
The response is an array. Each item is one recorded webcam or screen-share stream:
Other responses
5) Download the video files
Links expire after 1 hour. Call get_recording_streams again for fresh links.
Audio is separate: use per-participant audio or the mixed recording from retrieve recordings.
6) Understanding the files
- A participant can have more than one item, for example a webcam file and a screen-share file, or one file per screen-share session.
- Turning a camera off and on does not start a new file: the off stretch is filled with a black tile showing the participant’s name, so the file stays on the meeting timeline.
- Use
start_timestamp.relativeanddurationto place each file on the meeting timeline, andparticipant.extra_datato match it with per-participant audio.
7) Using both composite and per-participant video
video_layout applies only to the composite MP4. Speaker view is the recommended setting because it follows the active speaker; switch to grid_view if you specifically want a mosaic of everyone.
This produces:
- A composite MP4 of the meeting (layout
grid_vieworspeaker_view, built after the call from the per-participant streams). Retrieve it with Get Bot Video. - Per-participant MP4 files. Retrieve them with Get Recording Streams.
Pick the composite layout with recording_config.video_layout, or on the Playground’s Record step:

8) Webhook notifications
Subscribe to video.processed (and video.failed) in webhooks and events, then call get_recording_streams. Polling until you get a 200 with items works too.
9) Troubleshooting
-
Empty array
[]after the meeting?- Check that
video_separate_streams: truewas set, and on Zoom thatvideo_required: truewas set as well. - Participants who never turned their camera on and never shared their screen do not produce files.
- Check that
-
A participant’s video is missing?
- The platform limit was reached: 6 streams on Teams (including 1 screen share), 16 on Zoom and Google Meet. Extra cameras are not recorded until a slot frees up.
- The bot only records after it is admitted. Anything before admission is not captured. See bot status and error codes if the bot was never admitted.
-
Getting
202withvideo_status: "processing"?- Processing takes a short time after the bot leaves. Poll again after 10 to 30 seconds.
-
The download link returns 403 Forbidden?
- The link has expired (1-hour lifetime). Call
get_recording_streamsagain.
- The link has expired (1-hour lifetime). Call
-
The video file has no audio?
- Per-participant video files are video-only. See per-participant audio.
