FrameFetch
For agents → Try it free
Any video URL to text

Video Transcription API

Transcribe any YouTube, TikTok, Instagram, Reddit, or Pinterest video straight from its URL — flat text plus timestamped segments, in one call. FrameFetch uses the video's own captions when it has them and Whisper when it doesn't, and tells you which. No yt-dlp, no ffmpeg, no Whisper model to host.

Get a free key Read the docs

Captions when they exist, Whisper when they don't

Transcription usually means running Whisper on downloaded audio. That's wasteful when the video already ships an exact caption track. FrameFetch checks first: if there's a usable caption track it fetches that — faster, exact, and with no per-minute audio charge — and only falls back to Whisper when there isn't one. You don't choose; the transcript.source field reports which happened, "captions" or "whisper", so you can treat them differently if you want.

PlatformUsual source
YouTube & ShortsCaptions (fetched) — Whisper if a video has none
TikTokWhisper (no reliable captions)
Instagram ReelsWhisper
Reddit videoWhisper
Pinterest videoWhisper
One call, a URL in, a transcript out

POST the URL with fields: ["transcript"] (or use the dedicated /v1/transcript endpoint). You get the flat text and timestamped segments back.

curl -X POST https://framefetch.net/v1/extract \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=...",
    "fields": ["transcript"]
  }'
{
  "transcript": {
    "text": "the full transcript as one string ...",
    "source": "captions",
    "lang": "en",
    "segments": [
      { "start": 0, "end": 7, "text": "..." },
      { "start": 7, "end": 13, "text": "..." }
    ]
  },
  "cost": { "totalMicros": 2000 }
}

Measured against the live API: a YouTube video with captions comes back as source: "captions" with the caption cues as segments; a TikTok or Instagram clip comes back as source: "whisper", transcribed from the audio — the request is identical either way, only source differs.

What's in the transcript
FieldShapeWhat it is
textstringThe full transcript as one flat string
segmentslistTimestamped cues: { start, end, text }, seconds
sourcestring"captions" (fetched) or "whisper" (from audio)
langstring | nullDetected language of the track

Need it in another language? Add "translate": "<iso-639-1>" for translated subtitles, or request "audio_digest" for a spoken summary. Want an answer instead of the whole transcript? Add a top-level ask question and get a grounded reply with timestamped quotes — see the Q&A API.

Pricing

Free tier: 100 calls a month. Transcription is $0.0015/min of video, with a $0.002 minimum per call; a captions-sourced transcript avoids the per-minute audio work and often lands at the floor. Every response returns an exact cost.totalMicros. When credit runs out you get a 402 with a machine-readable body — top up with card or x402 (USDC). Full breakdown on pricing.

Get a free key YouTube-specific In Python SRT/VTT subtitles