> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.meetstream.ai/guides/transcription-recordings/retrieve-recordings/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server. # Retrieve Recordings > Download meeting audio and video after the bot leaves: mixed recordings, per-participant tracks, and how long the presigned URLs stay valid. Once a bot leaves a meeting and processing completes, every artifact is one GET away. All download links are **presigned S3 URLs** — no extra auth needed, but they expire, so fetch fresh links rather than storing them. ## Mixed audio ```bash curl "https://api.meetstream.ai/api/v1/bots//get_audio" \ -H "Authorization: Token " ``` ```json { "audio_url": "https://ms-s3-bucket.s3.amazonaws.com/audio.wav" } ``` The link is valid for **1 hour**. Mixed audio is always produced, even when per-participant streams are enabled. ## Video ```bash curl "https://api.meetstream.ai/api/v1/bots//get_video" \ -H "Authorization: Token " ``` The response carries the presigned `video_url` (valid **10 minutes**) plus a `video_info` block with duration, size, resolution, fps, and processing stats — useful for sanity-checking a recording before you pipe it downstream. > **Note** > > Recording video is opt-in on `create_bot`. Audio-only bots skip video capture entirely, which reduces bandwidth and processing time — the right default for transcription-first products. ## Per-participant streams With `audio_separate_streams` / `video_separate_streams` enabled at create time: | Artifact | Endpoint | Link lifetime | | ------------------------------------------------ | ------------------------------------------ | ------------- | | Per-participant audio (WebM/Opus) | `GET /bots/{bot_id}/get_audio_streams` | 10 minutes | | Per-participant video + screen shares (WebM/VP8) | `GET /bots/{bot_id}/get_recording_streams` | 10 minutes | Full capture details, platform isolation levels, and segment semantics: [per-participant audio](/guides/transcription-recordings/per-participant-audio) and [video](/guides/transcription-recordings/per-participant-video). ## Handling 202 (still processing) Media endpoints return **HTTP 202** while the bot is still in the meeting or post-call processing is running — per-participant video responses include a `stage` field showing where the pipeline is. Poll again after 10–30 seconds, or skip polling entirely by acting on the `audio.processed` / `video.processed` [webhook events](/guides/webhooks/webhooks-and-events). ## Lifetimes cheat sheet | Link | Valid for | | ------------------------------------------- | ---------- | | `get_audio` | 1 hour | | `get_video` | 10 minutes | | Per-participant streams | 10 minutes | | Transcription downloads (`/transcriptions`) | 1 hour | Expired link? Just call the endpoint again. Retention and deletion behavior: [Usage & Retention](/guides/features/usage-and-retention). Want recordings written straight into your own bucket instead? [Custom Storage (BYO S3)](/guides/features/custom-storage-configurations). > Meeting bot API documentation for Zoom, Google Meet and Microsoft Teams: create bots, stream real-time audio, transcribe, and run in-meeting voice agents.