Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
title: Record specific participant audio tracks in RealtimeKit
description: You can now record specific participant audio tracks in RealtimeKit with track recording.
products:
- realtime
date: 2026-05-28
---

You can now record specific participant audio tracks in RealtimeKit with [track recording](/realtime/realtimekit/recording-guide/track-recording/). Track recording creates separate WebM files for each participant instead of a single composite recording, which is useful for post-processing, transcription, and regulated or content-sensitive workflows.

To record specific participants, pass `user_ids` when starting a track recording:

```bash
curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/recordings/track \
--header 'Authorization: Bearer <api_token>' \
--header 'Content-Type: application/json' \
--data '{
"meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",
"user_ids": ["user-123", "user-456"]
}'
```

To pass `user_ids` for selective track recording, use the following minimum SDK versions:

- Web Core: `@cloudflare/realtimekit` version `1.4.0` or later
- Web UI Kit: `@cloudflare/realtimekit-ui`, `@cloudflare/realtimekit-react-ui`, or `@cloudflare/realtimekit-angular-ui` version `1.1.2` or later
- Android Core or iOS Core: version `2.0.0` or later
- Android UI Kit or iOS UI Kit: version `1.1.0` or later

[RealtimeKit](/realtime/realtimekit/) provides SDKs and UI components so that you can build your own meeting experience on Cloudflare's [global WebRTC infrastructure](/realtime/#realtime-sfu). Teams today build products ranging from telehealth to education on RealtimeKit for global audiences. You can get started today with our [Quickstart](/realtime/realtimekit/quickstart/) or take a look at our [Cloudflare Meet repo](https://github.com/cloudflare/meet) as a reference.

- [Track recording docs](/realtime/realtimekit/recording-guide/track-recording/)
- [RealtimeKit Quickstart](/realtime/realtimekit/quickstart/)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
pcx_content_type: navigation
title: Recording
description: Record audio and video from RealtimeKit meetings using composite recording mode.
description: Record RealtimeKit meetings as composite recordings or separate participant audio tracks.
sidebar:
order: 8
label: Overview
Expand All @@ -11,18 +11,17 @@ products:

import { DirectoryListing } from "~/components";

Learn how RealtimeKit records the audio and video of multiple users in a meeting, as well as interacts with RealtimeKit plugins, in a single file using composite recording mode.
Learn how RealtimeKit records meetings as a single composite file or as separate participant audio tracks.

Visit the following pages to learn more about recording meetings:

<DirectoryListing />

RealtimeKit records the audio and video of multiple users in a meeting, as well as
interactions with RealtimeKit plugins, in a single file using composite recording mode.
RealtimeKit can record the audio and video of multiple users in a meeting, as well as interactions with RealtimeKit plugins, in a single file using composite recording mode. RealtimeKit can also record separate participant audio tracks using [track recording](/realtime/realtimekit/recording-guide/track-recording/).

## How does RealtimeKit recording work?
## How does composite recording work

RealtimeKit recordings are powered by anonymous virtual bot users who join your
Composite recordings are powered by anonymous virtual bot users who join your
meeting, record it, and then upload it to RealtimeKit's Cloudflare R2 bucket. For video files,
we currently support the
[H.264](https://en.wikipedia.org/wiki/Advanced_Video_Coding) and
Expand Down Expand Up @@ -60,3 +59,5 @@ A typical workflow for recording a meeting involves the following steps:
1. Start a recording using the [Start Recording API](/api/resources/realtime_kit/subresources/recordings/methods/start_recordings/) or client side SDK.
2. Manage the recording using the [Pause, resume, or stop recording API](/api/resources/realtime_kit/subresources/recordings/methods/pause_resume_stop_recording/) or client side SDK.
3. Fetch the download URL for downloading the recording using the [Fetch details of a recording API](/api/resources/realtime_kit/subresources/recordings/methods/get_one_recording/), webhook, or from the Developer Portal.

For separate participant audio files, refer to [Track recording](/realtime/realtimekit/recording-guide/track-recording/).
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
---
title: Track recording
description: Record separate audio tracks for selected RealtimeKit participants and download per-participant WebM files.
pcx_content_type: how-to
sidebar:
order: 9
products:
- realtime
---

Track recording lets you record participant audio as separate WebM files instead of one composite meeting recording. Use it when you need speaker-level control over what you store, process, or review.

With track recording, you can record specific participant tracks by passing `user_ids`, which is useful for content-sensitive or regulated workflows where recording every participant is unnecessary. If you do not provide `user_ids`, RealtimeKit will record all participant audio tracks as separate WebM files by default.

To pass `user_ids` for specific participant track recording, use the following minimum SDK versions:

- Web Core: `@cloudflare/realtimekit` version `1.4.0` or later
- Web UI Kit: `@cloudflare/realtimekit-ui`, `@cloudflare/realtimekit-react-ui`, or `@cloudflare/realtimekit-angular-ui` version `1.1.2` or later
- Android Core or iOS Core: version `2.0.0` or later
- Android UI Kit or iOS UI Kit: version `1.1.0` or later

Track recording creates one file per recorded participant.

:::note

Track recording currently supports audio tracks only. Video track recording is in development.

:::

## Availability and limits

Track recording has the following requirements and limits:

| Limit | Description |
| --------------------- | ---------------------------------------------------------------------------- |
| Active meeting | The meeting must have an active live session. |
| Media kind | Only `audio` layers are recorded. |
| Participant selection | Pass up to 100 values in `user_ids`. |
| Storage | Files are uploaded to RealtimeKit's managed R2 bucket with zero-egress fees. |
| File retention | RealtimeKit bucket download URLs expire after seven days. |

## Start track recording

### Record specific participants

To record separate audio tracks for specific participants, call [`POST /recordings/track`](/api/resources/realtime_kit/subresources/recordings/methods/start_track_recording/) with the meeting ID and the participant `user_ids`.

```bash
curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/recordings/track \
--header 'Authorization: Bearer <api_token>' \
--header 'Content-Type: application/json' \
--data '{
"meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",
"user_ids": ["user-123", "user-456"]
}'
```

RealtimeKit records current and future participants whose `user_id` matches the allowlist. Participants whose `user_id` is not listed are not recorded.

### Record all participants as separate tracks

Omit `user_ids` to record separate audio tracks for all participants in the live meeting. RealtimeKit creates one WebM file for each recorded participant.

```bash
curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/recordings/track \
--header 'Authorization: Bearer <api_token>' \
--header 'Content-Type: application/json' \
--data '{
"meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a"
}'
```

The response includes a recording ID. Use this ID to stop or fetch the recording.

```json
{
"success": true,
"data": {
"recording": {
"id": "fff40c6a-140b-40a9-9499-b23fd7a3868a",
"meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",
"status": "INVOKED",
"type": "TRACK",
"output_file_name": "{{file_name_prefix}}_{{user_id}}_{{peer_id}}_{{stream_kind}}_{{media_kind}}_{{date_time}}.webm"
}
}
}
```

## Customize file names with prefixes

Use `layers.default.file_name_prefix` to prefix every generated track recording file.

```json
{
"meeting_id": "97440c6a-140b-40a9-9499-b23fd7a3868a",
"layers": {
"default": {
"media_kind": "audio",
"file_name_prefix": "speaker"
}
}
}
```

If you omit `layers`, RealtimeKit uses `default` as the file name prefix.

## Stop track recording

Use the [recording update endpoint](/api/resources/realtime_kit/subresources/recordings/methods/pause_resume_stop_recording/) to stop a track recording.

```bash
curl --request PUT \
--url https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/recordings/<recording_id> \
--header 'Authorization: Bearer <api_token>' \
--header 'Content-Type: application/json' \
--data '{
"action": "stop"
}'
```

Track recording also stops when the meeting session ends.

After track recording stops, RealtimeKit uploads the per-participant WebM files and moves the recording to `UPLOADED`.

## Download track files

Track recording uses the same recording status lifecycle as composite recording. To monitor status, refer to [Monitor Recording Status](/realtime/realtimekit/recording-guide/monitor-status/).

When the recording reaches `UPLOADED`, fetch the recording details or listen for the `recording.statusUpdate` webhook. For track recordings, `download_url` contains per-participant WebM file URLs grouped by layer.

```json
{
"download_url": [
{
"layer_name": "default",
"download_urls": {
"speaker_user-123_peer-456_peer_audio_1760000000000.webm": {
"download_url": "https://example.com/presigned-url"
}
}
}
]
}
```

File names use this format:

```txt
{{file_name_prefix}}_{{user_id}}_{{peer_id}}_{{stream_kind}}_{{media_kind}}_{{date_time}}.webm
```

The `date_time` value is the Unix timestamp in milliseconds when the file was generated.