Skip to content

Live TV API

List channels, start playback, read guide data, and export IPTV-compatible playlists.

Try it with a token

Use a bearer token from the Authentication flow for authenticated playback requests.

Channels

List channels

http
GET /api/livetv/channels
Authorization: Bearer <token>
bash
curl -sS \
  -H "Authorization: Bearer $OMNILUX_TOKEN" \
  http://your-server:4000/api/livetv/channels

Response:

json
{
  "channels": [
    {
      "id": 1,
      "name": "Movies",
      "number": 1,
      "sourceType": "virtual",
      "scheduleMode": "shuffle",
      "alwaysOn": false,
      "category": "Movies",
      "logoUrl": "/artwork/channels/1/logo.jpg",
      "enabled": true
    }
  ]
}

Admins can create virtual channels with POST /api/livetv/channels. This public page focuses on playback and guide consumption.

Direct external channels and M3U source imports require source provenance, a written rights basis, and explicit authorization attestation. External DVR additionally requires a recording-specific rights basis.

Stream playback

Watch a channel

http
GET /api/livetv/watch/:channelId
Authorization: Bearer <token>

Returns a redirect to the channel HLS playlist when the stream is ready. For cold-start channels, the server can return 202 Accepted while it starts the stream.

bash
curl -i \
  -H "Authorization: Bearer $OMNILUX_TOKEN" \
  http://your-server:4000/api/livetv/watch/1

Starting response:

json
{
  "ready": false,
  "message": "Stream starting..."
}

Ready response: 302 Found redirect to the HLS playlist.

The watch endpoint also accepts signed stream-access query parameters for external clients:

ParameterTypeDescription
tokenstringStream token
expstringSigned URL expiration
sigstringSigned URL signature
fromStartstringStart behavior hint
watchSessionstringOptional watch-session identifier

HLS manifest

http
GET /api/livetv/watch/:channelId/live.m3u8
Authorization: Bearer <token>

HLS manifests use short segments and a sliding live window. Authentication for playback should use the standard bearer-token flow documented in Authentication, or a signed stream URL generated by the runtime.

EPG

Get EPG data

http
GET /api/livetv/epg
Authorization: Bearer <token>
bash
curl -sS \
  -H "Authorization: Bearer $OMNILUX_TOKEN" \
  "http://your-server:4000/api/livetv/epg?from=2026-06-01T00:00:00Z&to=2026-06-02T00:00:00Z&channelId=1"

Query parameters:

ParameterTypeDescription
channelIdnumberOptional channel ID filter
channelIdsstringOptional comma-separated channel IDs
fromstringOptional ISO 8601 start time
tostringOptional ISO 8601 end time

Response:

json
{
  "entries": [
    {
      "channelId": 1,
      "title": "Die Hard",
      "description": "An NYPD officer visits Los Angeles.",
      "start": "2026-06-01T20:00:00Z",
      "end": "2026-06-01T22:11:00Z",
      "iconUrl": "/artwork/movies/562/poster.jpg"
    }
  ]
}

External IPTV clients

Export an M3U playlist:

http
GET /api/livetv/m3u
Authorization: Bearer <token>

Export XMLTV guide data:

http
GET /api/livetv/xmltv
Authorization: Bearer <token>

Configured stream tokens or signed stream-access query parameters can be used for clients that cannot send bearer headers. These credentials grant access to a private lineup and must not be published.

Warm enabled channels

http
POST /api/livetv/warm
Authorization: Bearer <token>

Starts warming enabled channels for faster playback where supported.