๐ŸŽฌ YouTube Transcript Scraper avatar

๐ŸŽฌ YouTube Transcript Scraper

Pricing

from $7.00 / 1,000 results

Go to Apify Store
๐ŸŽฌ YouTube Transcript Scraper

๐ŸŽฌ YouTube Transcript Scraper

Turn any YouTube video, playlist or channel into clean, structured text. Bulk-extract transcripts and captions in 75 languages, plus views, likes, comments, keywords and thumbnails. Text array, plain text, WebVTT or SRT โ€” ready for AI training data, RAG pipelines, summarisation and SEO.

Pricing

from $7.00 / 1,000 results

Rating

0.0

(0)

Developer

Data Minds

Data Minds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

๐ŸŽฌ YouTube Transcript Scraper โ€” Bulk YouTube Transcripts, Subtitles & Captions API

YouTube Transcript Scraper is a fast, reliable Apify Actor for YouTube transcript extraction, YouTube subtitle scraping, and caption download at scale. Paste one video link or ten thousand โ€” plus playlists, channels, Shorts, or just a search keyword โ€” and get back clean, structured transcripts together with the video details you care about: channel name, channel ID, publish date, view count, likes, comments, keywords, thumbnail and description.

Every video is written to your Apify Dataset the moment its transcript is ready, so you can export to JSON, CSV, Excel, or stream rows straight into RAG pipelines, LLM knowledge bases, vector databases, content research, and SEO analysis while the run is still going.

๐Ÿ’ก Need a custom version, a private integration, or a tailored scraper? Email hello.dataminds@gmail.com.


๐Ÿ“‘ Table of contents


๐ŸŽฌ What is YouTube Transcript Scraper?

YouTube Transcript Scraper is a hosted YouTube transcript API that turns spoken video content into clean, machine-readable text. Unlike browser extensions or one-video-at-a-time tools, this Actor:

  • Handles bulk input โ€” a list of URLs, an uploaded file, a Google Sheet, or a whole channel.
  • Reads both caption types โ€” human-written subtitles and auto-generated captions, preferring the better one.
  • Speaks 76 languages with a smart fallback chain, so you get a transcript instead of an empty row.
  • Returns four formats โ€” a clean text array, one continuous string, ready-to-use WebVTT, or ready-to-use SRT.
  • Adds video metadata โ€” views, likes, comments, tags, thumbnail, description, channel and publish dates.
  • Streams results live into an Apify Dataset, exportable to JSON / CSV / Excel / XML or read via the Apify API.

If you have ever needed to "turn these 500 YouTube videos into text my model can read", this is the Actor.


โœจ Main features

  • ๐Ÿ”— True bulk input โ€” paste a list, upload a file, or link a Google Sheet. One URL or ten thousand, same run.
  • ๐Ÿ“บ Channels & playlists auto-expanded โ€” drop in youtube.com/@handle or a playlist link and the Actor finds the videos for you.
  • ๐Ÿ” Search-keyword mode โ€” no links at all? Type apify tutorial and get the top matching videos' transcripts.
  • ๐Ÿ“ฑ Shorts support โ€” include or exclude YouTube Shorts with one toggle; a Shorts link you paste yourself always works.
  • ๐Ÿงพ Four transcript formats โ€” text array (best for AI), single-line text, WebVTT, and SubRip / SRT with real timings.
  • ๐ŸŒ 76 caption languages with automatic fallback: your language โ†’ English โ†’ whatever the video offers.
  • ๐Ÿ—ฃ๏ธ Manual and auto-generated captions โ€” human-written subtitles are preferred, auto captions used when that's all there is.
  • ๐ŸŽ Eleven optional data points โ€” tick only what you need, keep rows lean and runs cheap.
  • ๐Ÿ›ก๏ธ Built-in anti-block handling โ€” the run adapts automatically when YouTube pushes back, so large batches keep flowing without you configuring anything.
  • ๐Ÿ” Configurable retries โ€” 3 to 12 attempts per video with exponential backoff and jitter.
  • โšก Parallel processing โ€” 1 to 16 videos at a time, with a politeness delay you control.
  • ๐Ÿ’พ Real-time Dataset writes โ€” a row appears the instant its transcript is ready; an aborted run still keeps everything collected so far.
  • ๐Ÿ“Š Five prebuilt Output views โ€” Quick View, Transcript, Channel & Publishing, Engagement Stats, Metadata & Media.
  • ๐Ÿงพ Skipped-video audit โ€” every video that could not be collected is written to skipped-videos.json with the exact reason.
  • โœ‚๏ธ Oversized-row protection โ€” a six-hour video's transcript is trimmed to fit instead of failing the row.
  • ๐Ÿงน Automatic de-duplication โ€” the same video reached from two different links is only processed once.

๐Ÿ‘ฅ Who is this Actor for?

  • ๐Ÿค– AI engineers building RAG, retrieval-augmented generation, and LLM grounding pipelines from video.
  • โœ๏ธ Content marketers & SEO specialists repurposing videos into blog posts, newsletters and show notes.
  • ๐Ÿ“ˆ Competitive analysts mining competitor channels for topics, positioning, and messaging.
  • ๐ŸŽง Podcasters & video creators generating searchable archives, chapters, and subtitles.
  • ๐Ÿ”ฌ Researchers collecting spoken-language corpora for NLP, sentiment, and discourse analysis.
  • โ™ฟ Accessibility teams exporting SRT / VTT subtitle files for captioning workflows.
  • ๐Ÿ“š Educators & students turning lectures and tutorials into study notes.
  • ๐Ÿ› ๏ธ Developers who want a YouTube transcript API they can call from any language.

๐Ÿค– Built for generative AI, LLMs, and RAG

Video is the largest untapped text corpus on the web. This Actor makes it usable:

  • RAG pipelines โ€” chunk captions and embed them alongside title + channelName metadata.
  • LLM knowledge bases โ€” ground chatbots in webinars, tutorials, conference talks and product demos.
  • Semantic video search โ€” index thousands of videos so users can search what was said, not just titles.
  • Vector database ingestion โ€” drop straight into Pinecone, Qdrant, Weaviate, Chroma, Milvus, or pgvector.
  • Custom GPT / Claude Project knowledge files โ€” export the Dataset JSON and upload.
  • Summarization & repurposing โ€” feed a transcript to an LLM and get a blog post, thread, or newsletter.
  • Content moderation & compliance โ€” scan spoken content at scale.

Practical AI use cases

  1. Turn a whole YouTube channel into a chatbot knowledge base โ€” paste the channel URL, set a limit, embed the output.
  2. Auto-generate blog posts from webinars โ€” single-line text format straight into your writing prompt.
  3. Build a searchable conference-talk archive โ€” transcript + speaker channel + publish date per row.
  4. Competitive messaging analysis โ€” pull the last 100 videos from three competitor channels and diff the language.
  5. Subtitle production โ€” export the SRT format and ship the files.
  6. Lecture-to-notes pipelines โ€” playlist in, structured study notes out.
  7. Trend detection โ€” search-keyword mode on a schedule, then topic-model the transcripts.

โš™๏ธ What the scraper does

  • Reads every link you give it, separates individual videos from playlists and channels, and expands the latter into video lists (up to Max videos per source).
  • Runs your search keywords and adds the top matching videos to the same queue.
  • De-duplicates the whole queue so nothing is collected twice.
  • Pulls the best available caption track for each video โ€” your preferred language first, then English, then whatever exists; human-written subtitles preferred over auto-generated ones.
  • Renders the transcript in the format you chose and attaches the optional data points you ticked.
  • Writes each row to the Apify Dataset immediately โ€” downstream systems can consume rows mid-run.
  • Keeps going when a video fails โ€” private, deleted, region-locked and caption-less videos are recorded in a skip report, never abort the run.

Link typeExampleBehaviour
Videohttps://www.youtube.com/watch?v=Qb9s3UiMSTAProcessed directly
Short linkhttps://youtu.be/Qb9s3UiMSTAProcessed directly
Shortshttps://www.youtube.com/shorts/VIDEO_IDProcessed directly
Live replayhttps://www.youtube.com/live/VIDEO_IDProcessed directly
Playlisthttps://www.youtube.com/playlist?list=PL...Expanded, up to Max videos per source
Channelhttps://www.youtube.com/@handleExpanded, up to Max videos per source
Channel tabhttps://www.youtube.com/@handle/videosExpanded, up to Max videos per source
Search keywordapify web scraping (in Search keywords)Top results expanded

โ„น๏ธ Non-YouTube links are skipped with a clear warning instead of failing the run.


๐Ÿงพ Transcript formats

outputFormatcaptions valueBest for
json (default)Array of caption lines โ€” ["line one", "line two", โ€ฆ]AI, search, analytics, spreadsheets
textOne continuous, tag-free stringSummarization, LLM prompts, blog drafts
vttFull WebVTT document with 00:00:01.360 --> 00:00:03.040 timingsWeb players, <track> elements
srtFull SubRip document with numbered cuesVideo editors, subtitle files

๐Ÿ“ฅ Input

Only one thing is really required: either at least one YouTube URL or at least one search keyword.

{
"urls": [
"https://www.youtube.com/watch?v=Qb9s3UiMSTA",
"https://www.youtube.com/@Apify"
],
"searchKeywords": ["web scraping tutorial"],
"scrapeShorts": false,
"maxVideosPerSource": 10,
"maxResults": 0,
"outputFormat": "json",
"language": "en",
"channelNameBoolean": true,
"channelIDBoolean": true,
"datePublishedBoolean": true,
"dateTextBoolean": true,
"relativeDateTextBoolean": true,
"viewCountBoolean": true,
"likesBoolean": true,
"commentsBoolean": true,
"keywordsBoolean": true,
"thumbnailBoolean": true,
"descriptionBoolean": true,
"maxConcurrency": 4,
"requestDelaySecs": 1.0,
"maxRetries": 8
}

๐Ÿ“ค Output format (Dataset)

Results land in the default Apify Dataset. You can:

  • Browse rows in the Apify Console with five prebuilt views โ€” each section of the data on its own tab.
  • Export to JSON, CSV, Excel, XML, HTML, or RSS.
  • Pull data programmatically via the Apify API.
  • Stream into AI, ETL, or analytics pipelines while the run is still active.

Output views (each section of the table, separately)

ViewColumns
โœจ Quick ViewvideoId, title, channelName, datePublished, viewCount, captions
๐Ÿ“ TranscriptvideoId, title, captions
๐Ÿ“บ Channel & PublishingvideoId, title, channelName, channelID, datePublished, dateText, relativeDateText
๐Ÿ“ˆ Engagement StatsvideoId, title, viewCount, likes, comments
๐Ÿท๏ธ Metadata & MediavideoId, title, keywords, thumbnailUrl, description

Row fields

FieldAlways present?Description
videoIdโœ… AlwaysThe YouTube video ID, e.g. Qb9s3UiMSTA.
titleโœ… AlwaysThe video title.
channelNameOptionalChannel the video was published on. Enable ๐Ÿ“บ Channel Name.
channelIDOptionalThe channel's unique ID. Enable ๐Ÿ†” Channel ID.
datePublishedOptionalFull ISO publish timestamp, e.g. 2024-02-22T23:00:12.000Z.
dateTextOptionalFriendly date, e.g. Feb 22, 2024.
relativeDateTextOptionalHuman age, e.g. 2 years ago.
viewCountOptionalFormatted views, e.g. 27,406,159 views.
likesOptionalFormatted like count, e.g. 564,840.
commentsOptionalFormatted comment count, e.g. 30,915.
keywordsOptionalVideo tags as a comma-separated string.
thumbnailUrlOptionalDirect link to the video thumbnail.
descriptionOptionalFull video description text.
captionsโœ… AlwaysThe transcript, in the format you selected.

๐Ÿงพ Videos that could not be collected are written to skipped-videos.json in the run's key-value store, each with a reason (No transcript available for this video, Private video, Transcript download refused (HTTP 429), โ€ฆ).


๐Ÿงช Example output (JSON)

Real output for https://www.youtube.com/watch?v=Qb9s3UiMSTA with every optional data point enabled (transcript abbreviated โ€” the real row carries all 1,093 caption lines):

{
"videoId": "Qb9s3UiMSTA",
"title": "Asyncio in Python - Full Tutorial",
"channelName": "Tech With Tim",
"channelID": "UC4JX40jDee_tINbkjycV4Sg",
"datePublished": "2024-04-05T14:30:26.000Z",
"dateText": "Apr 5, 2024",
"relativeDateText": "2 years ago",
"viewCount": "354,405 views",
"likes": "9,871",
"comments": "190",
"keywords": "tech with tim",
"thumbnailUrl": "https://i.ytimg.com/vi/Qb9s3UiMSTA/maxresdefault.jpg",
"description": "Asynchronous programming allows our code to be more efficient by doing multiple things at once without any unnecessary waiting โ€ฆ",
"captions": [
"Imagine programing",
"is a journey from point A to D.",
"In traditional synchronous programing",
"we travel in a straight line",
"stopping at each point"
]
}

The same video with "outputFormat": "srt":

{
"videoId": "Qb9s3UiMSTA",
"title": "Asyncio in Python - Full Tutorial",
"captions": "1\n00:00:00,033 --> 00:00:01,133\nImagine programing\n\n2\n00:00:01,133 --> 00:00:03,466\nis a journey from point A to D."
}

๐Ÿš€ Quick start

Run in Apify Console

  1. Log in at console.apify.com โ†’ Actors.
  2. Open YouTube Transcript Scraper.
  3. Paste your ๐Ÿ”— YouTube URLs (or type a ๐Ÿ” search keyword).
  4. Pick a ๐Ÿงพ Transcript format and a ๐ŸŒ caption language.
  5. Tick the ๐ŸŽ extra data points you want as columns.
  6. Click Start and watch rows stream into the Output tab in real time.
  7. Export as JSON / CSV / Excel, or pull via the Apify API.

Run via API

curl -X POST "https://api.apify.com/v2/acts/<your-actor-id>/runs?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://www.youtube.com/watch?v=Qb9s3UiMSTA"],
"outputFormat": "json",
"language": "en",
"channelNameBoolean": true,
"viewCountBoolean": true
}'

Run it synchronously and get the rows back in one call:

curl -X POST "https://api.apify.com/v2/acts/<your-actor-id>/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "urls": ["https://youtu.be/Qb9s3UiMSTA"] }'

Read the rows from an existing run:

$curl "https://api.apify.com/v2/actor-runs/<runId>/dataset/items?format=json&token=<APIFY_TOKEN>"

Run from Python

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("<your-actor-id>").call(run_input={
"urls": ["https://www.youtube.com/@Apify"],
"maxVideosPerSource": 25,
"outputFormat": "text",
"channelNameBoolean": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], "โ†’", item["captions"][:120])

๐Ÿ› ๏ธ Input parameters reference

ParameterTypeDefaultDescription
urlsarray[]YouTube links. Videos, Shorts, youtu.be links, playlists, channels. Bulk-friendly: list, file upload, or Google Sheet.
searchKeywordsarray[]Search terms; the top matching videos are added to the queue. Use instead of, or on top of, urls.
scrapeShortsboolfalseInclude Shorts (โ‰ค 60 s) found inside channels, playlists and searches. Shorts you paste directly are always processed.
maxVideosPerSourceint10Videos taken from each playlist, channel, or keyword. Does not limit individual video links.
maxResultsint0Hard ceiling on videos processed in the whole run, after expansion and de-duplication. 0 = no limit.
outputFormatenumjsonjson (text array) ยท text (single string) ยท vtt (WebVTT) ยท srt (SubRip).
languageenumenPreferred caption language (76 options). Falls back to English, then any available track.
channelNameBooleanboolfalseAdd channelName.
channelIDBooleanboolfalseAdd channelID.
datePublishedBooleanboolfalseAdd datePublished (ISO timestamp).
dateTextBooleanboolfalseAdd dateText (Feb 22, 2024).
relativeDateTextBooleanboolfalseAdd relativeDateText (2 years ago).
viewCountBooleanboolfalseAdd viewCount.
likesBooleanboolfalseAdd likes.
commentsBooleanboolfalseAdd comments.
keywordsBooleanboolfalseAdd keywords (tags).
thumbnailBooleanboolfalseAdd thumbnailUrl.
descriptionBooleanboolfalseAdd description.
maxConcurrencyint4Videos processed in parallel (1โ€“16).
requestDelaySecsnumber1.0Polite pause before each request starts. Decimals allowed; 0 disables it.
maxRetriesint8Attempts per video before it is skipped (3โ€“12), with exponential backoff.

๐Ÿ”Œ Integrations: LangChain, LlamaIndex, OpenAI, Pinecone, n8n

  • ๐Ÿฆœ LangChain โ€” load the Dataset with ApifyDatasetLoader, mapping captions โ†’ page_content.
  • ๐Ÿฆ™ LlamaIndex โ€” feed transcripts into a VectorStoreIndex with title/channelName metadata.
  • ๐Ÿง  OpenAI โ€” chunk and embed with text-embedding-3, or upload as a Custom GPT knowledge file.
  • ๐Ÿค– Anthropic Claude โ€” attach the Dataset JSON to Claude Projects or the Files API.
  • ๐Ÿ“ Pinecone, Qdrant, Weaviate, Chroma, Milvus, pgvector โ€” embed and upsert with metadata filters.
  • ๐Ÿ“Š n8n, Make.com, Zapier โ€” trigger runs and route transcripts into your automations.
  • ๐Ÿ“ฆ Snowflake, BigQuery, PostgreSQL, MongoDB, S3 โ€” load Dataset JSON/CSV into your warehouse.
  • ๐Ÿ”” Webhooks โ€” get notified the moment a run finishes; see Apify integrations.

๐Ÿ’ธ Pricing & how to control cost

Billable event

EventWhen it firesWhat you get
transcript_resultOnce per transcript row written to the DatasetA complete video record โ€” transcript plus every data point you enabled

Videos that fail, have no captions, are private/deleted, or are dropped by maxResults are not charged. If a run hits its charging limit (ACTOR_MAX_TOTAL_CHARGE_USD), it stops cleanly and everything already collected stays in your Dataset.

โš™๏ธ Publishing note: the transcript_result event must exist in Apify Console โ†’ your Actor โ†’ Publication โ†’ Monetization with the same name. Until pay-per-event is configured the Actor still runs and saves data normally.

Keeping runs cheap

  • ๐ŸŽฏ Set maxResults and maxVideosPerSource โ€” the single biggest cost lever.
  • ๐ŸŽ Only tick the extra data points you actually need.
  • ๐Ÿงพ Use json or text output rather than vtt/srt when you don't need timings โ€” smaller rows.
  • โšก Leave maxConcurrency at 4 unless you have a reason to change it.
  • ๐Ÿข Raise requestDelaySecs and lower maxConcurrency on very large batches โ€” a gentler run finishes more videos on the first try.

โ“ Frequently asked questions (FAQ)

Do I need a YouTube API key? No. There is nothing to configure beyond the Actor input.

Does it work on videos without subtitles? It works on any video that has some caption track โ€” human-written or auto-generated. Videos with captions fully disabled by the uploader cannot be transcribed and are listed in skipped-videos.json.

Can I scrape a whole channel? Yes. Paste https://www.youtube.com/@handle and set Max videos per source.

Can I get transcripts without giving any URLs? Yes โ€” use ๐Ÿ” Search keywords.

Which languages are supported? 76 caption languages are selectable. If your language isn't available on a given video, the Actor falls back to English and then to any track that exists, so you still get a transcript.

Can I download SRT or VTT subtitle files? Yes. Choose srt or vtt as the transcript format; the captions field then contains a complete, ready-to-save subtitle document.

Are YouTube Shorts supported? Yes. A Shorts link you paste is always processed. To also pull Shorts found inside channels/playlists/searches, turn on ๐Ÿ“ฑ Include YouTube Shorts.

How fast is it? Typically 1โ€“3 seconds per video, processed 4 at a time by default. A 100-video channel usually finishes in a couple of minutes.

What happens if a video fails? The run continues. The failure and its reason are recorded in skipped-videos.json, and the summary at the end of the log shows how many videos were skipped.

Can I run it on a schedule? Yes โ€” use Apify Schedules, or trigger it from n8n / Make / your own backend.

Does an aborted run lose my data? No. Rows are written to the Dataset as they are produced, so everything collected before the abort is already saved.


๐Ÿ› ๏ธ Troubleshooting

SymptomLikely causeFix
No transcript available for this videoThe uploader disabled captions entirely.Nothing to fix โ€” the video genuinely has no caption track.
Transcript is in the wrong languageThe video has no track in your chosen language.Set ๐ŸŒ Preferred caption language to a language the video actually offers, or leave it on en.
Private video / Video unavailableThe video is private, deleted, or region-locked.Nothing to fix โ€” use a different link.
Transcript download refused (HTTP 429)Rate limiting.The Actor recovers from this on its own. To reduce it further, lower maxConcurrency and raise requestDelaySecs.
Channel returned fewer videos than expectedmaxVideosPerSource or maxResults capped it.Raise those limits.
Shorts missing from a channel runscrapeShorts is off.Turn on ๐Ÿ“ฑ Include YouTube Shorts.
Run saved 0 rowsNo valid YouTube links, or none of the videos have captions.Check the log โ€” every skipped video is listed with its reason.

๐Ÿค Help, support & custom builds

  • ๐Ÿ’ฌ Issues & feature requests โ€” use the Issues tab on the Actor page in Apify Console.
  • ๐Ÿ“ง Direct support, custom scrapers & private integrations โ€” hello.dataminds@gmail.com.
  • ๐Ÿ“š Platform docs โ€” Apify documentation.

We reply to every message. If you need a variant of this Actor tuned to your workflow, just ask.


This Actor collects only publicly available information โ€” captions and metadata that YouTube already serves to any visitor. It does not access private videos, members-only content, or anything behind a login.

That said, you are responsible for how you use the data. Respect copyright, YouTube's Terms of Service, and applicable law (GDPR, CCPA, and similar). Transcripts of copyrighted videos remain the property of their creators โ€” use them for research, analysis, accessibility, or internal purposes, and seek permission before republishing. If you're unsure, talk to a lawyer.

See Apify's take: Is web scraping legal?


๐Ÿ” SEO keywords targeted

youtube transcript scraper ยท youtube transcript api ยท youtube subtitle scraper ยท youtube caption downloader ยท bulk youtube transcript extraction ยท download youtube transcript ยท youtube transcript to text ยท extract youtube subtitles ยท youtube channel transcript scraper ยท youtube playlist transcript ยท youtube shorts transcript ยท youtube srt download ยท youtube vtt download ยท auto generated captions scraper ยท youtube video to text ยท transcribe youtube video ยท youtube transcript for AI ยท youtube data for RAG ยท youtube scraper apify ยท video transcript dataset ยท youtube metadata scraper ยท youtube views likes comments scraper ยท multilingual youtube transcripts ยท youtube transcript json ยท youtube subtitles api ยท youtube content research tool