> ## 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.

# Live streaming events

> Events for live streaming lifecycle — start, connection state changes, stop, and errors.

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

***

## live-streaming-started

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

Fires when a live stream begins.

<ResponseField name="action" type="string">
  Always `"live-streaming-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 live streaming instance.
</ResponseField>

<ResponseField name="layout" type="DailyLiveStreamingLayoutConfig">
  Optional. The layout configuration for this stream. See [`DailyStreamingLayoutConfig`](/reference/daily-js/types/daily-streaming-layout-config) for the full shape.
</ResponseField>

```json theme={null}
// Example event object
{
  "action": "live-streaming-started",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "layout": {},
  "callClientId": "17225364729060.9442072768918943"
}
```

***

## live-streaming-updated

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

Fires when the live stream connection state changes. This event fires in three circumstances:

* The first video frame is published to the RTMP server — `state: "connected"`
* Connection with the RTMP server is interrupted — `state: "interrupted"`
* Connection with the RTMP server is restored — `state: "connected"`

<ResponseField name="action" type="string">
  Always `"live-streaming-updated"`.
</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 live streaming instance.
</ResponseField>

<ResponseField name="state" type="DailyStreamingState">
  The current connection state: `'connected'` or `'interrupted'`.
</ResponseField>

<ResponseField name="endpoint" type="DailyStreamingEndpoint">
  Optional. Present when the stream was started with an `endpoints` argument. Contains an `endpoint` string identifying the associated streaming endpoint by name.
</ResponseField>

```json theme={null}
// Example event object
{
  "action": "live-streaming-updated",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "state": "connected",
  "endpoint": { "endpoint": "my_endpoint_name" },
  "callClientId": "17225364729060.9442072768918943"
}
```

***

## live-streaming-stopped

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

Fires when a live stream ends.

<ResponseField name="action" type="string">
  Always `"live-streaming-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 live streaming instance that stopped.
</ResponseField>

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

***

## live-streaming-error

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

Fires when a live streaming error occurs.

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

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

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

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

```json theme={null}
// Example: permissions error
{
  "action": "live-streaming-error",
  "instanceId": "00000000-0000-4000-8000-000000000000",
  "errorMsg": "must be meeting owner to start live stream",
  "callClientId": "17225364729060.9442072768918943"
}
```

```json theme={null}
// Example: invalid instanceId
{
  "action": "live-streaming-error",
  "instanceId": "incorrect-uuid",
  "errorMsg": "invalid argument: instanceId is not a valid UUID. Got \"incorrect-uuid\", expected a valid UUID string of the form \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
  "callClientId": "17225364729060.9442072768918943"
}
```

***

## 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">
    * [startLiveStreaming()](/reference/daily-js/instance-methods/start-live-streaming)
    * [updateLiveStreaming()](/reference/daily-js/instance-methods/update-live-streaming)
    * [stopLiveStreaming()](/reference/daily-js/instance-methods/stop-live-streaming)
    * [addLiveStreamingEndpoints()](/reference/daily-js/instance-methods/add-live-streaming-endpoints)
    * [removeLiveStreamingEndpoints()](/reference/daily-js/instance-methods/remove-live-streaming-endpoints)
  </Card>

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