> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Recording events

> Events for recording lifecycle — start, stop, error, upload completion, and raw data delivery.

<Badge color="blue">Paid plans only</Badge>

***

## recording-started

<Badge color="green">{"✓"} Prebuilt</Badge> <Badge color="green">{"✓"} Custom</Badge>

Fires for all participants when a recording starts.

<ResponseField name="action" type="string">
  Always `"recording-started"`.
</ResponseField>

<ResponseField name="callClientId" type="string">
  The ID of the call client instance that emitted this event.
</ResponseField>

<ResponseField name="instanceId" type="string">
  Unique ID for this recording instance.
</ResponseField>

<ResponseField name="type" type="string">
  The recording type: `'local'`, `'cloud'`, `'cloud-audio-only'`, or `'raw-tracks'`.
</ResponseField>

<ResponseField name="local" type="boolean">
  Present only for `local` and `cloud` recordings, and only for the participant who started the recording.
</ResponseField>

<ResponseField name="recordingId" type="string">
  Present only for `cloud` recordings. The ID of the resulting recording.
</ResponseField>

<ResponseField name="startedBy" type="string">
  Present for `cloud`, `cloud-audio-only`, and `raw-tracks` recordings. The `session_id` of the participant who started the recording.
</ResponseField>

<ResponseField name="layout" type="DailyStreamingLayoutConfig">
  Present only for `cloud` recordings. The layout configuration. See [`DailyStreamingLayoutConfig`](/reference/daily-js/types/daily-streaming-layout-config) for the full shape.
</ResponseField>

<Note>
  For `local` recordings, the participant who started the recording may receive additional fields, but other participants receive only `action`, `instanceId`, and `callClientId`.
</Note>

```json theme={null}
// Example event object (cloud recording)
{
  "action": "recording-started",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "callClientId": "16149871051110.5607513282111183",
  "local": true,
  "recordingId": "cab2be92-1551-42d8-bcdf-11fe7bd81923",
  "startedBy": "1c6d5474-b133-4993-c943-f1ffdbb38cad",
  "type": "cloud"
}
```

***

## recording-stopped

<Badge color="green">{"✓"} Prebuilt</Badge> <Badge color="green">{"✓"} Custom</Badge>

Fires for all participants when a recording stops.

<ResponseField name="action" type="string">
  Always `"recording-stopped"`.
</ResponseField>

<ResponseField name="callClientId" type="string">
  The ID of the call client instance that emitted this event.
</ResponseField>

<ResponseField name="instanceId" type="string">
  ID of the recording instance that stopped.
</ResponseField>

```json theme={null}
// Example event object
{
  "action": "recording-stopped",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "callClientId": "16149871715780.8113693509425934"
}
```

***

## recording-error

<Badge color="green">{"✓"} Prebuilt</Badge> <Badge color="green">{"✓"} Custom</Badge>

Fires when a recording error occurs.

<ResponseField name="action" type="string">
  Always `"recording-error"`.
</ResponseField>

<ResponseField name="callClientId" type="string">
  The ID of the call client instance that emitted this event.
</ResponseField>

<ResponseField name="instanceId" type="string">
  ID of the recording instance that errored.
</ResponseField>

<ResponseField name="errorMsg" type="string">
  A human-readable description of the error.
</ResponseField>

```json theme={null}
// Example event object
{
  "action": "recording-error",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "errorMsg": "recording failed",
  "callClientId": "16149871715780.8113693509425934"
}
```

***

## See also

<CardGroup>
  <Card title="Types" icon="t" iconType="solid">
    * [DailyStreamingLayoutConfig](/reference/daily-js/types/daily-streaming-layout-config)
  </Card>

  <Card title="Methods" icon="code" iconType="solid">
    * [startRecording()](/reference/daily-js/instance-methods/start-recording)
    * [stopRecording()](/reference/daily-js/instance-methods/stop-recording)
    * [updateRecording()](/reference/daily-js/instance-methods/update-recording)
  </Card>

  <Card title="Guides" icon="book-open" iconType="solid">
    * [Events](/docs/daily-js/concepts/events)
    * [Recording overview](/docs/guides/features/recording)
    * [daily-js: Recording](/docs/daily-js/features/recording)
  </Card>
</CardGroup>
