๐ฌ YouTube Transcript Scraper
Pricing
from $7.00 / 1,000 results
๐ฌ 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
Maintained by CommunityActor 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?
- Main features
- Who is this Actor for?
- Built for generative AI, LLMs, and RAG
- What the scraper does
- Supported YouTube link types
- Transcript formats
- Input
- Output format (Dataset)
- Example output (JSON)
- Quick start
- Input parameters reference
- Integrations: LangChain, LlamaIndex, OpenAI, Pinecone, n8n
- Pricing & how to control cost
- Frequently asked questions (FAQ)
- Troubleshooting
- Help, support & custom builds
- Is scraping YouTube transcripts legal?
- SEO keywords targeted
๐ฌ 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/@handleor a playlist link and the Actor finds the videos for you. - ๐ Search-keyword mode โ no links at all? Type
apify tutorialand 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.jsonwith 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
captionsand embed them alongsidetitle+channelNamemetadata. - 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
- Turn a whole YouTube channel into a chatbot knowledge base โ paste the channel URL, set a limit, embed the output.
- Auto-generate blog posts from webinars โ single-line text format straight into your writing prompt.
- Build a searchable conference-talk archive โ transcript + speaker channel + publish date per row.
- Competitive messaging analysis โ pull the last 100 videos from three competitor channels and diff the language.
- Subtitle production โ export the SRT format and ship the files.
- Lecture-to-notes pipelines โ playlist in, structured study notes out.
- 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.
๐ Supported YouTube link types
| Link type | Example | Behaviour |
|---|---|---|
| Video | https://www.youtube.com/watch?v=Qb9s3UiMSTA | Processed directly |
| Short link | https://youtu.be/Qb9s3UiMSTA | Processed directly |
| Shorts | https://www.youtube.com/shorts/VIDEO_ID | Processed directly |
| Live replay | https://www.youtube.com/live/VIDEO_ID | Processed directly |
| Playlist | https://www.youtube.com/playlist?list=PL... | Expanded, up to Max videos per source |
| Channel | https://www.youtube.com/@handle | Expanded, up to Max videos per source |
| Channel tab | https://www.youtube.com/@handle/videos | Expanded, up to Max videos per source |
| Search keyword | apify web scraping (in Search keywords) | Top results expanded |
โน๏ธ Non-YouTube links are skipped with a clear warning instead of failing the run.
๐งพ Transcript formats
outputFormat | captions value | Best for |
|---|---|---|
json (default) | Array of caption lines โ ["line one", "line two", โฆ] | AI, search, analytics, spreadsheets |
text | One continuous, tag-free string | Summarization, LLM prompts, blog drafts |
vtt | Full WebVTT document with 00:00:01.360 --> 00:00:03.040 timings | Web players, <track> elements |
srt | Full SubRip document with numbered cues | Video 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)
| View | Columns |
|---|---|
| โจ Quick View | videoId, title, channelName, datePublished, viewCount, captions |
| ๐ Transcript | videoId, title, captions |
| ๐บ Channel & Publishing | videoId, title, channelName, channelID, datePublished, dateText, relativeDateText |
| ๐ Engagement Stats | videoId, title, viewCount, likes, comments |
| ๐ท๏ธ Metadata & Media | videoId, title, keywords, thumbnailUrl, description |
Row fields
| Field | Always present? | Description |
|---|---|---|
videoId | โ Always | The YouTube video ID, e.g. Qb9s3UiMSTA. |
title | โ Always | The video title. |
channelName | Optional | Channel the video was published on. Enable ๐บ Channel Name. |
channelID | Optional | The channel's unique ID. Enable ๐ Channel ID. |
datePublished | Optional | Full ISO publish timestamp, e.g. 2024-02-22T23:00:12.000Z. |
dateText | Optional | Friendly date, e.g. Feb 22, 2024. |
relativeDateText | Optional | Human age, e.g. 2 years ago. |
viewCount | Optional | Formatted views, e.g. 27,406,159 views. |
likes | Optional | Formatted like count, e.g. 564,840. |
comments | Optional | Formatted comment count, e.g. 30,915. |
keywords | Optional | Video tags as a comma-separated string. |
thumbnailUrl | Optional | Direct link to the video thumbnail. |
description | Optional | Full video description text. |
captions | โ Always | The transcript, in the format you selected. |
๐งพ Videos that could not be collected are written to
skipped-videos.jsonin the run's key-value store, each with areason(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
- Log in at console.apify.com โ Actors.
- Open YouTube Transcript Scraper.
- Paste your ๐ YouTube URLs (or type a ๐ search keyword).
- Pick a ๐งพ Transcript format and a ๐ caption language.
- Tick the ๐ extra data points you want as columns.
- Click Start and watch rows stream into the Output tab in real time.
- 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 ApifyClientclient = 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
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | array | [] | YouTube links. Videos, Shorts, youtu.be links, playlists, channels. Bulk-friendly: list, file upload, or Google Sheet. |
searchKeywords | array | [] | Search terms; the top matching videos are added to the queue. Use instead of, or on top of, urls. |
scrapeShorts | bool | false | Include Shorts (โค 60 s) found inside channels, playlists and searches. Shorts you paste directly are always processed. |
maxVideosPerSource | int | 10 | Videos taken from each playlist, channel, or keyword. Does not limit individual video links. |
maxResults | int | 0 | Hard ceiling on videos processed in the whole run, after expansion and de-duplication. 0 = no limit. |
outputFormat | enum | json | json (text array) ยท text (single string) ยท vtt (WebVTT) ยท srt (SubRip). |
language | enum | en | Preferred caption language (76 options). Falls back to English, then any available track. |
channelNameBoolean | bool | false | Add channelName. |
channelIDBoolean | bool | false | Add channelID. |
datePublishedBoolean | bool | false | Add datePublished (ISO timestamp). |
dateTextBoolean | bool | false | Add dateText (Feb 22, 2024). |
relativeDateTextBoolean | bool | false | Add relativeDateText (2 years ago). |
viewCountBoolean | bool | false | Add viewCount. |
likesBoolean | bool | false | Add likes. |
commentsBoolean | bool | false | Add comments. |
keywordsBoolean | bool | false | Add keywords (tags). |
thumbnailBoolean | bool | false | Add thumbnailUrl. |
descriptionBoolean | bool | false | Add description. |
maxConcurrency | int | 4 | Videos processed in parallel (1โ16). |
requestDelaySecs | number | 1.0 | Polite pause before each request starts. Decimals allowed; 0 disables it. |
maxRetries | int | 8 | Attempts per video before it is skipped (3โ12), with exponential backoff. |
๐ Integrations: LangChain, LlamaIndex, OpenAI, Pinecone, n8n
- ๐ฆ LangChain โ load the Dataset with
ApifyDatasetLoader, mappingcaptionsโpage_content. - ๐ฆ LlamaIndex โ feed transcripts into a
VectorStoreIndexwithtitle/channelNamemetadata. - ๐ง 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
| Event | When it fires | What you get |
|---|---|---|
transcript_result | Once per transcript row written to the Dataset | A 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_resultevent 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
maxResultsandmaxVideosPerSourceโ the single biggest cost lever. - ๐ Only tick the extra data points you actually need.
- ๐งพ Use
jsonortextoutput rather thanvtt/srtwhen you don't need timings โ smaller rows. - โก Leave
maxConcurrencyat4unless you have a reason to change it. - ๐ข Raise
requestDelaySecsand lowermaxConcurrencyon 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
| Symptom | Likely cause | Fix |
|---|---|---|
No transcript available for this video | The uploader disabled captions entirely. | Nothing to fix โ the video genuinely has no caption track. |
| Transcript is in the wrong language | The 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 unavailable | The 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 expected | maxVideosPerSource or maxResults capped it. | Raise those limits. |
| Shorts missing from a channel run | scrapeShorts is off. | Turn on ๐ฑ Include YouTube Shorts. |
| Run saved 0 rows | No 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.
โ๏ธ Is scraping YouTube transcripts legal?
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