YouTube Transcript & Subtitles Bulk — Multilingual, No API Key
Pricing
from $5.00 / 1,000 transcript fetcheds
YouTube Transcript & Subtitles Bulk — Multilingual, No API Key
Bulk YouTube transcript and subtitles extractor. Up to 200 video URLs, a channel or a playlist in; one row per video out: full text, timestamped segments, language, manual or auto-generated, word count, duration, verdict. Multilingual with auto-translation. No API key, no cookies, no video download.
Pricing
from $5.00 / 1,000 transcript fetcheds
Rating
0.0
(0)
Developer
daehwan kim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Paste a list of YouTube videos, get every transcript back as clean JSON. This
YouTube transcript scraper and subtitles extractor reads up to 200 videos
per run — or a whole channel or playlist — and returns one row per video: the
full plain text, timestamped segments, the caption language, whether it was
manually written or auto-generated, word count, duration and a one-line verdict
such as 12 min, 1,840 words, auto-generated EN.
No YouTube API key, no cookies, no browser. Pick your languages in priority order and the Actor finds the best caption track for each video — manual first, then auto-generated, then YouTube's own auto-translation — and tells you which one you got. Feed the rows into an LLM summariser, a search index, a content audit or a research corpus straight from the Apify API, a webhook, Google Sheets, Zapier or Make.
Powered by youtube-transcript-api (MIT), with yt-dlp as a metadata-only fallback engine for caption tracks the first engine cannot serve.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by YouTube or Google. It reads only caption tracks the video already exposes publicly and never downloads or delivers video or audio files. See
LICENSE-NOTICE.mdand the disclaimer section below.
Why use YouTube Transcript & Subtitles Bulk?
- Bulk, not one video at a time — up to 200 video URLs per run, plus a
channelUrlorplaylistUrlthat is expanded into its newest videos, plus adatasetIdfrom any YouTube search or channel scraper on Apify. Duplicates are removed across all sources. - Multilingual with a real priority list —
["en", "en-US", "ko"]means: a manual English track if there is one, else an auto-generated English track, else YouTube's auto-translation into English, else (optionally) the video's own language. Every row says exactly which it got:language,isAutoGenerated,isTranslated,matchedRequestedLanguage. - Two engines — when the primary engine is blocked or has no track in your
language, yt-dlp lists the same video's caption tracks (including all
auto-translations) and the Actor fetches the caption file directly. The row's
engineandattemptsfields show the path taken. - Both formats at once —
fullTextfor LLMs and search,segmentswithstart/dur/textfor subtitle files, clipping and timestamps. ChooseoutputFormatto keep only one. - A verdict, not just text —
headline,wordCount,segmentCount,durationSec,channelName,videoTitleand the fullavailableLanguageslist on every row, so you can triage 200 videos from the table view alone. - Honest about what it cannot get — a video with captions disabled, a
deleted or private video, an age-restricted video or a bad URL becomes a
noticerow with a code (transcripts-disabled,video-unavailable,age-restricted,invalid-url,ip-blocked, …). Scheduled runs keep going; the run still ends as SUCCEEDED. - No key, no login, no bypassing — public caption endpoints only, an honest bot User-Agent, no CAPTCHA or bot-protection circumvention. YouTube's own rate limits are reported, not evaded.
How to use YouTube Transcript & Subtitles Bulk
- Paste video URLs into Video URLs or IDs (watch, shorts, youtu.be, embed or bare 11-character IDs), and/or set a Channel URL or Playlist URL.
- Put your preferred Languages in order, e.g.
en,de,ja. - Click Start. Read the rows in the Output tab or pull them through the
Apify API. Filter on
rowType == "transcript"for the transcripts.
Reading a channel's newest uploads every day? Pair it with our
RSS Feed Reader on a schedule —
every YouTube channel publishes an RSS feed — and pass the new links here. For
videos that come back as no-transcript, our
Whisper Speech to Text
transcribes from the audio.
Input
| Field | Type | Description |
|---|---|---|
videoUrls | array | Up to 200 video URLs or 11-character IDs. |
channelUrl | string | Channel URL (https://www.youtube.com/@handle); its newest uploads are added, up to maxVideos. |
playlistUrl | string | Playlist URL; its videos are added, up to maxVideos. |
maxVideos | integer | Videos taken from the channel and from the playlist (each), 1–200. Default 50. |
datasetId | string | Apify dataset whose rows carry a url, videoUrl, link, videoId or id field. |
languages | array | Language codes in priority order. Default ["en"]. |
allowAutoGenerated | boolean | Accept auto-generated (ASR) tracks. Default true. |
allowTranslated | boolean | Accept YouTube's auto-translation into the first language. Default true. |
fallbackToAnyLanguage | boolean | If nothing matches, return the video's own track and flag matchedRequestedLanguage: false. Default true. |
outputFormat | string | both (default), fulltext or segments. |
proxyConfiguration | object | Apify proxy settings. Default: Apify RESIDENTIAL proxy, because YouTube blocks nearly every datacenter and cloud IP (measured: 1 of 8 videos through datacenter IPs, 3 of 3 through residential). Proxy usage is included in the price. |
disclaimerAck | boolean | Acknowledge that this is an unofficial tool and that you are responsible for how the transcripts are used. Required. |
The whole run is capped at 200 videos across all sources.
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/watch?v=jNQXAC9IVRw","https://youtu.be/9bZkp7q19f0"],"channelUrl": "https://www.youtube.com/@Apify","maxVideos": 20,"languages": ["en", "ko"],"allowAutoGenerated": true,"allowTranslated": true,"outputFormat": "both","disclaimerAck": true}
Output
Every dataset row carries a rowType:
rowType | What it is | Charged |
|---|---|---|
transcript | One video's transcript — text, segments, language, verdict | yes, once per video |
notice | Status rows: one per video without a transcript (transcripts-disabled, no-transcript, video-unavailable, video-unplayable, age-restricted, invalid-video-id, ip-blocked, rate-limited, fetch-failed), plus summary, invalid-url, channel-listing-failed, playlist-listing-failed, dataset-read-failed, no-input, targets-truncated, free-plan-cap, charge-limit-reached, billing-unavailable, invalid-input | no |
A transcript row:
{"rowType": "transcript","videoId": "4KgZ83cultE","url": "https://www.youtube.com/watch?v=4KgZ83cultE","videoTitle": "After eight years in finance, she became an engineer | Kateřina Hroníková","channelName": "Apify","language": "en","languageName": "English (auto-generated)","isAutoGenerated": true,"isTranslated": false,"matchedRequestedLanguage": true,"headline": "4 min, 696 words, auto-generated EN","wordCount": 696,"segmentCount": 102,"durationSec": 259.2,"fullText": "It's never too late. And it's totally worth it. It can be …","segments": [{ "start": 0.0, "dur": 5.0, "text": "It's never too late." },{ "start": 2.0, "dur": 6.4, "text": "And it's totally worth it. It can be" }],"availableLanguages": [{ "code": "en", "name": "English (auto-generated)", "isAutoGenerated": true }],"engine": "youtube-transcript-api","attempts": ["youtube-transcript-api:ok"],"sourceList": "https://www.youtube.com/@Apify","fetchedAt": "2026-09-03T01:31:59.816086+00:00","disclaimer": "Unofficial. …"}
A video without a usable track:
{"rowType": "notice","noticeCode": "transcripts-disabled","videoId": "XXXXXXXXXXX","url": "https://www.youtube.com/watch?v=XXXXXXXXXXX","headline": "XXXXXXXXXXX — transcripts-disabled: Captions are disabled for this video by its owner.","attempts": ["youtube-transcript-api:transcripts-disabled", "yt-dlp:no-transcript"]}
The summary notice row at the end carries transcriptsDelivered,
videosWithoutTranscript, wordsTotal, languageDistribution,
noticeDistribution and fallbackEngineUsed for the whole run.
Pricing
Pay per event. You are charged once when a run starts and once for every
transcript row written to the dataset — one per video. Notice rows (videos
without a transcript, the run summary, input problems) are not results and are
not charged.
| Event | Price |
|---|---|
| Run started | $0.001 per run |
| Transcript fetched | $0.007 per video (lower on higher Apify plans) |
Prices are shown on the Actor's Pricing tab. Free-plan runs return up to 25
transcripts per run and then finish cleanly with a free-plan-cap notice.
Tips
- Long videos are one row. A 3-hour lecture is a single transcript row with
a
segmentsarray of a few thousand entries; if you only need the text, setoutputFormat: "fulltext"to keep rows small. - Language codes are exact. YouTube distinguishes
en,en-USanden-GB. List the variants you accept, or rely onallowTranslated/fallbackToAnyLanguage. ip-blockedorrate-limitedrows mean YouTube throttled the request, which happens on almost every datacenter IP and, even through residential proxies, on auto-translated tracks. Keep the default RESIDENTIAL proxy, re-run those videos later, or request the original language.- Chaining: run any YouTube channel, search or hashtag scraper first, then
pass its dataset ID in
datasetIdto transcribe everything it found. - Subtitle files:
segmentsmaps 1:1 to SRT / VTT cues (start,dur,text); converting is a few lines of code.
FAQ, disclaimers, and support
Is this an official YouTube product? No. It is an independent integration of two open-source libraries and is not affiliated with, endorsed by, or sponsored by YouTube or Google.
Does it download videos? No. Both engines are used for caption metadata only; the Actor never requests, stores or delivers a video or audio file.
Whose data is it, and who is responsible? Transcripts are the copyrighted work of the video's author. Under the Apify Standard Actor Contract (§2.2, §5.2.1) you are the data controller and you are responsible for complying with YouTube's Terms of Service, copyright law and any other applicable law in how you store, redistribute or reuse the text. Use this Actor for lawful purposes such as research, accessibility, indexing and analysis you are permitted to carry out.
Does it work on private, unlisted or age-restricted videos? Private and age-restricted videos require a signed-in session, which this Actor does not use; they come back as notice rows. Unlisted videos work if you have the link.
What about videos with no captions at all? They come back as
no-transcript. Transcribe them from the audio with
Whisper Speech to Text.
Where do I report a problem? Open an issue on the Actor's Issues tab.
Include the videoId and the attempts field from the row.