Per-Participant Audio Streams: Separate Audio for Every Speaker
Get one audio file per speaker, aligned to the meeting timeline, alongside the usual mixed recording.
Supported platforms: Zoom, Google Meet and Microsoft Teams.
Platform support
See the capability matrix for the rest of what each platform supports.
1) What you need
- A MeetStream API key (see Dashboard Setup).
- A meeting link (Zoom, Google Meet or Microsoft Teams).
audio_separate_streams: truein your Create Bot request.
2) Create a bot with per-participant audio
Use the Create Bot endpoint.
Minimal example
To try it without code, open API Playground in the dashboard and go to the Streams step:

Full example with transcription and MP3 copies
Parameter reference
Tip: You can also pass
audio_separate_streamsinsiderecording_config:The top-level parameter takes precedence if both are set. Set
audio_separate_streams: trueexplicitly when you need per-participant files.
3) What happens during the meeting
Once the bot is admitted, it automatically:
- Captures each speaker’s audio as a separate file.
- Records up to 16 speakers. A 17th distinct speaker is not captured.
- Keeps the standard mixed audio file (
audio.wav) as well.
Files are on the meeting timeline: gaps between a person’s turns are filled with silence, and each file’s start_timestamp tells you where it begins, so files can be laid side by side. If you pause recording, every file is silent for the paused stretch.
4) Retrieve per-participant audio streams
After the bot leaves and audio processing finishes (the audio.processed webhook), call:
Response when processing is complete (200)
The response is an array with one item per speaker file:
Other responses
5) Download the audio files
Links expire after 1 hour. Call get_audio_streams again for fresh links. Check the file extension in the link: Google Meet files are .wav, Zoom and Teams files are .webm.
6) Per-participant audio by platform
If exact isolation during crosstalk matters on Teams, rely on the post-call transcript’s speaker labels for overlapping segments.
7) Using both mixed and per-participant audio
Per-participant audio and the mixed audio are always captured together:
- Mixed audio WAV (everyone combined): Get Bot Audio (
/api/v1/bots/<BOT_ID>/get_audio). See retrieve recordings. - Per-speaker files: Get Audio Streams (
/api/v1/bots/<BOT_ID>/get_audio_streams).
8) Using per-participant audio with per-participant video
Audio and video come as separate files; they are not muxed together. Match them with participant.extra_data (static_participant_id) across the two responses, and line them up with start_timestamp. On Zoom, per-participant video also needs video_required: true.
9) Webhook notifications
Subscribe to audio.processed in webhooks and events, then call get_audio_streams.
10) Troubleshooting
-
Empty array
[]after the meeting?- Confirm
audio_separate_streams: truewas set when the bot was created. - Wait for
audio.processed; files are uploaded after the bot leaves. - Participants who never spoke do not get a file.
- Confirm
-
A speaker is missing?
- The bot captures up to 16 speakers.
- The bot only records after it is admitted. If it never got in, see bot status and error codes.
-
Getting
in_progress?- The bot is still in the meeting. Files are produced after it leaves.
-
The download link returns 403 Forbidden?
- The link has expired (1-hour lifetime). Call
get_audio_streamsagain.
- The link has expired (1-hour lifetime). Call
-
On Teams, one file contains two voices?
- Expected during crosstalk. See section 6.
