FrameFetch
For agents → Try it free
Subtitles

Video Subtitles API

Turn any YouTube, TikTok, Instagram Reels, Reddit, or Pinterest video URL into a ready-to-publish .srt or .vtt subtitle file — in one API call. Optionally translate the subtitles into 25 languages first. No separate transcription step, no separate translation step, no separate subtitle-formatting step.

Read the docs Pricing

Why this matters now

The European Accessibility Act (EAA) has been enforced since June 2025, and captions/subtitles are a recurring requirement for video content offered to consumers in the EU. Whether you're retrofitting an existing video library or shipping new content, FrameFetch turns a bare video URL into a standards-compliant subtitle file — SubRip or WebVTT — without you having to run your own transcription, translation, or timing pipeline.

One call, subtitle file out

Add ?format=srt or ?format=vtt to /v1/extract (or /v1/transcript) with "transcript" in fields, and the response body is the subtitle file itself — Content-Type: application/x-subrip or text/vtt — built from the transcript's timed segments (Whisper verbose_json or the platform's own caption cues). It's a pure egress view: same cached result, same cost, same cache key as the plain JSON call, so subtitles are included at no extra charge beyond the transcript itself.

curl -X POST "https://framefetch.net/v1/extract?format=srt" \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "fields": ["transcript"]
  }'
1
00:00:00,000 --> 00:00:03,200
All right, so here we are in front of the elephants...

2
00:00:03,200 --> 00:00:07,800
The cool thing about these guys is their trunks...
Translated subtitles

Add a top-level "translate": "<iso-639-1>" to the same call and the subtitle file is built from the translated transcript instead — 25 languages supported (en, es, de, fr, pt, it, nl, pl, tr, ru, uk, ar, hi, id, vi, th, ja, ko, zh, sv, da, no, fi, cs, ro). Translation is billed per audio-minute like transcription — the same rate, $0.0015/audio-minute — even when the source transcript came from free platform captions, since translation is a separate LLM pass; the subtitle rendering itself stays free.

curl -X POST "https://framefetch.net/v1/extract?format=vtt" \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "fields": ["transcript"],
    "translate": "es"
  }'
WEBVTT

00:00:00.000 --> 00:00:03.200
Muy bien, aquí estamos frente a los elefantes...

00:00:03.200 --> 00:00:07.800
Lo interesante de estos animales es su trompa...

Prefer the translated transcript as JSON instead of a subtitle file? Drop the ?format= query param — the same translate request returns transcript_translated: { lang, text, segments } alongside the untouched original transcript.

Use it from an AI agent (MCP)

FrameFetch ships an MCP server at POST https://framefetch.net/mcp. The framefetch_extract tool takes the same translate arg, plus subtitle_format: "srt"|"vtt", which adds a top-level subtitles string to the JSON tool result (MCP results are always JSON, so it adds a field rather than switching content type the way the HTTP ?format= query param does).

FAQ
Which subtitle formats are supported?

SubRip (.srt) and WebVTT (.vtt), selected with ?format=srt or ?format=vtt on any extract-family call, or subtitle_format on the MCP tool.

Can I get translated subtitles?

Yes. Add a top-level translate param with an ISO-639-1 language code (25 languages supported) and the subtitle file is built from the translated transcript instead of the source language.

Do subtitles cost extra?

No. Rendering ?format=srt or ?format=vtt is a free egress view over the same cached result — you pay only for the transcript (and translation, if requested), never a separate subtitle fee.

Which platforms does it work on?

Any platform FrameFetch supports a transcript for: YouTube (incl. Shorts), TikTok, Instagram Reels, Reddit, and Pinterest.

What happens if there is no timed transcript available?

The API returns a 409 SUBTITLES_UNAVAILABLE error instead of an empty or malformed subtitle file — most commonly for an older cached result from before segment timings existed.