Movie Subtitles
curl --request GET \
--url http://localhost:7860/api/subtitles/movie/{tmdb_id} \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost:7860/api/subtitles/movie/{tmdb_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:7860/api/subtitles/movie/{tmdb_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "7860",
CURLOPT_URL => "http://localhost:7860/api/subtitles/movie/{tmdb_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:7860/api/subtitles/movie/{tmdb_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:7860/api/subtitles/movie/{tmdb_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:7860/api/subtitles/movie/{tmdb_id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"[]": [
{
"label": "<string>",
"file": "<string>",
"type": "<string>",
"source": "<string>"
}
]
}Subtitles
Movie Subtitles
Fetch all available subtitle tracks for a movie.
GET
/
api
/
subtitles
/
movie
/
{tmdb_id}
Movie Subtitles
curl --request GET \
--url http://localhost:7860/api/subtitles/movie/{tmdb_id} \
--header 'Authorization: Bearer <token>'import requests
url = "http://localhost:7860/api/subtitles/movie/{tmdb_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://localhost:7860/api/subtitles/movie/{tmdb_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "7860",
CURLOPT_URL => "http://localhost:7860/api/subtitles/movie/{tmdb_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:7860/api/subtitles/movie/{tmdb_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:7860/api/subtitles/movie/{tmdb_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:7860/api/subtitles/movie/{tmdb_id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"[]": [
{
"label": "<string>",
"file": "<string>",
"type": "<string>",
"source": "<string>"
}
]
}Returns an array of subtitle tracks for a movie. Each track is a direct link to a
HTML
.vtt or .srt file — no proxy needed. Requires a standard or partner API key. Subtitle tracks are also bundled automatically in /movie responses as part of the meta event; use this endpoint when you need them independently.
Path Parameters
string
required
TMDB movie ID.Example:
/api/subtitles/movie/550 → subtitles for Fight ClubRequest
curl http://localhost:7860/api/subtitles/movie/550 \
--header "Authorization: Bearer YOUR_API_KEY"
const subtitles = await fetch(
'http://localhost:7860/api/subtitles/movie/550',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
).then(r => r.json());
subtitles.forEach(sub => {
console.log(`${sub.label} (${sub.type}): ${sub.file}`);
});
interface Subtitle {
label: string;
file: string;
type: string;
source: string;
}
const subtitles: Subtitle[] = await fetch(
'http://localhost:7860/api/subtitles/movie/550',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
).then(r => r.json());
import requests
subtitles = requests.get(
'http://localhost:7860/api/subtitles/movie/550',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
).json()
for sub in subtitles:
print(f"{sub['label']} ({sub['type']}): {sub['file']}")
Response
Returns a JSON array.404 if no subtitles are found for this title.
Subtitle[]
Array of subtitle track objects.
Show Subtitle object
Show Subtitle object
Responses
- 200 — Success
- 404 — Not Found
- 401 — Unauthorized
- 403 — Forbidden
- 500 — Server Error
[
{
"label": "English",
"file": "https://sub.vdrk.site/v1/movie/550/English.vtt",
"type": "vtt",
"source": "v1"
},
{
"label": "Spanish",
"file": "https://sub.vdrk.site/v1/movie/550/Spanish.vtt",
"type": "vtt",
"source": "v1"
},
{
"label": "French",
"file": "https://sub.vdrk.site/v2/movie/550/French.vtt",
"type": "vtt",
"source": "v2"
}
]
No subtitle tracks were found for this TMDB ID.
{ "error": "no subtitles found" }
{ "error": "Missing API key. Provide via Authorization header or X-API-Key header." }
{ "error": "Public keys cannot access subtitle endpoints" }
{ "error": "<error message>" }
Usage Examples
HTML <track> element
<video id="player" controls></video>
<script>
fetch('http://localhost:7860/api/subtitles/movie/550', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
})
.then(r => r.json())
.then(subs => {
const video = document.getElementById('player');
subs.forEach((sub, i) => {
const track = document.createElement('track');
track.kind = 'subtitles';
track.label = sub.label;
track.src = sub.file;
track.default = i === 0;
video.appendChild(track);
});
});
</script>
Video.js
import videojs from 'video.js';
const subs = await fetch(
'http://localhost:7860/api/subtitles/movie/550',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
).then(r => r.json());
const player = videojs('player');
subs.forEach(sub => {
player.addRemoteTextTrack({
kind: 'subtitles',
label: sub.label,
src: sub.file,
}, false);
});
Plyr
import Plyr from 'plyr';
const subs = await fetch(
'http://localhost:7860/api/subtitles/movie/550',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
).then(r => r.json());
subs.forEach(sub => {
const track = Object.assign(document.createElement('track'), {
kind: 'captions',
label: sub.label,
src: sub.file,
});
document.getElementById('player').appendChild(track);
});
const player = new Plyr('#player', {
captions: { active: true, update: true },
});
Subtitle tracks are included automatically in
/movie responses inside the meta event. Only call this endpoint when you need subtitles without fetching stream sources.
