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.
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.
| Platform | Usual source |
|---|---|
| YouTube & Shorts | Captions (fetched) — Whisper if a video has none |
| TikTok | Whisper (no reliable captions) |
| Instagram Reels | Whisper |
| Reddit video | Whisper |
| Pinterest video | Whisper |
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.
| Field | Shape | What it is |
|---|---|---|
text | string | The full transcript as one flat string |
segments | list | Timestamped cues: { start, end, text }, seconds |
source | string | "captions" (fetched) or "whisper" (from audio) |
lang | string | null | Detected 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.
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.