YouTube Transcript Scraper - Subtitles to Text, Pay per Video
Pricing
$5.00 / 1,000 transcript delivereds
YouTube Transcript Scraper - Subtitles to Text, Pay per Video
Transcripts and subtitles for any list of YouTube videos: full text, timestamped segments, language fallback, translation, title and channel. No browser, residential proxy rotation on blocks, charged only for videos that return a transcript.
YouTube Transcript Scraper — subtitles to text, one row per video, pay only for transcripts you get
Turn any list of YouTube videos into clean transcript text with timestamped segments, the language used, whether it was auto-generated, plus title and channel. Give it watch URLs, Shorts, youtu.be links or bare video IDs. Get JSON, CSV or Excel back, or call it from the API, a schedule, an integration or an AI agent.
- Charged per transcript delivered. A video with captions disabled, a private video, or a block that
survives every retry is reported as a row with a
status, and costs nothing. - No browser. Plain HTTP against YouTube's caption endpoints, so a video takes about a second.
- Blocks are handled. YouTube blocks datacenter IPs for transcripts; this Actor rotates residential
proxy sessions and retries a fixed number of times, then reports
blockedinstead of looping. - Language fallback that makes sense. Your preferred languages first, manually created captions before auto-generated ones, optional translation into any language YouTube supports.
Output
One row per video:
| field | meaning |
|---|---|
status | ok, no_transcript, captions_disabled, unavailable, blocked, error |
text | the full transcript as one string |
segments[] | start, duration, text for every caption line (optional) |
language, source_language, is_generated | what you got and where it came from |
available_languages[] | every transcript YouTube offers for the video |
word_count, segment_count, duration_seconds | size of the transcript |
title, channel, channel_url, thumbnail | public metadata (optional) |
video_id, url | the video |
Sample row (segments shortened):
{"video_id":"dQw4w9WgXcQ","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","status":"ok","language":"en","source_language":"en","is_generated":false,"segment_count":61,"duration_seconds":211.6,"word_count":372,"text":"[♪♪♪] We're no strangers to love ...","segments":[{"start":18.8,"duration":3.6,"text":"We're no strangers to love"}],"title":"Rick Astley - Never Gonna Give You Up","channel":"Rick Astley"}
Input
| field | default | notes |
|---|---|---|
videoUrls | — | URLs or 11-character IDs, one per line |
languages | ["en"] | preference order, e.g. ["de", "en"] |
allowAutoGenerated | true | fall back to YouTube's automatic captions |
translateTo | "" | e.g. en to translate a Spanish transcript |
includeSegments | true | timestamped lines next to the full text |
includeMetadata | true | title, channel, thumbnail |
concurrency | 5 | videos in parallel (1–20) |
maxRetries | 4 | proxy sessions to try per video when blocked |
proxyConfiguration | Apify residential | recommended; datacenter IPs get blocked |
Minimal input:
{ "videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }
Pricing
Pay per transcript delivered (see the Pricing tab). Rows with any status other than ok are free.
Use cases
Summaries and notes from lectures or podcasts · feeding videos into an LLM or RAG pipeline · subtitles for translation · keyword and topic mining across a channel · quote finding with timestamps · accessibility text.
Honesty notes and limits
- Transcripts are what YouTube provides: manually uploaded captions when they exist, otherwise automatic
captions, whose accuracy depends on audio quality.
is_generatedtells you which you got. - Live streams without captions, members-only and age-restricted videos may have no transcript.
- Public data only. No login, no personal data collected.
- If YouTube blocks every retry for a video, you get a
blockedrow and no charge; run again later or raisemaxRetries.
Support
Open an issue on the Issues tab. Runs that fail say why, per video, in the error field.