Video player URL parameters.
The player app is hosted on /play/ on your site. To play a slug, the url is https://yoursite.com/play/#/film/123
Note: the slug, and any player URL parameters go in the hash/fragment portion of the URL!
Some of these parameters (e.g. Chromecast, Airplay) are also controlled globally by site configuration.
| Parameter | Type | Description | Default |
|---|---|---|---|
| t | number | Position in the video to play from. | Resume from last watched. May prompt the user if they want to start over |
| from | string | Where the player was launched from. This is where the back button on the player titlebar will take you. Setting this to blank &from= will hide the back button |
|
| nav | bool | Set to false to hide the player title bar and back button. | true |
| airplay | string | false will disable the Airplay option | true |
| cast | bool | false will disable the Chromecast option | true |
| rates | bool | Enable faster playback rates UI | false |
| p | string | Playtoken. If provided this is used to authorize video playback. | None. The user’s auth will be used, and they’ll be redirected to sign in if unauthorized |
| u | string | User auth token. If provided this is used to authorize video playback. | None. The user’s auth will be used from browser storage, and they’ll be redirected to sign in if unauthorized |
| m | string | Additional playback position telemetry URL. Telemetry will be sent here as well as Shift72 servers |
https://vod.shift72.com/play/#/film/123?from=https:%2F%2Fapidocs.shift72.com&p=eyJhbGciOiJIUzI1NiIsInR5cCI...
The player sends events to its parent window using the browser’s postMessage API. These allow an embedding page to observe playback state, update its own UI, or collect additional telemetry.
All messages are objects with an event property prefixed with s72-player:.
Sent when playback starts or pauses.
{
event: 's72-player:play' | 's72-player:pause';
slug: string;
}
Sent when the playback position changes, playback finishes, or the user seeks to a different position.
{
event: 's72-player:timeupdate'
| 's72-player:ended'
| 's72-player:seeking'
| 's72-player:seeked';
slug: string;
currentTime: number;
duration: number;
}
currentTime and duration are measured in seconds.
The timeupdate event is sent periodically during playback, and may also be sent when the playback position changes. Its frequency depends on the underlying media player.
Sent when the volume or mute state changes.
{
event: 's72-player:volumechange';
slug: string;
volume: number;
muted: boolean;
}
volume is a number between 0 (silent) and 1 (full volume).
The embedding page can listen for messages using window.addEventListener:
window.addEventListener('message', (event) => {
// Verify the message came from your player
if (event.origin !== 'https://yoursite.com') return;
const message = event.data;
if (typeof message?.event !== 'string') return;
if (!message.event.startsWith('s72-player:')) return;
console.log(message);
});
The player sends a series of telemetry events roughly every 30 seconds of playback. This allows tracking engagement/watch time, and is also used to track playback progress.
If you provide a telemetry URL, these events will also be sent to your server as a POST request.
The user’s playtoken will be sent as the X-Play-Session header. This can be
decoded to access info about the user, or any additional claims added when
issuing an external user token.
The payload is documented in the telemetry endpoint
POST /your-api/telemetry
Host: yoursite.com
X-Play-Session: eyJhbGciOiJIUzI1NiIsInR5cCI...
Content-Type: application/json
{
"ts": "2025-08-08T00:11:34.524Z",
"slug": "/film/3283",
"player": 1,
"elapsed": 30,
"buffered": 0,
"bitrate": 4658,
"estbitrate": 88432,
"seeked": false,
"position": 30,
"length": 214,
"droppedFrames": 0,
"adBlocked": false
}
The web player will send telemetry with player id 1 (DASH: most browsers), or 6
(HLS: Safari and Safari-adjacent browsers). The additional telemetry URL will also be passed to Chromecast which will have player_id 4