YouTube Transcript & Subtitles Scraper API avatar

YouTube Transcript & Subtitles Scraper API

Pricing

from $2.00 / 1,000 results

Go to Apify Store
YouTube Transcript & Subtitles Scraper API

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

Data Minds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Categories

Security

Limited permissions

Share

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_matched says so.
  • ๐Ÿงพ Prefer creator captions: manual captions are chosen over auto-generated YouTube closed captions, and is_generated tells 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 start and a duration, 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.

GroupFieldWhat it holds
๐ŸŽฌ Videourl, video_id, titleWatch link, 11-character video ID and title
๐Ÿ“บ Channelchannel_name, channel_id, channel_url, channel_subscribersChannel name, ID, link and approximate subscriber count
๐Ÿ‘ Engagementview_count, like_count, comment_countView, like and approximate comment counts
๐Ÿ—“ Datesupload_date, published_atUpload date (YYYY-MM-DD) and publish timestamp
๐Ÿท Detailscategory, duration_seconds, duration_human, is_live, is_family_safe, thumbnail_url, tags, hashtags, links, descriptionCategory, length, flags, thumbnail, tags, hashtags, links and description text
๐ŸŒ Languagetranscript_source, language, language_code, is_generated, language_matched, available_tracksChosen caption language and type, and every caption track of the video
๐Ÿ“ˆ Statisticssnippet_count, word_count, reading_time_min, speaking_rate_wpmSegment count, words, estimated reading time and speaking rate
๐Ÿ“š ChapterschaptersChapters with title, start, end and their own text
โฑ Transcripttimestamped, non_timestampedSegments with text, start and duration, and the whole transcript as one text
๐Ÿ’พ Subtitle filessrt, vtt, txtSubtitle text in the formats you selected
๐Ÿงญ Sourcesource, source_input, positionHow the video was found (video, playlist, channel or search), the input that produced it and its order in the run
โœ… Statussuccess, error_type, error_message, scraped_at, metadata_errorSuccess 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. With includeMetadata switched off, the detail fields (subscribers, likes, comments, dates, category, flags, thumbnail, tags, hashtags, links, description, chapters and metadata_error) are left out of the row. Only the formats listed in subtitleFormats appear as srt, vtt or txt.

What data can't YouTube Transcript & Subtitles Scraper API extract?

  • Transcripts for videos without a caption track: the row is saved with success set to false and 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

  1. Create a free Apify account or log in.
  2. Open YouTube Transcript & Subtitles Scraper API and go to the Input tab.
  3. Add video, Shorts, playlist or channel links, @handles or search phrases to urls.
  4. Set maxItems to the number of videos you want per input.
  5. Choose languages in priority order and tick the subtitleFormats you need.
  6. Click Start and watch the rows appear in the Output tab.
  7. 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 planPrice per resultPrice 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.

FieldTypeRequiredDefaultDescription
urlsarrayYesnone (prefilled with a video and a channel)Video, Shorts, playlist or channel links, @handles, channel IDs or plain search phrases
maxItemsintegerNo10Maximum videos to transcribe per input URL; each channel, playlist or search gets up to this many videos independently
languagesarrayNo["en"]Caption languages in priority order; the first available language is used
includeMetadatabooleanNotrueAdds likes, comments, subscribers, upload date, category, tags, links and chapters with their own transcript text
subtitleFormatsarrayNo["srt"]Subtitle files added to every video: srt, vtt or txt
proxyConfigurationobjectNo{"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 /shorts or /streams use those tabs.
  • maxItems:
    • โœ… Good: 10 for a first test, 200 for a full channel
    • โŒ Bad: 0 or text such as all
    • Warning: The limit applies to each input separately, so 3 channels with maxItems 10 can give up to 30 videos. Values above 5,000 are treated as 5,000.

  • 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_matched is false.

  • subtitleFormats:
    • โœ… Good: ["srt", "vtt"]
    • โŒ Bad: ["pdf"] (unknown formats are ignored and no subtitle file is added)

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_min and speaking_rate_wpm stay null for 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 position to 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 maxItems such as 5 to check the output, then raise it for full channels and playlists.
  • Switch includeMetadata off 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 ApifyClient
client = 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

ActorWhat it does
๐Ÿ”Ž YouTube Search APISearch YouTube for videos, channels and playlists with enriched engagement, channel, and transcript data.
๐ŸŒ Website Content CrawlerTurns any website into clean text, Markdown and page metadata for RAG pipelines, LLM knowledge bases and SEO content audits.
๐ŸŽฌ YouTube Transcript ScraperExtracts YouTube transcripts, subtitles and captions in bulk, plus channel, views, likes, keywords and description, into a clean dataset.

FAQ

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.