Skip to main content
A time-stamped log of call events (tracks, active speaker, chat, transcript) written next to a cloud, cloud-audio-only, or raw-tracks recording. Live streams never write it.

Enable

Pass dataOutputs: ["event-json"] to startRecording() or to POST /rooms/:name/recordings/start (camelCase in REST too). Other values: transcript-webvtt, chat-webvtt. The file only captures events; it does not start transcription or chat.

Location and timing

  • Key: <s3key>.event.json, in the recording’s bucket (Daily’s, or your own S3 / OCI bucket). s3key is in GET /recordings/:id and the recording.ready-to-download webhook (s3_key).
  • Download link: data_outputs["event-json"] in GET /recordings/:id/access-link. GET /recordings/:id lists data_outputs.
  • Uploaded when the recording stops. If the call moves to another server mid-recording, a partial copy is uploaded at that point, so the file existing does not mean the log is complete. Not uploaded if it would exceed 50 MB.
  • The recording.ready-to-download webhook does not list this file and does not wait for it. If the file is missing when the webhook arrives, retry.

Format

recording.type is cloud-recording for cloud and cloud-audio-only. Each event has ts (Unix seconds, float, clock time), type, optional participant_id (session ID), optional data (per type). Skip unknown types.

Event types

trackSessionNum is unique per track within the recording and links all track-* and recording-media-* entries for that track. A republished track gets a new trackSessionNum.

Rules

  • events is not sorted by ts: the cloud recording-media-started entry is forced to index 0. Sort if you need time order.
  • Offset into media, cloud: event.ts - start.ts, where start is the recording-media-started entry. Raw-tracks: event.ts - start.data.mediaStartTime, where start is the recording-media-started entry with the same trackSessionNum (its ts is when the notification was logged, not the media start). Negative offsets (tracks present before media start) mean “at the start”.
  • Raw-tracks mediaStartTime is when writing started, not the first media sample. Good for ordering, not sample-exact sync.
  • active-speaker is written only on change. Silence is never written.
  • Stopping the recording does not write track-removed; a track without one ran to the end.
  • Raw-tracks tracks that are paused when they would be added get track-added on first resume.