Skip to content

Live streaming

Broadcast live to your viewers with RTMP ingest, adaptive HLS playback, optional recording, and automatic replays saved to your video library. Live streaming is available on plans that include it (see your Billing page).

How it works

  1. Create a live stream from the dashboard (Live → Create live stream) or the API. You get an RTMP server URL and a secret stream key.
  2. Point your encoder at it. In OBS (or any RTMP encoder): Settings → Stream → Service: Custom, then paste the server URL and stream key exactly as shown, including the scheme, which is rtmps:// on servers that encrypt ingest and rtmp:// on the rest. Click Start Streaming. Your stream goes live automatically; there is no extra "go live" step.
  3. Share it. Copy the embed code or the HLS playback URL from the stream's page. The preview player on the page shows exactly what your viewers see.
  4. End it. Stop streaming in your encoder. After a short grace period the stream returns to Idle. You can also press End stream on the dashboard, which also disconnects your encoder. If the stream was set to record, the broadcast is saved to your video library as a normal video (with captions, storyboards, downloads, and analytics).

Your live streams page

Live shows every stream in the project as a card. Anything with an encoder connected is lifted to the front, whichever page of the list it would otherwise sit on, and outlined in its status colour: red while you are broadcasting, purple while you are in preview.

An on-air card shows a still of what you are actually sending, refreshed about once a minute, so you can see your picture without opening anything. Hover it to watch the broadcast play in place: the still tells you the encoder was up a moment ago, and hovering tells you video is flowing right now, which is the thing a still can never show you.

The card also carries what is worth checking mid-broadcast. How many people are watching right now and how long the encoder has been connected sit on the picture; the resolution and bitrate it is sending sit under the title. The buttons that matter are there too, so you can go live from a preview, or end a broadcast, without opening it first.

Those numbers are read when the page loads rather than updated continuously. The stream's own page refreshes them as you watch it.

Every other channel is the same card, showing whether it is public, when it last broadcast, and how many replays it has. A channel that has recorded before shows a frame from its most recent replay, so you can tell your channels apart at a glance. A channel that is on air never does: an old frame under a Live badge would look like your current picture.

Public vs. private

  • Private (default): the HLS playback URL is signed and expires, so a leaked URL stops working on its own — and the embed page requires viewer access, exactly like a private video's:
  • Signed token link: mint a view JWT with one of your project's signing keys (same keys and JWT shape as video embeds, with the live stream id as the sub claim) and send viewers to /et/live/{project_id}/?token=….
  • Password: set an optional password on the stream's settings (comma-separate several) and share the embed URL with ?password=… appended.
  • Logged-in accounts with access to the project (your dashboard preview) always see it.
  • Public: anyone with the link can watch — you don't mint anything, the playback link you are given is already signed and lasts for years. Toggle this on the stream's settings.

Backup ingest and automatic failover

Every live stream comes with a Backup server URL (shown under the primary on the stream's page, and as ingest.backup_rtmp_url in the API) that uses the same stream key. Encoders that can stream to two servers at once — vMix, OBS with two instances, most hardware encoders — should push to both. If the primary server fails mid-broadcast, viewers' players switch to the backup automatically within a few seconds and the broadcast never drops; the replay recording is taken from whichever server captured the most of the session.

If you stream only to the primary (a single OBS instance) and it fails, point your encoder at the backup URL and press start — viewers reconnect automatically, no new links needed.

Live captions (AI)

Turn on Auto-generate live captions in a stream's settings and viewers get an AI-transcribed caption track in the player's CC menu while you broadcast. Captions appear with a short delay (roughly 10-20 seconds, like broadcast TV captioning). The language is auto-detected from the first speech; set Caption language to pin it for mixed-language audio. Transcribed minutes are recorded in your account's AI usage.

If your encoder already embeds broadcast captions (CEA-608/708, common on hardware encoders and broadcast playout systems), they pass through to viewers as-is — the player lists them in the CC menu alongside any AI captions, and no transcription is billed for them.

Rewind (DVR)

Viewers can scrub back through the last ~30 minutes of a live broadcast and click the LIVE badge to jump back to the edge. It's on by default; turn DVR off in a stream's settings to pin viewers to the live edge (no seek bar). Enabling the rewind window adds roughly ten seconds of glass-to-glass latency platform-wide.

Preview before going live

Turn on Preview before going live in the stream's settings and your encoder connecting no longer starts the broadcast: the stream parks in Preview, visible only to you (the stream's page shows the picture; viewers see the stream as idle). Check your camera and audio, then click Go live — that's when viewers can watch, livestream.started fires, and the recording clock starts. Stopping the encoder during a preview quietly returns the stream to Idle: no webhooks, no saved replay.

One caveat for public streams: a playback link shared from an earlier broadcast keeps working at the CDN while you preview, so someone holding it could tune in early. Private streams don't have this — their links last 6 hours, against years for a public one — and a stream that has never broadcast has no earlier link to leak. Reset stream key is the way to invalidate a public link that got out: it changes the stream's path, so every link minted for the old one stops working at once.

Stream key

Your stream key is a secret: anyone with it can broadcast to your stream. Copy it whole — it looks like a1b2c3…?pass=…, and the part after ? is the credential your encoder authenticates with. Paste it into OBS exactly as shown; don't trim it.

If it leaks, use Reset stream key on the dashboard (or the API) to rotate it. Resetting disconnects any connected encoder and invalidates both the old key and the old playback URL.

Encrypted ingest (RTMPS)

A server URL that starts with rtmps:// carries your broadcast over TLS, the same encryption a browser uses for https://. This matters more than it looks: RTMP has no separate login step, so the credential your encoder authenticates with travels inside the URL you paste. Over plain rtmp:// it crosses the network in the clear, along with your video; over rtmps:// neither is readable in transit.

There is nothing to configure. Paste the URL you are given, keep the scheme, and your encoder does the rest. OBS, ffmpeg, vMix and current hardware encoders all speak RTMPS. Two things to know if a publish is refused:

  • The scheme is not interchangeable. A server that expects rtmps:// will not accept a plain rtmp:// connection on the same address, and vice versa. Copy the URL rather than retyping it.
  • The port belongs to the URL. Some encoders split the address into host and port fields; if yours does, keep the port shown in the URL rather than the 1935 they default to.

Playback is separate and always over HTTPS, whichever scheme your ingest uses.

Status

A live stream moves through these states:

Status Meaning
Idle Ready, but no encoder is connected.
Preview An encoder is connected, but the broadcast hasn't started. Only reachable with Preview before going live turned on.
Live An encoder is connected and broadcasting.
Errored The stream could not be set up; delete and recreate, or contact support.

API

The REST API mirrors the dashboard. All endpoints are under /api/v1/project/{project_id}/live-stream:

Operation Method + path
Create POST /
List GET /
Get GET /{id}
Edit (title / public / record / password / preview_mode / dvr) POST /{id}
Delete DELETE /{id}
Reset stream key POST /{id}/reset-stream-key
End the current broadcast (or preview) POST /{id}/complete
Go live from preview POST /{id}/go-live

A create response returns the ingest credentials and playback URLs:

{
  "id": "214018387261509632",
  "status": "idle",
  "public": false,
  "record": true,
  "ingest": {
    "rtmp_url": "rtmp://<host>/p<project_id>",
    "stream_key": "3f6b626222cd40d75e09ec02"
  },
  "playback": {
    "hls_url": "https://…/playlist.m3u8?st=…&e=…",
    "hls_url_expires_at": "2026-07-06T16:00:00Z",
    "embed_url": "https://…/e/live/<project_id>/<id>/"
  },
  "replay_video_ids": []
}

Get and List return a fresh signed hls_url each time (for private streams).

Webhooks

If you've configured a webhook, you'll receive these live events:

  • livestream.created
  • livestream.started: an encoder connected and the stream went live
  • livestream.ended: the broadcast ended
  • livestream.updated
  • livestream.deleted
  • livestream.replay_ready: the recorded replay finished processing and is in your library

Webhook payloads never include the ingest stream_key.