Skip to main content
Paid plans only A notification to start recording a call appears on top of the call participants in Daily Prebuilt There are multiple ways to record calls of up to three hours with the Daily API:
  • cloud — server-side video recording stored in Daily’s cloud
  • cloud-audio-only — server-side audio-only recording
  • local — client-side recording saved to the participant’s computer
  • raw-tracks — individual media tracks stored in your own S3 bucket
Receive a $15 credit for freeNew accounts have a $15 credit automatically applied when you add a credit card. See our pricing page for details.

cloud

Records a Daily call server-side. By default, outputs video at 1920x1080, 30 fps, encoded as H.264 at 5 Mbps, and audio encoded as AAC at 96 kbps, in MP4 format. Files can be retrieved via the Daily REST API or from the Daily dashboard. Cloud recording supports custom video layouts. It’s the best choice when you need recording from any browser or device, or want control over the recording output’s look and feel. Cloud recording is available for HIPAA use cases when configured to store recordings in a custom S3 bucket.

Turn on cloud recording

Set enable_recording to "cloud" at the room level to allow any participant to start a recording:
curl --request POST \
     --url https://api.daily.co/v1/rooms \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"enable_recording": "cloud"}}'
To restrict who can start recording to specific participants, set enable_recording on their meeting tokens instead:
curl --request POST \
     --url https://api.daily.co/v1/meeting-tokens \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"room_name": "DAILY_ROOM_NAME", "enable_recording": "cloud"}}'
Use startRecording(), updateRecording(), and stopRecording() to manage recording in your app. To start recording automatically when a token holder joins, use the start_cloud_recording token property.

Customize cloud recording layouts

Pass layout configuration to startRecording() or updateRecording():
// Start a recording with a specific layout
await call.startRecording({
  width: 1280,
  height: 720,
  backgroundColor: '#FF1F2D3D',
  layout: {
    preset: 'default',
    max_cam_streams: 5,
  },
});
// Change the recording layout in real time
await call.updateRecording({
  layout: {
    preset: 'single-participant',
    session_id: 'abcd123...',
  },
});
  • height, width — controls output resolution (set once via startLiveStreaming()).
  • backgroundColor — formatted as #rrggbb or #aarrggbb.This can only be set once via `startLiveStreaming().
  • layout: an object specifying the way participants’ videos are laid out in the stream.
    • preset: The layout preset to use. Options (see below for examples):
      • "default" — grid layout; supports max_cam_streams (default 20, max 20).
      • "single-participant" — stream only a single participant’s audio and video. The selected participant’s session ID must be specified via a session_id key.
      • "active-participant" — This layout focuses on the current speaker, and places up to 9 other cameras to the right in a single column vertical grid in the order in which they last spoke.
      • "portrait" — mobile-friendly; "vertical" (default) or "inset" variant.
        • "vertical": up to two participants are shown in a vertical layout. Participants with the is_owner flag are shown lower in the grid.
        • "inset": one participant’s video takes up the entire screen and the other is inset in a smaller rectangle. Participants’ videos are scaled and cropped to fit the entire available space. Participants with the is_owner flag are shown full screen.
      • "custom" — full custom layout via VCS, with composition_params and optional session_assets. A full list of available parameters is available in the reference docs. You can also test available options with the VCS Simulator.
Example "default" layout: Grid of nine participants on a video call Example screenshare "default" layout: A screenshare takes up the main video call screen with participant videos to the right vertically Example "single-participant" layout: One participant video screen takes up the entire video call Example "active-participant" layout: One participant video screen takes up the majority of space on a call with two others to the right in a small vertical bar Example "portrait" layout with "vertical" variant: Two participant screens on a mobile vertical video call Example "portrait" layout with "inset" variant: Two participant screens on a mobile vertical video call Example "custom" layout with a text overlay: Text overlay and dominant video layout example

Retrieve cloud recordings

Cloud recordings are available in the Daily dashboard “Recordings” tab and via the recordings REST API.

Using cloud recording with Daily Prebuilt

When cloud recording is enabled, end users can start recordings using the “Record” button. The layout is automatically selected based on their current view (grid → "default", speaker view → "active-speaker"). For programmatic control over recording and additional layout presets, use the startRecording() and updateRecording() methods with the layout parameter.

cloud-audio-only

Records a Daily call server-side and produces an audio-only MPEG-4 file (.m4a). Configuration and retrieval work the same as cloud, except layout options don’t apply. Enable it by setting enable_recording to "cloud-audio-only" at the room or meeting token level (same pattern as cloud above). The start_cloud_recording token property applies to both cloud and cloud-audio-only. Available for HIPAA use cases when using a custom S3 bucket.

local

Local recording happens on the participant’s device and relies on local compositing, so final quality is subject to browser and device limitations. The recording participant must be using Chrome on desktop.
Local recording saves the finished recording as a .webm file on the recording participant’s computer. The file may need to be transcoded for compatibility with most devices and editors. Use this type to access recordings directly on a participant’s computer rather than through Daily’s cloud. Local recording is also HIPAA-compatible.

Turn on local recording

curl --request POST \
     --url https://api.daily.co/v1/rooms \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"enable_recording": "local"}}'
Or create a room with local recording enabled from the Daily dashboard. Use startRecording() and stopRecording() to manage it. The recording is downloaded to the computer of the participant who stops it.

Using local recording with Daily Prebuilt

Tell the participant who started recording to click “Stop” before leaving the call. If they leave without stopping, the recording will be lost. Daily Prebuilt attempts to warn the user before they leave.

raw-tracks

"raw-tracks" captures each individual media track separately and stores them in your custom S3 bucket. Use this type when you need to manage individual media tracks separately — for high-quality audio transcription, podcasts, or video production.

Turn on raw-tracks recording

curl --request POST \
     --url https://api.daily.co/v1/rooms/:room-name \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"enable_recording": "raw-tracks"}}'
Use startRecording() and stopRecording() to manage it.

Converting and compositing .webm files

Raw-tracks (and local) recordings produce .webm files, which may not play in most video players or be directly editable. This is because they capture raw samples as-is from the WebRTC session — with variable frame rates, varying resolutions, and potential gaps from packet loss.

Using raw-tracks-tools CLI

Daily’s open-source raw-tracks-tools CLI can:
  • Analyze and convert individual participant tracks
  • Align audio and video tracks for sync
  • Composite all tracks from a recording into a single MP4 using VCS
See the project README for installation and usage.

Transcoding .webm files with a GUI

Two common options:
  • CloudConvert — browser-based, free and paid plans. Convert webm to mp4 (or webm to mp3 for audio-only).
  • Handbrake — free app for Windows and macOS. Drag and drop your .webm file, set Format to MP4 and Video Encoder to H.264 (x264), click Start.
You can also view .webm files without transcoding in Chrome, Firefox, or VLC Media Player.

Multiple Recordings

See Multi-instance live streaming and recording for full details, including how to configure max_streaming_instances_per_room for your domain.