Youtube Video Subtitles Scraper avatar

Youtube Video Subtitles Scraper

Pricing

$14.99/month + usage

Go to Apify Store
Youtube Video Subtitles Scraper

Youtube Video Subtitles Scraper

The YouTube Video Subtitles Scraper actor extracts subtitles or captions from YouTube videos in any language. It supports bulk URL input and saves text or timestamped transcripts for analysis. Perfect for SEO, translation, accessibility, and video content research automation.

Pricing

$14.99/month + usage

Rating

0.0

(0)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

0

Monthly active users

13 days ago

Last modified

Share

YouTube Video Subtitles Scraper — Transcripts and Metadata

YouTube Video Subtitles Scraper pulls the full transcript, title, channel details, and engagement counts from any public YouTube video URL and returns them as structured JSON — no browser extension or copy-pasting captions by hand. Each row carries the caption text broken into timed segments, alongside view, like, and comment counts, ready to load into a spreadsheet, a database, or an LLM pipeline. Paste in your video URLs below and start a run to see it work. 🎯


🎬 What is YouTube Video Subtitles Scraper?

YouTube Video Subtitles Scraper is an Apify Actor that extracts the caption/transcript track and public metadata from individual YouTube video URLs, one row of JSON per video. It reads whichever caption track is available — manual or auto-generated (ASR) — and pairs it with the video's title, description, channel info, and public engagement counters. No YouTube account or sign-in is required to run it. It's built for developers, data teams, and AI engineers who need clean transcript data instead of scraping the watch page themselves.


📺 What YouTube video data is publicly available to scrape?

Anyone who opens a public YouTube video in a browser can see its title, description, tags, view/like/comment counts, and — where the uploader enabled them — its captions. YouTube Video Subtitles Scraper reads that same publicly rendered information; it does not authenticate as the video owner or access anything gated behind channel ownership.

Data CategoryPublic (no login)Restricted (channel-owner login / OAuth)
Manually-uploaded subtitles
Auto-generated (ASR) captions
Video title, description, tags
View / like / comment counts
Channel name, ID, and URL
Upload date
Downloading a caption track through YouTube's own API✅ Requires OAuth with edit permission on the video
Private, unlisted, or members-only videos✅ Owner login or invite link
Age-restricted videos requiring sign-in confirmation✅ Google account sign-in

YouTube Video Subtitles Scraper only returns publicly visible data — what any visitor sees on the watch page. Nothing behind a login wall.


📝 What data can I extract with YouTube Video Subtitles Scraper?

Every run returns typed JSON rows covering the video's identity, its public engagement metrics, and the transcript itself with per-segment timing.

Field NameDescription
urlThe YouTube video URL exactly as provided in the input
titleVideo title ("Unknown Title", "Invalid Input", or "Failed to retrieve" on failed rows)
descriptionFull video description text, or null
tagsArray of the video's tag strings, or null
channel_nameUploading channel's display name ("N/A" or "Unknown Channel" when unavailable)
channelIdCanonical YouTube channel ID, or null
channelUrlFull URL to the channel, or null
publishedAtUpload date in ISO 8601 date format (YYYY-MM-DD), or null if it couldn't be parsed
lengthVideo duration formatted as MM:SS (or H:MM:SS past one hour); "0:00" if unknown
typeAlways "video" — a constant row-type marker
viewsView count as an integer, or null
likeCountLike count as an integer, or null
commentCountComment count as an integer, or null
transcriptArray of caption segments (see below), or [] when no transcript is available
statusMachine-readable outcome code for the row (see Output section)
messageHuman-readable explanation paired with status
successBoolean — true only when status is "success"
scrapedAtISO 8601 UTC timestamp of when the row was generated

🎬 Video & channel details

url, title, description, tags, channel_name, channelId, channelUrl, publishedAt, length, type — everything that identifies the video and where it lives.

📊 Engagement metrics

views, likeCount, commentCount — the public counters shown on the watch page.

📝 Transcript & run status

transcript, status, message, success, scrapedAt — the caption content itself, plus a per-row outcome you can filter and branch on. Each transcript segment is an object: { "start": "1.360", "dur": "1.680", "text": "..." }. start and dur are decimal-second strings, not numbers.

🤖 Add-on: Need additional YouTube data?

If you also want an AI-generated summary of the same videos rather than the raw transcript, pair this Actor with YouTube Video Summarizer from Scraper-Engine. For video content on a different platform with the same transcript-plus-metadata shape, see Facebook Video Transcript Extractor.


🔍 How does YouTube Video Subtitles Scraper differ from the official YouTube API?

YouTube's own Data API v3 exposes a captions resource, but downloading the actual caption text through it requires OAuth 2.0 authorization with edit permission on that specific video — per Google's own documentation, checked 2026-08-15, captions.download "requires the user to have permission to edit the video," so it only works for videos you (or your authorized app) own. YouTube Video Subtitles Scraper reads the same publicly rendered caption tracks without any of that — you provide a public video URL and get the transcript back.

FeatureYouTube Data API v3YouTube Video Subtitles Scraper
Caption/transcript text accessOAuth 2.0 + edit permission on the video (own channel only)No login — works on any public video URL
Default daily quota10,000 quota units/day per Google Cloud project, per Google's getting-started docs (checked 2026-08-15)No platform-imposed request quota; governed by your Apify plan and run configuration
SetupGoogle Cloud project, API credentials, OAuth consent flowProvide video URLs and start the run
Bulk processingOne authorized call per caption track, each drawing from the quotaMultiple URLs in a single run, processed concurrently (maxWorkers)
Missing-language handlingYou query captions.list and choose a track yourselfFalls back automatically to any available track if the requested language is missing

Use the official API when you own the channel and need to manage or upload captions. Use YouTube Video Subtitles Scraper when you need to read transcripts from videos you don't own, in bulk, without setting up OAuth.


▶️ How to use YouTube Video Subtitles Scraper

Get transcripts in three steps — no scraping code to write.

  1. Open YouTube Video Subtitles Scraper on the Apify Store and click Try for free (or Start, if you already have it saved).
  2. Provide the required input — startUrls, a list of YouTube video URLs, one per line.
  3. Optionally set language for a preferred caption language, maxWorkers to control parallelism, and proxyConfiguration for larger runs.
  4. Start the run.
  5. Download results as JSON or CSV from the Actor's dataset, or stream them via the Apify API.

📈 How to scale to bulk video transcript extraction

startUrls accepts as many video URLs as you add — paste in a batch and the Actor processes them together. maxWorkers (1–10, default 4) controls how many videos are fetched in parallel within that single run, so a larger batch finishes faster without you writing a loop. There is no separate bulk endpoint; one run with many URLs is the bulk pattern.


🎯 What can you do with YouTube video transcript data?

  • 🎓 AI/NLP researchers building training sets use transcript and publishedAt to assemble time-stamped, multilingual caption corpora without manually downloading each video's captions.
  • 📊 Content analysts studying messaging use transcript alongside title and tags to search for keyword or topic frequency across a channel's catalog.
  • 🎬 Video editors and localizers use the segment-level start/dur/text transcript structure to resync or translate captions without re-timing them by hand.
  • 📈 Growth marketers benchmarking content use views, likeCount, and commentCount alongside transcript to correlate what's said in a video with how it performs.
  • 🤖 AI engineers feed transcript text into a RAG pipeline or vector store as searchable, timestamped context for a video-aware chatbot or agent tool.

Because output is typed JSON with stable field names, any of these pipelines — including agent-based ones — can call the Actor over HTTP and consume the result directly, with no HTML parsing step in between.


🛡️ How does YouTube Video Subtitles Scraper handle rate limits and blocking?

Each video gets up to four attempts (one initial plus three retries) before the Actor gives up on it. When a request comes back with a blocking signal — HTTP 429, "forbidden," "rate limit," or messages like "sign in to confirm you're not a bot" — the Actor escalates its connection: starting with no proxy, then Apify Datacenter proxy, then Apify Residential proxy, waiting 2 seconds between attempts. Once residential proxying is triggered, the rest of the run keeps using it rather than resetting per video. You can also pre-select a proxy group yourself via proxyConfiguration; the Actor still escalates further if that group gets blocked, up to 3 residential retries per video before it stops trying.

⚠️ Errors that aren't retryable — a video reported as unavailable, private, removed, or age-restricted — are not retried at all; the row is returned immediately with a status explaining why. The Actor does not solve CAPTCHAs.


⬇️ Input

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayYouTube video URLs, one per line. Individual video URLs only — channel or playlist URLs are not supported.["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]
languageNostringPreferred transcript language code (e.g. en, es, fr). Default: "en". If the preferred language has no captions, the Actor falls back to any available track."en"
maxWorkersNointegerNumber of videos processed in parallel. Minimum 1, maximum 10, default 4. Values outside this range are clamped, not rejected.4
proxyConfigurationNoobjectApify Proxy configuration. Leave the default for normal use — the Actor escalates automatically when needed.{ "useApifyProxy": false }

📥 Example input

{
"startUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"language": "en",
"maxWorkers": 4,
"proxyConfiguration": {
"useApifyProxy": false
}
}

⬆️ Output

Every video produces one typed, normalized JSON row with a consistent schema across runs — whether the video succeeded or failed. Download results as JSON, CSV, Excel, or other formats supported by the Apify dataset export options.

📤 Example output

[
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channel_name": "Rick Astley",
"length": "3:33",
"views": 1708447413,
"transcript": [
{ "start": "1.360", "dur": "1.680", "text": "[♪♪♪]" },
{ "start": "18.640", "dur": "3.240", "text": "♪ We're no strangers to love ♪" },
{ "start": "22.640", "dur": "4.320", "text": "♪ You know the rules and so do I ♪" }
],
"message": "Transcript loaded (manual captions, en).",
"success": true,
"status": "success",
"description": "The official video for \"Never Gonna Give You Up\" by Rick Astley.",
"tags": ["rick astley", "never gonna give you up", "80s music"],
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw",
"publishedAt": "2009-10-25",
"likeCount": 18456123,
"commentCount": 2450123,
"type": "video",
"scrapedAt": "2026-08-15T12:00:00+00:00"
}
]

status is one of: success, no_transcript, video_unavailable, restricted, fetch_error, empty_response, parse_error, temporary_issue, or invalid_input. Filter on status === "success" (or success === true) to keep only fully-scraped rows.

⚠️ Every row is billed as one row_result event, including failed ones (no_transcript, video_unavailable, invalid_input, and the rest) — there is no free or uncharged path for error rows. Double-check startUrls before a large run, since an invalid or unreachable URL still produces (and charges for) a row.


⚙️ How does it work?

YouTube Video Subtitles Scraper reads a video's public metadata and caption track listing through yt-dlp, which talks to YouTube's own video-info endpoints rather than parsing the rendered watch page's HTML. Once it has the caption track URL for the requested (or best-available) language, it downloads and parses that caption data directly. If a request is blocked, the Actor retries through Apify's proxy network, escalating from no proxy to datacenter to residential IPs as described above. Only what's publicly visible on the video — captions, title, description, tags, and public counters — is ever returned; nothing requires signing in. Because the output schema (the field names and row shape above) is fixed by the Actor's own code rather than by scraping selectors tied to YouTube's page layout, it stays stable even when YouTube's front-end changes.


🔌 Integrations

YouTube Video Subtitles Scraper runs on the Apify platform, so it's reachable from anything that can call an HTTP API or use the Apify SDK — no separate signup or API surface beyond your Apify account.

🐍 Calling YouTube Video Subtitles Scraper programmatically

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run_input = {
"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"language": "en",
"maxWorkers": 4,
}
run = client.actor("youtube-video-subtitles-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["status"])

Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.

🧩 No-code tools (n8n, Make)

In n8n, use the HTTP Request node pointed at the Actor's run endpoint (or the community Apify node) to trigger a run and pull results into your workflow. In Make, use the Apify app's "Run an Actor" module the same way, then feed the resulting dataset items into downstream modules.


Scraping publicly available video captions and metadata is generally lawful — this covers information any visitor to the video's page can already see, not content behind a login. YouTube Video Subtitles Scraper only returns public data; it does not authenticate as a channel owner or access private, unlisted, or restricted videos. Because the output centers on video/caption content rather than private individuals' personal records, the relevant constraints are YouTube's own Terms of Service and copyright in the underlying video and captions, not a personal-data regime like GDPR. Consult legal counsel if your use case involves bulk storage or redistribution of copyrighted transcript content.


❓ Frequently asked questions

What YouTube video fields does YouTube Video Subtitles Scraper return?

It returns transcript, title, channel_name, views, and publishedAt among the full set of 18 fields — see What data can I extract above for the complete list.

Does YouTube Video Subtitles Scraper require a YouTube account or login?

No. The Actor reads publicly available video pages and caption tracks without signing in to YouTube. You do need an Apify account to run the Actor itself.

How many YouTube videos can I process in one run?

startUrls accepts as many video URLs as you add in a single run, processed with up to maxWorkers (1–10, default 4) running in parallel.

What happens if a video has no captions available?

The row is still returned with status: "no_transcript" and a message explaining that no transcript is available for that video — the run does not fail, and the other rows in the batch are unaffected.

Can I scrape multiple YouTube videos at once?

Yes. startUrls is an array — add multiple video URLs and they're processed concurrently up to maxWorkers.

Does YouTube Video Subtitles Scraper work with Claude, ChatGPT, and other AI agent tools?

It's callable as a standard HTTP API endpoint (via the Apify API or apify_client) by any agent framework that can make an HTTP request; it does not currently expose a dedicated MCP server.

How does YouTube Video Subtitles Scraper compare to other YouTube subtitle scrapers?

No verified competitor data was available at the time of writing. What's documented here is grounded in this Actor's own source: automatic language fallback across manual and auto-generated captions, configurable concurrency (maxWorkers), and a proxy-escalation retry path — check any specific competitor's own listing for their claims before comparing.

Does YouTube Video Subtitles Scraper return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with consistent field names across runs. Pass it directly to an LLM, index transcript text into a vector store, or feed it to an agent tool — no HTML parsing or custom selectors required.

What happens when YouTube changes its layout or anti-bot system?

The Actor is maintained and its output schema is designed to stay stable across YouTube changes, since it reads video-info and caption endpoints rather than parsing the rendered page. No specific update turnaround time is published or guaranteed.

Can I use YouTube Video Subtitles Scraper without managing proxies or browser infrastructure?

Yes. Apify Proxy (datacenter and residential tiers) is handled and escalated automatically by the Actor; you don't need to source or rotate proxies yourself, and there's no separate browser to configure.

Which fields work best for AI training data and RAG indexing?

For RAG, index transcript (the timestamped caption text) alongside title and description as searchable context. For training data, transcript, views, likeCount, and publishedAt return as consistently typed primitives across every successful row.


Scraper NameWhat it extracts
YouTube Video SummarizerAI-generated summaries of YouTube videos
Facebook Video Transcript ExtractorTranscripts and metadata from Facebook videos
TikTok ScraperTikTok video, creator, and engagement data

💬 Your feedback

Found a bug or missing a field? Open an issue on this Actor's Issues tab in the Apify Console, or leave feedback on its Apify Store listing — reports get read and factored into the next update.