September 23, 2026 · 14 min read
YouTube Transcript Scraper: 2,296 Runs by 146 Users (2026)
Each dataset record carries 21 output fields, including timestamped segments, full concatenated text, and core video metadata extracted from public YouTube links. The scraper retrieves manual captions or auto-generated subtitles, with an optional local Whisper AI fallback that processes audio when native tracks are disabled. Apify's free plan includes $5.00 of monthly usage with no credit card, covering up to 500 results of this Actor. This tool is built for engineers and researchers constructing training corpora or analyzing spoken content, and is not for anyone who needs creator email addresses or contact details, which the records do not include.
Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 500 results at $0.01 each before platform usage. Open YouTube Transcript Scraper on Apify and run the prefilled example.
How reliable is YouTube Transcript Scraper in production?
Across the last 30 days of public runs on the Apify platform, YouTube Transcript Scraper recorded 1,820 runs with the following outcomes.
| Outcome | Runs | Share |
|---|---|---|
| Succeeded | 1,351 | 74.2% |
| Failed | 0 | 0.0% |
| Aborted by the user | 34 | 1.9% |
| Timed out | 435 | 23.9% |
| Total | 1,820 | 100.0% |
Schedule unattended runs with smaller input batches and robust alerting to handle about one run in 4 failing or timing out. Aborted runs were stopped by the user rather than failing automatically.
What does it cost to run YouTube Transcript Scraper?
Each result costs $0.01 on Apify's free plan, which is $10.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.01 | $10.00 |
| BRONZE | $0.00833 | $8.33 |
| SILVER | $0.00667 | $6.67 |
| GOLD | $0.005 | $5.00 |
| PLATINUM | $0.005 | $5.00 |
| DIAMOND | $0.005 | $5.00 |
Worked example: collecting 10,000 results costs $100.00 in result charges before run-start fees and platform usage. With 23.9% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.
The primary billing driver is the total volume of written dataset results multiplied by the result price. The most efficient way to test feasibility before committing funds is to execute a single target URL on Apify's free plan.
How do you run YouTube Transcript Scraper from the API?
The schema marks 1 of its 7 controls as required: videoUrls. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~youtube-transcript-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"videoUrls":["https://www.youtube.com/watch?v=jNQXAC9IVRw","https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"language":"","includeAutoGenerated":true,"useWhisper":true,"whisperModel":"base","proxyCountry":"US","outputFormat":"full"}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"videoUrls": [
"https://www.youtube.com/watch?v=jNQXAC9IVRw",
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"language": "",
"includeAutoGenerated": True,
"useWhisper": True,
"whisperModel": "base",
"proxyCountry": "US",
"outputFormat": "full"
}
run = client.actor("crawlerbros~youtube-transcript-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"videoUrls": [
"https://www.youtube.com/watch?v=jNQXAC9IVRw",
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"language": "",
"includeAutoGenerated": true,
"useWhisper": true,
"whisperModel": "base",
"proxyCountry": "US",
"outputFormat": "full"
}
const run = await client.actor('crawlerbros~youtube-transcript-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.
Which YouTube Transcript Scraper inputs matter, and which can you skip?
The videoUrls parameter is the sole required control and expects an array of YouTube watch URLs, short links, or 11-character video IDs. Leave advanced configuration parameters at their defaults on your initial run until basic caption extraction is verified.
videoUrls(array): YouTube video URLs, short links (youtu.be), shorts URLs, or plain video IDs.language(string): Preferred transcript language code (e.g., 'en', 'es', 'fr'). Leave empty for default language. If the requested language is not available, the scraper will attempt translation or fall back to the default. Default:"".includeAutoGenerated(boolean): Whether to include auto-generated captions when manual captions are not available. Default:true.useWhisper(boolean): When YouTube has no transcript (disabled captions, music-only, or blocked), download the audio and transcribe with Whisper AI (faster-whisper, CPU). Adds ~30-180 s per video. Enabled by default to guarantee transcript output even when YouTube captions are unavailable. Default:true.whisperModel(string): Whisper model size to use whenuseWhisperis enabled. Larger = more accurate but slower and more RAM. 'base' is balanced. Default:"base".proxyCountry(string): Country/region for the proxy IP. Useful if transcripts are geo-blocked in the default US region. Default:"US".outputFormat(string): Controls how transcript data is included in the output. 'full' = all fields including segments array. 'text_only' = only full_text (no segments array, smaller output). 'segments_only' = only the segments array (no full_text). Default:"full".
Fixed-choice controls: whisperModel accepts tiny (fastest, ~39 MB), base (balanced, ~74 MB), small (~244 MB), medium (best quality/speed, ~769 MB), large-v3-turbo (highest accuracy, ~800 MB); proxyCountry accepts 30 values (default US), including US (United States), GB (United Kingdom), CA (Canada), AU (Australia); outputFormat accepts full (segments + text), text_only (no segments array), segments_only (no full_text).
What does YouTube Transcript Scraper return?
Returned records provide rich textual data including channel names, view counts, language metadata, and segmented timestamps ideal for natural language processing pipelines. They conspicuously lack direct creator contact details, monetization metrics, and video description text beyond basic metadata.
video_id: YouTube 11-character video IDtitle: Video titlechannel_name: Channel display namechannel_id: Channel ID (when available)duration_seconds: Video duration in seconds (when available)views: View count (when available)published_date: Publish date inYYYY-MM-DD(when available)thumbnail: Thumbnail URLtranscript_language: Language code of the extracted transcript (e.g.en,es,ko)transcript_language_name: Full language nameis_auto_generated:trueif the transcript is YouTube's auto-caption,falsefor manually uploaded captions or Whisper outputtranscript_source:library/innertube/playwright_dom/whisper- tells you which path produced the transcriptlanguage_probability: Whisper's language-detection confidence (only set whentranscript_source=whisper)available_languages: Array of every transcript language available for the videosegments: Timestamped segments -start,dur,textsegment_count: Number of segments returnedfull_text: Complete transcript joined into a single stringsuccess:truewhen a transcript was extracted,falseotherwiseerror: Reason text whensuccess=falseinputUrl: The URL you submittedscrapedAt: ISO 8601 UTC timestamp
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open YouTube Transcript Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Populate the videoUrls field with an array containing at least one public YouTube watch URL, short link, or 11-character video ID before running.
- Set the language control to your preferred transcript language code or leave it empty to retrieve the best available transcript.
- Toggle includeAutoGenerated to false if you want to restrict output strictly to manually created captions or Whisper output.
- Enable useWhisper to true if you need fallback transcription for videos that lack native captions or have disabled them.
- Select a model size in whisperModel matching your audio complexity, keeping in mind that larger models take more processing time.
- Choose a target country code in proxyCountry if the target videos are geo-restricted outside of the US region.
- Adjust outputFormat to full, text_only, or segments_only depending on whether you need the full array or just plain text.
- Inspect the resulting dataset records to verify that success is true and that transcript_source matches your expected extraction path.
How do you apply it? Three worked playbooks
These are YouTube Transcript Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: AI training data
Outcome: Build text corpora from YouTube content for LLM fine-tuning or RAG pipelines.
Configure: Provide a broad array of target URLs in videoUrls, set outputFormat to text_only to minimize storage size, and keep useWhisper enabled with whisperModel set to base.
Working method: Start by passing a small batch of five video URLs to verify clean text output in full_text, compare the resulting corpus against expected token counts, and then scale up the input array once formatting is confirmed.
Deliverable: A clean dataset of plain-text transcript strings paired with video metadata for direct ingestion into embedding models or training pipelines.
Stop condition: The dataset contains consecutive records where success is false due to unavailable caption tracks or unresolvable audio restrictions.
Use case 2: Research and analysis
Outcome: Pull spoken content from lectures, interviews, podcasts, and documentaries.
Configure: Set videoUrls to target educational or documentary URLs, leave outputFormat on full to retain timestamped blocks, and select proxyCountry matching the regional release if restricted.
Working method: Execute a single test run on a known lecture video, inspect the start and dur values within the segments array to verify precise timestamp alignment, and then process your complete academic or documentary playlist.
Deliverable: A structured dataset containing timestamped transcript segments alongside view counts, publication dates, and channel names for detailed qualitative coding.
Stop condition: Dataset items show malformed start times or missing segment arrays when processing long-form media.
Use case 3: Content repurposing
Outcome: Turn long videos into blog posts, summaries, or social copy.
Configure: Input long-form podcast or tutorial links into videoUrls, set useWhisper to true, and configure whisperModel to small for accurate handling of conversational speech.
Working method: Run the Actor on a single source video, extract the full_text field into an external summarization prompt, check for coherence across speaker transitions, and automate the ingestion of larger video batches.
Deliverable: Complete transcripts ready for immediate summarization into blog posts, newsletter editions, or social media threads.
Stop condition: The Whisper transcription produces repetitive hallucinated text loops due to background music or low-quality audio input.
What breaks, and how do you design around it?
- Private, members-only, age-restricted, and deleted videos cannot be scraped.
- Whisper transcription uses CPU, so it adds 30-180 s per video depending on length and model size.
- Whisper accuracy on heavy music or pure-instrumental audio is fundamentally limited regardless of model size.
- YouTube can change its caption infrastructure; the scraper has multiple fallback paths but a transient outage may still cause
success=falsefor individual videos.
When encountering timeouts on lengthy video batches, reduce the input array size to process fewer items per run. For videos without captions where Whisper falls back on CPU processing, expect longer execution times ranging from 30 to 180 seconds per video.
When should you not use YouTube Transcript Scraper?
Do not use this Actor if you need comprehensive channel analytics, subscriber counts, or video publishing catalogs, as it focuses strictly on transcripts and basic video metadata. If your requirements involve indexing entire channel catalogs or scraping comment discussion trees, you should look elsewhere because this tool does not extract replies, channel stats, or comment threads. For collecting comments or comment threads, use the YouTube Comment Scraper instead, and for retrieving full channel video listings, use the YouTube Channel Scraper.
What should you check before trusting the output?
- Verify that the success field is true for every returned dataset item before ingestion into downstream pipelines.
- Check that error is null or absent on all records, as presence of this field indicates caption extraction failed.
- Confirm that full_text is non-empty whenever success is true and outputFormat is set to full or text_only.
- Verify that segment_count matches the actual length of the segments array in records where segments are requested.
- Check that is_auto_generated accurately reflects whether the captions came from YouTube automation or direct upload.
None of this proves a record is correct. It gives a scheduled YouTube Transcript Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What happens if a target video has captions completely disabled by the uploader?
When a video has no native captions, enabling useWhisper instructs the scraper to download the audio track and process it locally using Whisper AI. This guarantees that you still receive a valid transcript even when YouTube caption infrastructure blocks direct access, though it adds processing time depending on video length and model size.
How does the billing structure handle runs that fail to return any valid transcript data?
Every execution incurs a run-start platform fee regardless of whether results are ultimately produced. Per-result charges apply strictly to dataset items successfully written to storage, meaning failed video lookups that return no records do not incur item-level result fees.
Can I process YouTube Shorts and shortened youtu.be links in the same input array?
Yes, the videoUrls parameter accepts standard watch URLs, youtu.be short links, Shorts URLs, embed links, and raw 11-character video IDs interchangeably within the same submitted array. Each URL is processed sequentially and written as an individual dataset row.
How are different transcript source methods distinguished within the dataset records?
The transcript_source field explicitly indicates how the text was retrieved using values such as library for official caption tracks, innertube for internal API extraction, playwright_dom for in-panel scraping, or whisper for local speech-to-text generation. This lets you audit the reliability path for every single record in your dataset.
Where to go next
When you are ready to run it, open YouTube Transcript Scraper on Apify; the free plan covers up to 500 results a month.
Start with the YouTube Transcript Scraper Actor page for the current input schema, pricing tier, and run history.
It is part of the YouTube Scraping Suite, which puts every related Actor on one page with its price and run history.
If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:
- Video and transcript scrapers covers 46 Actors in this family.
Readers running YouTube Transcript Scraper commonly pair it with:
- YouTube Video Details Scraper: Extract comprehensive details from YouTube videos including metadata, channel information, transcripts, comments, and engagement metrics.
- YouTube Comment Scraper: Scrape YouTube video comments with full metadata.
- Instagram Transcript Scraper: Extract transcripts from Instagram videos and reels using auto-generated captions or AI-powered speech-to-text.
- TikTok Transcript Scraper: Extract transcripts and subtitles from TikTok videos in all available languages.
- YouTube Search Scraper: Scrape YouTube search results without cookies.
- YouTube Trending Scraper: Scrape trending and popular YouTube videos by category.
- YouTube Video Downloader: Download YouTube videos, playlists, and entire channels in your preferred quality from 360p all the way up to the best available resolution.
- YouTube Channel Scraper: Scrape YouTube channel info and video listings.
Related guides:
- YouTube Comment Scraper: 3 Operating Playbooks for YouTube Data
- Instagram Transcript Scraper Guide: Extraction Setup and Usage
- TikTok Transcript Scraper: Operational Playbooks and Workflows
- YouTube Search Scraper: Up to 1,000 Free Results a Month (2026)
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-23.
Actor last updated by its maintainers on 2026-06-22.
Run outcome figures cover the 30 day public window ending 2026-09-23.
● Featured actors
Youtube Transcript Scraper
Extract transcripts and captions from YouTube videos with language selection support. Returns timestamped segments, full concatenated text, and basic video metadata.
Run on Apify ↗