Stellar embed API

One iframe. Any TMDB title.

Embed the Stellar player for a movie or a specific TV episode using its TMDB ID. Every embed is ad-free, with no API key or player SDK required.

Movie embed

4K demo

TMDB movie 1081003

https://stellar.rip/en/watch/embed/movie/1081003?theme=9B8CFF&title=true&poster=true&autoPlay=false&startAt=0

TV episode embed

4K demo

TMDB show 83867 · Season 1 · Episode 1

https://stellar.rip/en/watch/embed/tv/83867-1-1?theme=9B8CFF&title=true&poster=true&autoPlay=false&startAt=0&nextButton=true&autoNext=false

Configure and preview

Make the player fit your site

Select media, configure its chrome and playback, then compare the exact player at desktop and mobile widths.

Live movie preview

Responsive desktop 16:9 viewport

https://stellar.rip/en/watch/embed/movie/1081003?theme=9B8CFF&title=true&poster=true&autoPlay=false&startAt=0
HTML
<iframe
  id="stellar-player"
  src="https://stellar.rip/en/watch/embed/movie/1081003?theme=9B8CFF&title=true&poster=true&autoPlay=false&startAt=0"
  title="Stellar 4K movie player demo"
  width="100%"
  style="aspect-ratio: 16 / 9; border: 0;"
  allow="autoplay; fullscreen; picture-in-picture; encrypted-media"
  allowfullscreen
></iframe>

URL formats

Movie

https://stellar.rip/{language}/watch/embed/movie/{tmdb_id}

TV episode

https://stellar.rip/{language}/watch/embed/tv/{tmdb_id}-{season}-{episode}

Use the numeric ID from TMDB, not an IMDb ID. Season and episode numbers are required for TV embeds. Replace languagewith one of the supported locale codes below.

Supported player languages

Change the locale immediately after the hostname. For example, use /fr/watch/embed/... for French or /fil/watch/embed/... for Filipino. The selected locale translates player controls and available localized metadata. It does not force an audio or subtitle language; available tracks depend on the stream and can be selected in the player.

EnglishEnglishen
DutchNederlandsnl
GermanDeutschde
ItalianItalianoit
Spanish (Spain)Español (España)es-ES
Spanish (Latin America)Español (Latinoamérica)es-419
Chinese (Simplified)简体中文zh-CN
Chinese (Traditional)繁體中文zh-TW
Korean한국어ko
Japanese日本語ja
FrenchFrançaisfr
FilipinoFilipinofil
Hindiहिन्दीhi
Portuguese (Brazil)Português (Brasil)pt-BR
RussianРусскийru
Arabicالعربيةar

Query parameters

Add any combination after ? and join additional values with &. Invalid values are ignored and use the normal player defaults.

titleMovie + TV

Show or hide the media title.

Value: true | false

posterMovie + TV

Show or hide player artwork.

Value: true | false

autoPlayMovie + TV

Start when ready, or show the zero-progress artwork and Play screen when false.

Value: true | false

startAtMovie + TV

Begin at a non-negative timestamp.

Value: seconds

themeMovie + TV

Set the player accent color.

Value: RRGGBB

nextButtonTV

Show Up Next after 90% watched.

Value: true | false

autoNextTV

Load the next episode at the end; enable autoplay too.

Value: true | false

Playback events

Listen for parent-window messages to sync progress or update your own interface. Always verify the message origin before reading its data.

playpauseseekedendedtimeupdate

PLAYER_EVENT includes time, duration, TMDB ID, media type, and TV season/episode. MEDIA_DATA provides a progress snapshot.

JavaScript
const playerOrigin = "https://stellar.rip";
const getPlayerFrame = () => document.getElementById("stellar-player");

const initializePlayerMessages = () => {
  const playerFrame = getPlayerFrame();
  playerFrame?.contentWindow?.postMessage(
    { type: "STELLAR_EMBED_INIT" },
    playerOrigin
  );
};

window.addEventListener("message", (event) => {
  if (event.origin !== playerOrigin) return;
  const playerFrame = getPlayerFrame();
  if (event.source !== playerFrame?.contentWindow) return;

  if (event.data?.type === "STELLAR_EMBED_READY") {
    initializePlayerMessages();
    return;
  }

  if (event.data?.type === "PLAYER_EVENT") {
    const { event: name, currentTime, duration } = event.data.data;
    console.log(name, currentTime, duration);
  }

  if (event.data?.type === "MEDIA_DATA") {
    console.log("Playback progress", event.data.data);
  }
});

const connectPlayerFrame = () => {
  const playerFrame = getPlayerFrame();
  playerFrame?.addEventListener("load", initializePlayerMessages);
  if (playerFrame) initializePlayerMessages();
};

if (document.readyState === "loading") {
  document.addEventListener("DOMContentLoaded", connectPlayerFrame, {
    once: true,
  });
} else {
  connectPlayerFrame();
}