Convert VTT to SRT with the SubtoVTT API

Convert WebVTT to SRT with the SubtoVTT API. See cURL, Python and Node.js examples. Pay per conversion, top up with credits. v1 · stable

Convert VTT to SRT programmatically with one HTTP request. The VTT to SRT API takes WebVTT captions and returns SRT — the de-facto universal standard for subtitle interchange. Almost every editor, player, and caption tool reads SRT.

Use this conversion when you're moving captions between platforms, prepping files for desktop editors, or normalizing a subtitle library into one interchange format. One credit per conversion, 100 free credits to start.

Why convert VTT to SRT with an API

  • Interchange: SRT is the format tools can always read.
  • Normalize: standardize a library of WebVTT files into SRT at scale.
  • Automate: no manual export from a caption editor.

Convert with cURL

curl -X POST https://api.example.com/api/v1/convert \
  -H "Authorization: Bearer your_api_key" \
  -F "[email protected]" \
  -F "from=vtt" \
  -F "to=srt" \
  -o movie.srt

Compact example — Node.js

const fs = require("node:fs");

(async () => {
    const form = new FormData();
    form.append("file", new Blob([fs.readFileSync("movie.vtt")]), "movie.vtt");
    form.append("from", "vtt");
    form.append("to", "srt");

    const res = await fetch("https://api.example.com/api/v1/convert", {
        method: "POST",
        headers: { Authorization: `Bearer ${process.env.SUBTOVTT_API_KEY}` },
        body: form,
    });
    if (!res.ok) throw new Error(await res.text());
    console.log("Cues:", res.headers.get("x-cue-count"));
    fs.writeFileSync("movie.srt", Buffer.from(await res.arrayBuffer()));
})();

Full examples by language

Format notes

Topic Detail
Output SubRip (.srt)
Header Drops the WEBVTT declaration line
Timestamps 00:00:01.00000:00:01,000
Styling Cue settings are dropped (SRT has no styling)
Usage Universal interchange, most editors

Note: SRT is a safe target for WebVTT content that doesn't rely on cue styling.

FAQ

What happens to WebVTT cue styling? SRT has no styling, so cue settings like align: and position: are dropped; dialogue and timing are preserved.

Can I resync while converting? Yes — shift_ms shifts all timestamps, and the two-point resync params handle non-linear drift.

Next

↑ Back to top