> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.meetstream.ai/guides/features/participants-and-speaker-timeline/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server. # Participants & Speaker Timeline > Who was in the meeting and who spoke when: fetch the participant list with join and leave times, and the speaker timeline for every turn in the call. Two endpoints turn a recording into attributable data: `get_participants` (who was there) and `get_speaker_timeline` (who spoke when, down to byte ranges of the audio file). ## List participants ```bash curl "https://api.meetstream.ai/api/v1/bots//get_participants" \ -H "Authorization: Token " ``` Each participant entry carries: | Field | What it is | | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | `deviceId` | The platform's stable identifier for this participant in this meeting (e.g. `spaces/.../devices/185` on Meet) — your key for joining data across endpoints | | `displayName` / `fullName` | Names as shown in the meeting | | `profilePicture` | Avatar URL when the platform exposes one | | `status` / `humanized_status` | Current state (e.g. `in_meeting`, `not_in_meeting`) | | `streamIds` | The participant's media stream IDs — matches per-participant stream artifacts | ## Identify participants uniquely Display names collide ("John" twice) and change mid-meeting. Use the IDs instead: * **`deviceId`** is unique per participant per meeting and consistent across `get_participants`, the speaker timeline (`speakerId`), and live audio frames (`speaker_id`). * **`streamIds`** link a participant to their [per-participant audio/video files](/guides/transcription-recordings/per-participant-audio). * Speaker labels in [transcripts](/guides/transcription-recordings/post-call-transcription) carry per-word `speaker` attribution you can map back by name. ## The speaker timeline ```bash curl "https://api.meetstream.ai/api/v1/bots//get_speaker_timeline" \ -H "Authorization: Token " ``` The response is a list of `chunks`, each mapping a slice of the recorded audio to a speaker: ```json { "chunks": [ { "chunkIndex": 0, "timestamp": "115360815932", "sampleRate": 48000, "speakerId": "spaces/iWI9CBO8PnYB/devices/242", "speakerName": "Maddy Singh", "startByte": 0, "endByte": 98300 } ], "lastUpdated": "2026-03-20T04:54:51.493Z" } ``` Because chunks reference **byte ranges of the audio file** at a known sample rate, you can compute exact timestamps (`seconds = startByte / 2 / sampleRate` for PCM16 mono), cut per-speaker clips, or build talk-time analytics without running diarization yourself. ## Use cases this unlocks * **Talk-time ratios** for sales coaching (rep vs prospect seconds, straight from chunk math) * **Speaker-accurate clip extraction** ("play me everything the customer said") * **Cross-referencing**: join timeline speakers to transcript words to per-participant files via the shared IDs CLI: `meetstream bot participants ` and `meetstream bot timeline `. > Meeting bot API documentation for Zoom, Google Meet and Microsoft Teams: create bots, stream real-time audio, transcribe, and run in-meeting voice agents.