YouTube Transcript & Subtitles Scraper API
Pricing
from $2.00 / 1,000 results
YouTube Transcript & Subtitles Scraper API
Get full YouTube transcripts with timestamps and chapters, plus SRT, VTT and TXT subtitle files. Works for videos, Shorts, playlists, channels and search phrases. Language choice, no login or cookies. Bulk input, auto proxy. Export JSON, CSV or Excel.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Data Minds
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Security
Limited permissionsShare
What is YouTube Transcript & Subtitles Scraper API?
YouTube Transcript & Subtitles Scraper API is a YouTube subtitles scraper that turns video, Shorts, playlist and channel links, @handles and search phrases into transcripts, chapters and ready-made SRT, VTT or TXT subtitle files. Paste your links, pick a language, and get one dataset row per video with the full timestamped transcript, plain text and video details. Pay per saved transcript, from $0.002 on the Gold plan. ๐ Try it free
Use it for bulk YouTube transcript download jobs and to:
- ๐ค Build AI training data from YouTube transcripts: collect clean text for LLM training data, with language, caption type and word count for every video.
- ๐ Feed a RAG knowledge base: turn whole channels and playlists into transcript text for a vector store or an LLM prompt.
- โฟ Create subtitle files for accessibility: download SRT, WebVTT or plain text subtitle files for each video as accessibility captions.
- ๐ Research a channel's content: read views, likes, comments, tags and chapters next to each transcript for keyword analysis and competitor video analysis.
- ๐ Repurpose videos into blog posts and study notes: get the whole transcript as one block of text, or chapter by chapter.
- โฐ Monitor new videos on a schedule: run it on a schedule so your transcript data stays fresh.
It runs on the Apify platform, so you also get the Apify API, scheduling, webhooks, integrations and dataset exports in JSON, CSV, Excel, XML and HTML. It reads transcripts from public YouTube videos that have a caption track.
What can YouTube Transcript & Subtitles Scraper API do?
- ๐ Mix sources in one field: videos, Shorts, playlists, channels (link, @handle or channel ID) and search phrases.
- ๐ Pick caption languages in priority order: choose from 31 language options; if none matches, the closest track is returned and
language_matchedsays so. - ๐งพ Prefer creator captions: manual captions are chosen over auto-generated YouTube closed captions, and
is_generatedtells you which one you got. - ๐พ Get subtitle files: SRT, WebVTT and plain text added to every video row.
- ๐ Read chapters with their own text: each chapter carries the transcript that falls inside it.
- ๐ Get reading statistics: word count, reading time and speaking rate per video.
- ๐ Get a YouTube transcript with timestamps: every segment has a
startand aduration, and the plain text is saved too. - โก See results while the run is going: every row is saved as soon as it is ready, and failed videos are listed with a reason.
Which YouTube transcript Actor should I use?
This Actor is built around subtitle files, chapters with their own text and eight ready-made output tables. If you mainly need a choice of caption languages or control over Shorts found in channels and playlists, the sibling YouTube Transcript Scraper is the better match. See the table of related Actors below.
What data can YouTube Transcript & Subtitles Scraper API extract?
Each video becomes one row. The table lists every field.
| Group | Field | What it holds |
|---|---|---|
| ๐ฌ Video | url, video_id, title | Watch link, 11-character video ID and title |
| ๐บ Channel | channel_name, channel_id, channel_url, channel_subscribers | Channel name, ID, link and approximate subscriber count |
| ๐ Engagement | view_count, like_count, comment_count | View, like and approximate comment counts |
| ๐ Dates | upload_date, published_at | Upload date (YYYY-MM-DD) and publish timestamp |
| ๐ท Details | category, duration_seconds, duration_human, is_live, is_family_safe, thumbnail_url, tags, hashtags, links, description | Category, length, flags, thumbnail, tags, hashtags, links and description text |
| ๐ Language | transcript_source, language, language_code, is_generated, language_matched, available_tracks | Chosen caption language and type, and every caption track of the video |
| ๐ Statistics | snippet_count, word_count, reading_time_min, speaking_rate_wpm | Segment count, words, estimated reading time and speaking rate |
| ๐ Chapters | chapters | Chapters with title, start, end and their own text |
| โฑ Transcript | timestamped, non_timestamped | Segments with text, start and duration, and the whole transcript as one text |
| ๐พ Subtitle files | srt, vtt, txt | Subtitle text in the formats you selected |
| ๐งญ Source | source, source_input, position | How the video was found (video, playlist, channel or search), the input that produced it and its order in the run |
| โ Status | success, error_type, error_message, scraped_at, metadata_error | Success flag, reason when no transcript was collected, UTC time, and why details were incomplete |
Note: Fields that YouTube does not provide for a video are
null. WithincludeMetadataswitched off, the detail fields (subscribers, likes, comments, dates, category, flags, thumbnail, tags, hashtags, links, description, chapters andmetadata_error) are left out of the row. Only the formats listed insubtitleFormatsappear assrt,vttortxt.
What data can't YouTube Transcript & Subtitles Scraper API extract?
- Transcripts for videos without a caption track: the row is saved with
successset tofalseand is not charged. - Translated captions: the Actor returns an available caption track and never translates one.
- Private videos, age-restricted videos and videos that were removed: they appear as failed rows with a reason.
- Comments text, video files or audio: only transcripts, subtitle files and video details are collected.
How to use a YouTube subtitles scraper
- Create a free Apify account or log in.
- Open YouTube Transcript & Subtitles Scraper API and go to the Input tab.
- Add video, Shorts, playlist or channel links, @handles or search phrases to
urls. - Set
maxItemsto the number of videos you want per input. - Choose
languagesin priority order and tick thesubtitleFormatsyou need. - Click Start and watch the rows appear in the Output tab.
- Switch between the output tables, then export the results as JSON, CSV or Excel.
How much does it cost to run a YouTube subtitles scraper?
The Actor uses pay-per-event pricing: you pay for each video whose transcript was saved. Failed videos are listed but never charged. Platform usage is billed in addition. The price per result depends on your Apify plan:
| Apify plan | Price per result | Price per 1,000 results |
|---|---|---|
| Free | $0.0025 | $2.50 |
| Bronze | $0.00225 | $2.25 |
| Silver | $0.00215 | $2.15 |
| Gold | $0.002 | $2.00 |
Each run also starts with a start event of $0.00005 per GB of memory, with a minimum of one. This Actor runs with 1024 MB by default, so a run starts with one start event of $0.00005.
Worked example on the Gold plan: 1,000 saved transcripts cost 1,000 x $0.002 = $2.00, plus the $0.00005 start event, plus platform usage.
Free plan math: the $5 monthly credit of the Apify Free plan covers about 2,000 transcripts at the Free price of $0.0025, before platform usage.
Is this YouTube subtitles scraper free to try?
Yes. A new Apify account includes free monthly credit, so you can run the default input and review real output before you pay for anything. Check the pricing tab for the current prices.
Input
Only urls is required. You can start with the prefilled input below, which transcribes one video and the latest videos of one channel:
{"urls": ["https://www.youtube.com/watch?v=aircAruvnKk", "@3blue1brown"],"maxItems": 10,"languages": ["en"],"includeMetadata": true,"subtitleFormats": ["srt"],"proxyConfiguration": { "useApifyProxy": false }}
See the full input schema for every option.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
urls | array | Yes | none (prefilled with a video and a channel) | Video, Shorts, playlist or channel links, @handles, channel IDs or plain search phrases |
maxItems | integer | No | 10 | Maximum videos to transcribe per input URL; each channel, playlist or search gets up to this many videos independently |
languages | array | No | ["en"] | Caption languages in priority order; the first available language is used |
includeMetadata | boolean | No | true | Adds likes, comments, subscribers, upload date, category, tags, links and chapters with their own transcript text |
subtitleFormats | array | No | ["srt"] | Subtitle files added to every video: srt, vtt or txt |
proxyConfiguration | object | No | {"useApifyProxy": false} | Optional proxy settings; leave the default unless you need a specific setup |
Tricky fields
urls:- โ
Good:
"https://www.youtube.com/playlist?list=PLxxxxxxxxxxx","@channelname"or"machine learning basics" - โ Bad: a link to another website, or an empty entry
- A phrase that is not a link is treated as a YouTube search. A channel link without a tab uses its Videos tab; links ending in
/shortsor/streamsuse those tabs.
- โ
Good:
maxItems:- โ
Good:
10for a first test,200for a full channel - โ Bad:
0or text such asall -
Warning: The limit applies to each input separately, so 3 channels with
maxItems10 can give up to 30 videos. Values above 5,000 are treated as 5,000.
- โ
Good:
languages:- โ
Good:
["en", "es"]to try English first and Spanish second - โ Bad: listing a language that the video has no captions for and expecting a translation
-
Warning: If none of your languages exists, the closest caption track is returned and
language_matchedisfalse.
- โ
Good:
subtitleFormats:- โ
Good:
["srt", "vtt"] - โ Bad:
["pdf"](unknown formats are ignored and no subtitle file is added)
- โ
Good:
Output
Results are stored in the run's dataset, and the Output tab shows them as eight tables: Videos, Full transcripts, Timestamped segments, Chapters, Caption tracks, Subtitle files, Video details and Run status. Export the data as JSON, CSV, Excel, XML or HTML, or read it through the API.
JSON example
This is one row for the prefilled input, with subtitleFormats set to srt:
{"url": "https://www.youtube.com/watch?v=abcdEFGhij1","video_id": "abcdEFGhij1","title": "Example video title","channel_name": "Example Channel","channel_id": "UCexampleexampleexample01","channel_url": "https://www.youtube.com/channel/UCexampleexampleexample01","channel_subscribers": 120000,"view_count": 450000,"like_count": 18000,"comment_count": 900,"upload_date": "2024-05-01","published_at": "2024-05-01T10:00:00-07:00","category": "Education","duration_seconds": 12,"duration_human": "12s","is_live": false,"is_family_safe": true,"thumbnail_url": "https://example.com/thumbnail.jpg","tags": ["example", "tutorial"],"hashtags": ["#example"],"links": ["https://example.com/resources"],"description": "Example description text.","transcript_source": "captions","language": "English","language_code": "en","is_generated": false,"language_matched": true,"available_tracks": [{ "language": "English", "language_code": "en", "is_generated": false, "is_translatable": true }],"snippet_count": 2,"word_count": 9,"reading_time_min": 0.0,"speaking_rate_wpm": 45,"chapters": [{ "title": "Intro", "start": 0.0, "end": 12.0, "text": "Welcome to the example video." }],"timestamped": [{ "text": "Welcome to the example video.", "start": 0.5, "duration": 2.5 },{ "text": "Today we cover one example.", "start": 3.0, "duration": 2.0 }],"non_timestamped": "Welcome to the example video. Today we cover one example.","srt": "1\n00:00:00,500 --> 00:00:03,000\nWelcome to the example video.\n\n2\n00:00:03,000 --> 00:00:05,000\nToday we cover one example.\n","source": "video","source_input": "https://www.youtube.com/watch?v=abcdEFGhij1","position": 1,"success": true,"error_type": null,"error_message": null,"scraped_at": "2026-01-01T12:00:00Z","metadata_error": null}
The numbers in this example are made up for illustration. A video that could not be transcribed is saved as a row with success set to false, an error_type such as TranscriptsDisabled, VideoPrivate, AgeRestricted or VideoUnavailable, and a readable error_message.
At the end of each run, the Actor also saves a RUN_SUMMARY record in the key-value store with totalTranscripts, charged, failed, skipped, durationSecs and spendLimitReached.
Notes and limitations
- Only public videos with a caption track can be transcribed. Auto-generated and creator-written captions are both supported.
- A video that appears in several inputs is transcribed once.
word_count,reading_time_minandspeaking_rate_wpmstaynullfor Chinese, Japanese, Thai, Lao, Khmer and Burmese captions, which are written without spaces between words.- Rows are saved as they finish, so their order can differ from your input order. Use
positionto sort them. - The run stops cleanly when your spending limit is reached, and the rows saved so far are kept.
Tips and advanced usage
- Start with a low
maxItemssuch as 5 to check the output, then raise it for full channels and playlists. - Switch
includeMetadataoff when you only need transcripts: rows get smaller and carry only title, channel, view count and length. - Select only the subtitle formats you will use, since each format adds its own text to every row.
- Use the Chapters table to split long lectures into sections that already contain their transcript text.
- Use scheduled runs with the same channel input to collect new videos regularly.
- Use it as a YouTube subtitle downloader or a YouTube subtitle extractor when you need files for many videos at once.
- Use it as a YouTube transcript extractor for whole channels by adding the channel @handle to
urls.
Integrations and API
Can I use YouTube Transcript & Subtitles Scraper API as an API?
Yes. You can start runs and read results with the Apify API or with the apify-client packages for Node.js and Python. The API tab shows ready-to-copy code for this Actor.
How to scrape YouTube transcripts with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("data_minds/youtube-transcript-subtitles-scraper-api").call(run_input={"urls": ["https://www.youtube.com/watch?v=aircAruvnKk", "@3blue1brown"],"maxItems": 10,"languages": ["en"],"includeMetadata": True,"subtitleFormats": ["srt"],"proxyConfiguration": {"useApifyProxy": False},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["word_count"])
Can I integrate YouTube Transcript & Subtitles Scraper API with other apps?
Yes. Connect it to Make, Zapier, Google Sheets, Slack and other apps through Apify integrations, trigger your own services with webhooks, or run it on a schedule from the Apify Console.
Can I use YouTube Transcript & Subtitles Scraper API with AI agents (MCP)?
Yes. AI agents can call this Actor through the Apify MCP server. Open the MCP tab for the connection details.
Other YouTube and search scrapers
| Actor | What it does |
|---|---|
| ๐ YouTube Search API | Search YouTube for videos, channels and playlists with enriched engagement, channel, and transcript data. |
| ๐ Website Content Crawler | Turns any website into clean text, Markdown and page metadata for RAG pipelines, LLM knowledge bases and SEO content audits. |
| ๐ฌ YouTube Transcript Scraper | Extracts YouTube transcripts, subtitles and captions in bulk, plus channel, views, likes, keywords and description, into a clean dataset. |
FAQ
Is it legal to scrape YouTube transcripts?
Scraping publicly available data is generally considered legal in many places, but the rules depend on your country, the data and how you use it. This Actor only reads public videos. Read the Apify guide on web scraping legality and check YouTube's terms. This is not legal advice.
How does YouTube Transcript & Subtitles Scraper API work?
You give it YouTube video, Shorts, playlist or channel links, @handles or search phrases, plus your preferred languages. Channels, playlists and searches expand into their videos up to maxItems. For each video you get one row with the transcript, optional details and subtitle files, which you can open in the Output tab or export.
Why scrape YouTube transcripts?
Transcripts turn spoken video into searchable text. Teams use them to build AI training data, feed RAG knowledge bases, create subtitles for accessibility, repurpose videos into blog posts, make study notes from lectures, and run content research across a channel. Timestamps and chapters keep every quote linked to its place in the video.
Why did I get fewer results than expected?
Common reasons are videos without captions, private or removed videos, and a low maxItems, which applies to each input separately. A video that appears in several inputs is also transcribed only once. Open the Run status table to see the error_type and error_message of every video that was skipped or failed.
Is YouTube Transcript & Subtitles Scraper API not working?
First open the Run status table and read the error_message of the affected rows, because many failures come from private videos, missing captions or a mistyped link. Then try a smaller input. If the problem remains, open a report in the Issues tab with your run link, and the maintainers will look at it.
Do I need a YouTube account, cookies or an API key?
No. The Actor works with public videos, so you do not need a YouTube account, cookies or a YouTube API key. You only need an Apify account to run it. Videos that are private or restricted to signed-in viewers cannot be transcribed and are reported as failed rows with a reason.
Can I download YouTube subtitles as SRT or VTT files?
Yes. Tick srt, vtt or txt in subtitleFormats and each video row gets the matching subtitle text in a field of the same name. Copy the text into a file, or read it through the API. The Subtitle files table in the Output tab shows all three formats side by side.
Can I get a YouTube transcript in another language?
You can choose from 31 caption languages by listing language codes in languages, in priority order, if the video offers them. The Actor does not translate captions. When none of your languages exists, it returns the closest available track and sets language_matched to false, so you can filter those rows out.
Support and feedback
Found a problem or missing a feature? Open the Issues tab. For custom solutions or questions, contact hello.dataminds@gmail.com. Built and maintained by the data_minds team on Apify.
This Actor is an independent tool and is not affiliated with or endorsed by YouTube. Collect only public data, and make sure your use complies with applicable laws and the terms of the platforms involved.