Wyzie Subs
Intro to Wyzie Subs#
Wyzie Subs is a subtitle scraping API with a free tier. There are two ways to make requests to the API: using our NPM package or directly fetching the Wyzie API itself. I recommend using our package, but some may find the types cumbersome. In order to use the API, you must first make that decision.
What Else Wyzie Subs Does#
Beyond search and download, a few other things are worth knowing about:
- Wyzie Synced: line a subtitle up to your video from a speech timestamp list or the audio itself, up to a whole 4K file (Pro, 5 requests).
-
Download options: a second language under each line with
dual=<lang>, or per-requestoffset,fps,plain,sdhandclean. See Direct Fetching. - AI Translation: get any subtitle in 80+ languages on demand. 1 request on any key, free keys included, the same as a download.
- Status API: uptime and per-provider health as JSON, for your own status page or monitoring.
- Wyzie Transcribe: subtitles for any audio or video, such as podcasts, YouTube videos and lectures, by speech recognition (Pro, 6,000 requests per 30 minutes). Label who is speaking, translate the result, or do up to 50 files at once.
- Fix Subtitles: correct wrong words, re-time and add missing lines of a subtitle by listening to the video (Pro, 6,000 requests per 30 minutes).
- Search by Quote: remember a line but not the title? Find the movie or episode it is said in (free on a free key, 1 request on Pro).
- Best match: send the video's file name and hash with a search and get the subtitle that fits that exact file first, with a match score.
- Webhooks for Transcribe, Fix Subtitles and bulk jobs, and browser-safe keys you can use in a web page.
- Extract Subtitles: pull the subtitle tracks out of an MKV or MP4 you already have (1 request per track, any key).
- Batch search for up to 50 titles in one call, and Usage and Balance for your balance, a breakdown and a low-balance webhook.
- Clients and Tools: Python, Go and an MCP server, an OpenAPI description, and a live API Playground.
Search and download each cost 1 request. A batch search costs 1 per title, extracting a subtitle track 1, AI translation 1 on any key, and a Wyzie Synced sync 5. A quote search is free on a free key and costs 1 on Pro, Wyzie Transcribe and Fix Subtitles cost 6,000 per 30 minutes of audio, and GET /usage is free. See API Keys for free vs. Pro limits.
Protecting Your API Key#
Your API key should be kept private and never appear in:
- Browser JavaScript (anything served to a script tag)
- Mobile app binaries (Android/iOS, including obfuscated ones)
- Browser extensions
- Electron / desktop apps distributed to end users
- Public Git repositories, gists, paste sites, or screenshots
If the key reaches an end user's machine, treat it as public. There are two safe patterns:
Option 1: Use Wyzie Worker#
Wyzie Worker is a lightweight Cloudflare Worker proxy that injects your API key server-side. Deploy it to Cloudflare Workers and set two secrets: NITRO_API_TOKEN (your Wyzie API key) and NITRO_WORKER_KEY (a secret you choose). Every request to the worker must send Authorization: Bearer <NITRO_WORKER_KEY>; without it the worker answers 401, and if NITRO_WORKER_KEY is not set it refuses every request with 503. The worker key must stay server-side too, so call the worker from your own backend, never from browser or app code. The worker forwards each request to sub.wyzie.io with your API key attached.
Your backend → your-worker.workers.dev/search?id=286217
Authorization: Bearer <NITRO_WORKER_KEY>
Worker → sub.wyzie.io/search?id=286217&key=<NITRO_API_TOKEN>Option 2: Build Your Own Proxy#
If you'd rather not use Wyzie Worker, you can build a simple server-side proxy in any framework. The idea is the same: your backend receives requests from your client, appends the API key, and forwards them to sub.wyzie.io.
// Example: a simple proxy endpoint
const API_KEY = process.env.WYZIE_API_KEY;
app.get('/subtitles', async (req, res) => {
const params = new URLSearchParams(req.query);
params.set('key', API_KEY);
const response = await fetch(`https://sub.wyzie.io/search?${params}`);
res.json(await response.json());
});