download api
One link to download any movie, show or anime
Link to a ready download page for any TMDB or IMDb ID: every quality as MP4 or MKV, subtitles as SRT or built into the file. Or use the JSON API.
Try it
Look up a title to see its downloads. Nothing downloads until you press a link.
Results show up here.
What you get
Every link is a plain file download, ready for a browser, a phone or a download manager
- Every qualityEach resolution the source has, best first, with its size.
- MP4 or MKVThe original video and audio, copied into one file without re-encoding.
- Starts at onceThe file is put together while it downloads, so the first bytes arrive in about a second.
- SubtitlesDownload them as SRT or VTT, or have them built into the file.
- Whole seasonsOne request lists every episode of a season with its links.
- Safe linksWith an API key set, the links you hand out are signed and expire on their own.
Download page
Link your visitors here. They get a page with a button for every quality and every subtitle, and each button downloads straight away. Shows have season and episode pickers and previous / next buttons.
/movie/{id}
/tv/{id}/{season}/{episode}
The API links show the same page when opened in a browser, while fetch(), apps and curl get JSON from them. Add ?json=1 to always get JSON.
<a href="/api/download/movie/786892">Download</a>
Options carry over: ?audio=dub prefers the dubbed anime, ?lang=en keeps one audio language and ?sub=en builds English subtitles into the video by default.
API documentation
Use TMDB IDs (1396) or IMDb IDs (tt0903747).
Movie downloads
Returns the qualities, sizes, audio tracks, subtitles and file links as JSON.
/api/download/movie/{id}
Episode downloads
The ID, season and episode number are required. Anime works like any show.
/api/download/tv/{id}/{season}/{episode}
A whole season
Every episode of the season with its links. Links are resolved when they are opened, so this answers instantly.
/api/download/tv/{id}/{season}
Direct file links
Open these to download the file straight away. Without a quality, the best one is used.
/download/movie/{id}?quality=1080p
/download/tv/{id}/{season}/{episode}?format=mkv&sub=en
<a href="/download/movie/786892?quality=720p" download>Download</a>
Parameters
Work on both the /api/download and /download routes. Start with ? and separate more with &.
| Parameter | Example | What it does |
|---|---|---|
quality | 720p | best (default), worst or a height. If that height is missing, the next one down is used |
format | mkv | mp4 (default) or mkv |
sub | en,es | Build subtitles in these languages into the file |
lang | en | Keep only audio tracks in these languages (all by default) |
audio | dub | Prefer the English-dubbed version of an anime |
key | … | Your API key, when the server needs one (or the x-api-key header) |
Response
size is an estimate from the stream's bitrate. Files are streamed while they are built, so the exact size isn't known in advance and pausing then resuming a download starts it again.
{
"media": { "tmdbId": 786892, "imdbId": "tt12037194", "type": "movie", "title": "Furiosa: A Mad Max Saga", "year": "2024", "poster": "…", "backdrop": "…" },
"page": "/movie/786892",
"filename": "Furiosa A Mad Max Saga (2024)",
"duration": 8891.7,
"audio": [{ "lang": "en", "label": "English", "codecs": "mp4a.40.2", "channels": 2 }],
"downloads": [
{
"quality": "1080p", "width": 1920, "height": 1080, "videoCodec": "avc1.640028",
"bitrate": 4200000, "size": 4668142500, "sizeLabel": "4.35 GB",
"mp4": "/download/movie/786892?quality=1080p",
"mkv": "/download/movie/786892?quality=1080p&format=mkv"
}
],
"subtitles": [
{ "label": "English", "lang": "en", "source": "moviebox", "srt": "/dash-proxy/sub/….srt?dl=…", "vtt": "…" }
],
"expires": null
}
Errors come back as { "error": "…" } with 400 (bad link), 401/403 (key or link not valid), 404 (no source), 429 (too many downloads from one address) or 503 (server busy).
Access
When the server has an API_KEY, the JSON routes need it. The file links they return are signed for that one title and expire after a few hours, so you can give them to your visitors without sharing your key.
const res = await fetch('/api/download/movie/786892', {
headers: { 'x-api-key': process.env.DOWNLOAD_API_KEY }
});
const { downloads } = await res.json();
// downloads[0].mp4 → https://…/download/movie/786892?quality=1080p&exp=…&sig=…