Skip to main content
Every /api/movie, /api/tv, /api/stream/movie, and /api/stream/tv response includes a subtitles array alongside sources.

Subtitle Object

{
  "url": "https://vdrk.b-cdn.net/cache/movie/550/English.vtt",
  "label": "English",
  "format": "vtt"
}
url
string
required
Direct URL to the subtitle file. May require a Referer header — route through /api/proxy to handle automatically.
label
string
required
Display name — e.g. English, English [CC], French, Bengali
format
string
required
vtt or srt. Most subtitles are VTT; SRT files come primarily from the hakunaymatata CDN.

Sources

Subtitles are collected from multiple providers and merged:

Filtering & Deduplication

Only English subtitles are returned. A subtitle is kept if any of the following match:
  • label contains "english" or "en"
  • language code matches eng, en, en-us, or en-gb
  • label is "unknown"

Common Labels

LabelDescription
EnglishStandard English subtitles
English [CC]Closed captions — includes sound descriptions
English - EnglishDuplicate label from VidRock CDN naming
English 1, English 2Multiple English tracks (e.g. SDH vs standard)
FrenchFrench subtitles
French - Canadian FrenchCanadian French variant
BengaliBengali subtitles from VidRock

VTT vs SRT

FormatNotes
vttNative browser support — works directly in <track src>
srtRequires conversion for browser playback. Use subtitle.js or a proxy that converts on the fly

Using Subtitles

Subtitle URLs from VixSrc and some CDN sources require a Referer header. Route them through /api/proxy:
const res = await fetch("https://vyla-api.pages.dev/api/movie?id=550");
const data = await res.json();

const video = document.getElementById("player");

data.subtitles.forEach((sub, i) => {
  const track = document.createElement("track");
  track.kind = "subtitles";
  track.label = sub.label;
  track.srclang = sub.label.toLowerCase().startsWith("fr") ? "fr" : "en";
  track.src = "https://vyla-api.pages.dev/api/proxy?url=" + encodeURIComponent(sub.url);
  if (i === 0) track.default = true;
  video.appendChild(track);
});
The /api/player endpoint handles all of this automatically — subtitles are proxied and injected as <track> elements with no configuration needed.