YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $4.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

Get YouTube video transcripts and subtitles at scale. Extract plain text, timestamped segments, SRT and VTT, plus title, channel, views, and keywords. Optional Whisper AI fallback for caption-less videos.

Pricing

from $4.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Categories

Share

YouTube Transcript Scraper

YouTube Transcript Scraper extracts the transcript of any public YouTube video or Short — as plain text, timestamped segments, and ready-to-use SRT and VTT subtitle files — together with the video's title, channel, view count, duration, and keywords. When a video has no captions at all, an optional OpenAI Whisper (faster-whisper) fallback transcribes the audio inside the Actor.

Paste YouTube video, Shorts, or youtu.be URLs and get a clean transcript per video — plain text for LLMs, timestamped JSON segments, SRT and VTT subtitle strings, plus channel and view metadata — with a Whisper AI fallback for caption-less videos.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.

Actor: parsebird/youtube-transcript-scraper (Apify). Extracts YouTube video transcripts + subtitles + metadata. Call it with ApifyClient.
Input:
{
"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/VIDEO_ID", "https://www.youtube.com/shorts/VIDEO_ID"],
"language": "", // "" = original caption track; else ISO code: en, de, es, pt, fr, ja (auto-translated if the exact track is missing)
"whisperFallback": false, // true -> transcribe caption-less videos with Whisper (premium event)
"whisperMaxMinutes": 30, // per-video cap for the Whisper fallback
"maxItems": 100, // hard cap on billed transcript rows
"maxConcurrency": 10,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
startUrls is required. Accepts watch URLs, youtu.be, Shorts, embed URLs, and bare 11-char video IDs.
Output: one row per video — videoId, title, author, channelId, lengthSeconds, viewCount, keywords[], shortDescription, thumbnail,
transcript[{text,startMs,endMs,startTimeText}], transcript_only_text, transcript_srt, transcript_vtt, transcriptSource
(captions | auto-captions | whisper), language, isTranslated, transcriptError, transcriptSkipped.
Pricing: pay-per-event, tiered — ~$5 / 1,000 transcripts; Whisper fallback is a separate premium event.
API docs: https://apify.com/parsebird/youtube-transcript-scraper/api Token: https://console.apify.com/account/integrations

What does YouTube Transcript Scraper do?

This Actor is a YouTube transcript API and subtitle downloader. Give it video URLs and it returns, for each one:

  • 📝 Plain-text transcript (transcript_only_text) — one clean string, ready to drop into an LLM prompt, a summary, or a search index.
  • ⏱️ Timestamped segments (transcript) — text, startMs, endMs, and a human startTimeText (0:18, 1:02:03) for captions, chapters, or clip-finding.
  • 🎬 SRT and VTT files (transcript_srt, transcript_vtt) — complete subtitle files as strings, save and use directly.
  • 🌍 Any caption language — request en, de, es, pt, ja, … and get that track, or leave language empty for the video's original. Missing tracks are filled with YouTube auto-translation.
  • 📊 Video metadata for freetitle, author, channelId, viewCount, lengthSeconds, keywords, shortDescription, and thumbnail.
  • 🧠 Whisper AI fallback (opt-in) — for videos with no captions, download the audio and transcribe it with OpenAI Whisper (faster-whisper) inside the container. Billed separately, only when it produces text.
  • 🔁 Batch + resumable — thousands of URLs per run, parallel fetching, and automatic resume if a long run is interrupted.

Supported input URL formats

FormatExample
Standard video URLhttps://www.youtube.com/watch?v=dQw4w9WgXcQ
Short linkhttps://youtu.be/dQw4w9WgXcQ
Shortshttps://www.youtube.com/shorts/dQw4w9WgXcQ
Embed URLhttps://www.youtube.com/embed/dQw4w9WgXcQ
Bare video IDdQw4w9WgXcQ

Not supported: private, members-only, and age-gated videos, and live streams still in progress. To transcribe a whole channel, first list its videos with a YouTube channel scraper and feed the URLs here.

Input parameters

ParameterTypeRequiredDefaultDescription
startUrlsarrayYesYouTube video / Shorts URLs or bare video IDs.
languagestringNooriginalCaption language code to return (en, de, …). Empty = the video's original track. Auto-translated if the exact track is missing.
whisperFallbackbooleanNofalseTranscribe caption-less videos with Whisper AI. Premium event.
whisperMaxMinutesintegerNo30Per-video cap (1–60) for the Whisper fallback.
maxItemsintegerNo100Hard cap on billed transcript rows per run.
maxConcurrencyintegerNo10Parallel video fetches (1–50). Whisper always runs one at a time.
cookiesstring (secret)NoNetscape cookies.txt for the "confirm you're not a bot" gate. Does not unlock private videos.
proxyConfigurationobjectNoResidentialProxy for reaching YouTube. Residential strongly recommended.

Output example

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"author": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"lengthSeconds": "213",
"viewCount": "1699540216",
"keywords": ["rick astley", "Never Gonna Give You Up", "nggyu"],
"shortDescription": "The official video for “Never Gonna Give You Up” by Rick Astley…",
"thumbnail": { "thumbnails": [{ "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg", "width": 168, "height": 94 }] },
"language": "en",
"isTranslated": false,
"transcriptSource": "captions",
"transcript": [
{ "text": "[♪♪♪]", "startMs": "1360", "endMs": "3040", "startTimeText": "0:01" },
{ "text": "♪ We're no strangers to love ♪", "startMs": "18800", "endMs": "22140", "startTimeText": "0:18" }
],
"transcript_only_text": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ …",
"transcript_srt": "1\n00:00:01,360 --> 00:00:03,040\n[♪♪♪]\n…",
"transcript_vtt": "WEBVTT\n\n00:00:01.360 --> 00:00:03.040\n[♪♪♪]\n…",
"wordCount": 412,
"transcriptSkipped": false,
"transcriptError": null
}

Key output fields

FieldMeaning
transcript[]Timestamped segments: text, startMs, endMs, startTimeText.
transcript_only_textThe whole transcript as one plain string — LLM-ready.
transcript_srt / transcript_vttComplete subtitle files as strings — save and use directly.
transcriptSourceWhich step produced it: captions (human), auto-captions (YouTube ASR), or whisper.
language / isTranslatedCaption language returned, and whether it came from auto-translation.
videoId, title, author, channelIdVideo identity.
viewCount, lengthSeconds, keywords, shortDescription, thumbnailMetadata that rides along free.
wordCountWord count of the transcript.
transcriptError / transcriptSkippedSet only when every source failed for a video. Those rows are not billed.

How to get a YouTube transcript

  1. Open the Actor and click Try for free.
  2. Paste one or more video URLs into YouTube video URLs.
  3. (Optional) Set Caption language to a code like de or es, or leave it empty for the original.
  4. (Optional) Turn on Whisper AI fallback to transcribe videos that have no captions.
  5. Click Start. When the run finishes, open Output / Storage and download the results as JSON, CSV, Excel, or copy the transcript_srt / transcript_vtt strings straight into a .srt / .vtt file.

You can also schedule the Actor and call it from your own code via the API.

Use cases

  • LLM & RAG pipelines — feed transcript_only_text into summarization, Q&A, embeddings, or fine-tuning datasets.
  • Subtitles & localization — pull SRT/VTT in the original language or an auto-translated one.
  • Content repurposing — turn videos into blog posts, newsletters, show notes, and social clips.
  • Research & monitoring — collect transcripts across a topic, creator, or competitor for analysis.
  • Accessibility — add transcripts to a media library or LMS.
  • Search — index what was actually said in a video library, with timestamps back to the moment.

How a run works

  1. Each URL is resolved to its 11-character video ID (watch, youtu.be, Shorts, embed, or bare ID).
  2. The video's metadata and caption-track list are fetched with browser-grade TLS through the proxy.
  3. The caption track for your language is selected — human captions first, then YouTube's auto-generated track; auto-translation is applied when the exact track is missing.
  4. The timedtext track is fetched and normalised to timestamped JSON, then rendered to SRT and VTT.
  5. If there are no captions and whisperFallback is on, the audio is downloaded (up to whisperMaxMinutes), extracted with ffmpeg, and transcribed with OpenAI Whisper (faster-whisper).
  6. One row per video is pushed — transcript, formats, and metadata together. Videos where every source fails get a row with transcriptError and are not billed.

Using the Actor via API

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run_input = {
"startUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://www.youtube.com/shorts/abcdefghijk",
],
"language": "en",
"maxItems": 50,
}
run = client.actor("parsebird/youtube-transcript-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], "—", item["wordCount"], "words —", item["transcriptSource"])
print(item["transcript_only_text"][:300])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const input = {
startUrls: ['https://youtu.be/dQw4w9WgXcQ'],
whisperFallback: true,
};
const run = await client.actor('parsebird/youtube-transcript-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].transcript_srt);

The Actor runs on the Apify platform, so you also get scheduling, a full REST API, webhooks, and native integrations with Make, Zapier, Google Sheets, Slack, and more. Results export as JSON, CSV, Excel, XML, or RSS.

Pricing

This Actor uses the pay-per-event pricing model, tiered by your Apify plan.

EventWhat it isFreeBronzeSilverGold
transcriptOne video row: transcript text, timestamped segments, SRT, VTT, and video metadata.$0.005$0.0045$0.0045$0.004
whisper-transcriptAdded only when a caption-less video is transcribed by the Whisper AI fallback.$0.15$0.125$0.10$0.075

A tiny platform start fee (~$0.05 per 1,000 runs) also applies. Scraping 1,000 caption transcripts costs about $5.00 on the Free plan. A video transcribed by Whisper costs transcript + whisper-transcript (about $0.155 on Free). Videos where every caption source fails are not billed.

FAQ

Do I need a YouTube API key? No. You only need an Apify account.

Why do I need a proxy? YouTube blocks most datacenter IPs. Residential proxy (the default) is strongly recommended, especially for larger runs.

What if a video has no captions? Without whisperFallback, the row has the video's metadata and a transcriptError. Turn on whisperFallback to transcribe the audio with Whisper AI (billed as the premium event, only when it produces text).

Can I get the transcript in another language? Set language to an ISO code (de, es, fr, ja, …). If YouTube doesn't have that exact track, it is auto-translated and isTranslated is true.

Which transcriptSource values are there? captions (human-made captions), auto-captions (YouTube's automatic speech recognition), and whisper (the in-container fallback).

How does maxItems work? It caps the number of billed transcript rows. Videos that fail every source are not counted and not billed.

Can I transcribe a whole channel? Scrape the channel's video list with a YouTube channel scraper first, then feed those URLs here.

Can I schedule recurring runs? Yes. Use Apify's scheduler to transcribe new uploads on any interval and route them onward with a webhook or integration.

Something's not working — where do I report it? Open the Issues tab on the Actor page with the video URL and run ID.

This Actor accesses only publicly available YouTube pages and caption data. It does not log in, and it does not bypass authentication for private, members-only, or age-restricted videos. You are responsible for using transcripts in accordance with YouTube's Terms of Service, copyright law, and — where personal data is involved — applicable privacy laws such as the GDPR and CCPA. See Apify's guide to the legality of web scraping for background.