Live streaming overview
New to Daily live streaming? Start here — covers prerequisites, supported RTMP providers and URL formats, and HLS streaming.
canAdmin: ['streaming']) can start, update, or stop a live stream. See prerequisites in the overview for how to create the right meeting token.
All streaming — RTMP and HLS — goes through
startLiveStreaming(). For RTMP, pass an ingest URL directly. For HLS, configure streaming_endpoints on the room first, then pass the endpoint name. The rest of this guide applies to both.Starting a live stream
startLiveStreaming() begins streaming to one or more RTMP endpoints:
Options
One or more RTMP/RTMPS ingest URLs. Mutually exclusive with
endpoints.An array of endpoint objects
{ endpoint: string }. Use this instead of rtmpUrl when you need to dynamically add or remove destinations mid-stream with addLiveStreamingEndpoints() and removeLiveStreamingEndpoints().Output width in pixels. Default:
1280. Can only be set at start.Output height in pixels. Default:
720. Can only be set at start.Frames per second. Default:
30.Video bitrate in kbps.
Audio bitrate in kbps.
Seconds of idle time before the stream automatically stops. Default:
60.Maximum stream duration in seconds.
Background color for empty areas in the composed frame. CSS hex string. Can only be set at start.
Identifier for this streaming instance. Required when running multiple simultaneous streams. See multiple simultaneous streams.
Participant tile layout for the composed output. See
DailyStreamingLayoutConfig for the full type reference, or layout options below for usage examples.Layout options
Live streaming supports the same layout presets as recording —default, single-participant, active-participant, portrait, and custom — except audio-only, which is recording-only. See DailyStreamingLayoutConfig for field-level documentation on each preset. For screenshots, see the live streaming overview.
default
single-participant
active-participant
portrait
custom
Use Daily’s VCS baseline composition to fully control the layout programmatically — modes, overlays, labels, participant ordering, and more. The startLiveStreaming() reference documents all available composition_params.
participants
Several presets accept a participants field to filter which participants’ video and audio are included in the stream. See DailyStreamingLayoutConfig for the full field list.
You must resend
participants on every updateLiveStreaming() call — it is not persisted from the previous call. If omitted on update, all participants will be included.Updating layout mid-stream
CallupdateLiveStreaming() to switch layouts without interrupting the stream:
Adding and removing endpoints
You can add new RTMP destinations to a running stream or remove existing ones without stopping the stream.Do not use
removeLiveStreamingEndpoints() to remove all endpoints — use stopLiveStreaming() instead. Attempting to remove the last endpoint will fail and trigger a live-streaming-warning nonfatal error.Stopping a live stream
stopLiveStreaming() ends all active streaming endpoints:
Multiple simultaneous streams
Pass a uniqueinstanceId to run parallel streams — for example, a high-quality CDN stream and a lower-bitrate social stream simultaneously:
max_streaming_instances_per_room configuration, see the multi-instance guide.
Live streaming events
Full payload details are in the live streaming events reference.live-streaming-started
Fired when the stream is ready and the first video frame has been delivered to the ingest server.
live-streaming-updated
Fired when the first video frame is published to the RTMP server (state: 'connected'), when the connection is interrupted (state: 'interrupted'), or when it reconnects (state: 'connected'). If streaming was started with endpoints, the payload also includes the endpoint object.