diff --git a/src/content/changelog/realtime/2026-05-28-realtimekit-track-recording.mdx b/src/content/changelog/realtime/2026-05-28-realtimekit-track-recording.mdx new file mode 100644 index 000000000000000..0ccd16da2716380 --- /dev/null +++ b/src/content/changelog/realtime/2026-05-28-realtimekit-track-recording.mdx @@ -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//realtime/kit//recordings/track \ + --header 'Authorization: Bearer ' \ + --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/) diff --git a/src/content/docs/realtime/realtimekit/recording-guide/index.mdx b/src/content/docs/realtime/realtimekit/recording-guide/index.mdx index fa48c574748d4e8..a3e0e0c4865d6d0 100644 --- a/src/content/docs/realtime/realtimekit/recording-guide/index.mdx +++ b/src/content/docs/realtime/realtimekit/recording-guide/index.mdx @@ -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 @@ -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: -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 @@ -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/). diff --git a/src/content/docs/realtime/realtimekit/recording-guide/track-recording.mdx b/src/content/docs/realtime/realtimekit/recording-guide/track-recording.mdx new file mode 100644 index 000000000000000..29a017d6fe7a8de --- /dev/null +++ b/src/content/docs/realtime/realtimekit/recording-guide/track-recording.mdx @@ -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//realtime/kit//recordings/track \ + --header 'Authorization: Bearer ' \ + --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//realtime/kit//recordings/track \ + --header 'Authorization: Bearer ' \ + --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//realtime/kit//recordings/ \ + --header 'Authorization: Bearer ' \ + --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.