> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.meetstream.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server.

# Retrieve Recordings

> Fetch meeting bot recordings from the MeetStream API: mixed audio, video with metadata, per-participant streams, presigned URL lifetimes, and 202 still-processing handling.

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/<BOT_ID>/get_audio" \
  -H "Authorization: Token <YOUR_API_KEY>"
```

```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/<BOT_ID>/get_video" \
  -H "Authorization: Token <YOUR_API_KEY>"
```

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.

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).