Stream Playback
Deliver live and DVR playback to web and mobile. Use standard HLS for maximum compatibility, LL-HLS for lower latency, or drop in the Sendexa embed player. Protect premium content with signed playback URLs.
HLS everywhere
Works in Safari natively and via hls.js on Chrome, Firefox, and Edge.
Low-latency HLS
LL-HLS manifests when latencyMode is low — target 3–8s glass-to-glass.
Live DVR
Let viewers scrub back within the configured DVR window.
Signed playback
Optional JWT playback tokens for paid / private streams.
8–15s
latencyMode: standard
3–8s
latencyMode: low
Auto
Built from ingest quality
4h
dvrWindowSeconds ≤ 14400
Authentication
Authorization: Basic <token>. Auth guide →Playback URLs
Returned under data.playback when you create or fetch a stream. Use llHls only when the stream was created with latencyMode: "low".
{"playback": {"hls": "https://live.sendexa.co/str_01JQX7K2M9N4P5/index.m3u8","llHls": "https://live.sendexa.co/str_01JQX7K2M9N4P5/ll/index.m3u8","embedUrl": "https://player.sendexa.co/live/str_01JQX7K2M9N4P5","poster": "https://cdn.sendexa.co/posters/str_01JQX7K2M9N4P5.jpg"}}
| Field | Use for |
|---|---|
| hls | Default multi-bitrate HLS — best compatibility |
| llHls | Low-latency HLS players (Safari 16+, hls.js LL mode) |
| embedUrl | Iframe embed of the Sendexa player (auth + UI included) |
| poster | Thumbnail before go-live or while reconnecting |
Web playback with hls.js
<!-- npm i hls.js | or CDN --><video id="live" controls playsinline autoplay mutedclass="w-full aspect-video bg-black rounded-xl"></video><script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script><script>const src = 'https://live.sendexa.co/str_01JQX7K2M9N4P5/ll/index.m3u8';const video = document.getElementById('live');if (video.canPlayType('application/vnd.apple.mpegurl')) {// Safari — native HLS / LL-HLSvideo.src = src;} else if (window.Hls && Hls.isSupported()) {const hls = new Hls({enableWorker: true,lowLatencyMode: true, // for LL-HLSbackBufferLength: 90,});hls.loadSource(src);hls.attachMedia(video);hls.on(Hls.Events.MANIFEST_PARSED, () => video.play());} else {console.error('HLS not supported in this browser');}</script>
React player example
'use client';import { useEffect, useRef } from 'react';import Hls from 'hls.js';export function LivePlayer({src,lowLatency = true,}: {src: string;lowLatency?: boolean;}) {const ref = useRef<HTMLVideoElement>(null);useEffect(() => {const video = ref.current;if (!video || !src) return;if (video.canPlayType('application/vnd.apple.mpegurl')) {video.src = src;return;}if (Hls.isSupported()) {const hls = new Hls({ lowLatencyMode: lowLatency });hls.loadSource(src);hls.attachMedia(video);return () => hls.destroy();}}, [src, lowLatency]);return (<videoref={ref}controlsplaysInlineautoPlaymutedclassName="aspect-video w-full rounded-xl bg-black"/>);}// Usage:// <LivePlayer src={stream.playback.llHls ?? stream.playback.hls} />
Embed player
Fastest path for dashboards and marketing pages — no player code required.
<iframesrc="https://player.sendexa.co/live/str_01JQX7K2M9N4P5?autoplay=1&muted=1"allow="autoplay; fullscreen; picture-in-picture"allowfullscreenclass="w-full aspect-video rounded-xl border-0"></iframe>
| Field | Type | Required | Description |
|---|---|---|---|
| autoplay | 0|1 | optional | Start playback when live (may require muted=1). |
| muted | 0|1 | optional | Start muted for browser autoplay policies. |
| dvr | 0|1 | optional | Show DVR scrubber when stream.dvr is enabled. |
| token | string | optional | Playback JWT for private streams (see signed playback). |
Mobile
import AVKitlet url = URL(string: "https://live.sendexa.co/str_01JQX7K2M9N4P5/index.m3u8")!let player = AVPlayer(url: url)let controller = AVPlayerViewController()controller.player = playerpresent(controller, animated: true) {player.play()}
DVR (live rewind)
Enable dvr: true when creating the stream. Viewers can seek within dvrWindowSeconds. Most players expose this automatically on the live edge timeline.
// Create with 2-hour DVRawait fetch('https://api.sendexa.co/v1/video/streams', {method: 'POST',headers: {'Content-Type': 'application/json',Authorization: 'Basic YOUR_DASHBOARD_BASE64_TOKEN',},body: JSON.stringify({name: 'Town Hall',dvr: true,dvrWindowSeconds: 7200,latencyMode: 'standard',}),});
Signed / private playback
For tickets or members-only streams, mint short-lived playback tokens from your backend. Pass them as a query param or Authorization header depending on player support.
curl -X POST 'https://api.sendexa.co/v1/video/streams/str_01JQX7K2M9N4P5/playback-tokens' \-H 'Content-Type: application/json' \-H 'Authorization: Basic YOUR_DASHBOARD_BASE64_TOKEN' \-d '{"ttl": 600,"viewerId": "user_42","capabilities": ["live", "dvr"]}'
{"success": true,"code": "PLAYBACK_TOKEN_ISSUED","data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…","expiresAt": "2026-07-12T18:15:00.000Z","playbackUrl": "https://live.sendexa.co/str_01JQX7K2M9N4P5/index.m3u8?token=eyJ…"}}
Enable private mode
playbackAccess: "private" when creating the stream (or toggle in the dashboard). Public manifests will then reject unauthenticated requests.VOD after the stream ends
With record: true, Sendexa archives the broadcast. When processing completes, you receive video.recording.ready (same family as room recordings) with a signed MP4 URL — see Webhooks.