Youtube Video Summarizer With Multi-Language Transcripts
Pricing
from $2.99 / 1,000 results
Youtube Video Summarizer With Multi-Language Transcripts
YouTube Video Summarizer extracts transcripts in multiple languages and generates concise video summaries with key points. Ideal for content research, competitor analysis, multilingual insights, knowledge extraction, and YouTube content workflows.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
YouTube Transcript Scraper — Multi-Language Captions & AI Summaries
Pull YouTube video metadata and timestamped transcripts in as many languages as you need from one run — every caption track honestly labelled manual, auto-generated, or auto-translated, plus an optional AI summary written in the output language you choose. Built for teams that need title, views, likes, duration_seconds, channel_name, transcript, transcriptLanguage and summary as clean, typed JSON rather than a raw .vtt file. Content teams, localization QA, RAG-dataset builders and video researchers use it to turn a list of links — or a search phrase — into structured, filterable rows. No YouTube login and no YouTube Data API key are required to run it.
⬇️ What is YouTube Transcript Scraper?
YouTube Transcript Scraper is an Apify Actor that takes a list of YouTube video links (or a search phrase, when you'd rather let it find the videos) and returns one JSON row per video: full video and channel metadata, one or more caption transcripts in the languages you request, and — if you switch it on and supply your own AI provider key — a short and a long summary in the language you pick. No YouTube account, login, or official API key is needed; the Actor reads publicly published caption tracks directly.
Key capabilities:
- 🔗 Two ways to build the video list — paste direct links (
videoUrls), or leave links empty and supplysearchPhraseswith a per-phrase result count (maxVideosPerPhrase) - 🌍 Multiple transcript languages in one pass — a main
transcriptLanguageplus any number ofadditionalTranscriptLanguages, each fetched and returned separately - 🏷️ Honest track-type labelling — every returned transcript states whether it's a creator-uploaded
manualsubtitle, YouTube's ownauto_generatedcaption, or anauto_translatedmachine translation, and never relabels one as another - 📊 Full metadata and channel block — views, likes, comments, engagement rate, duration, category, upload type, resolution, tags, hashtags, thumbnails, and channel name, handle, subscriber count and about-page details
- ✨ Optional AI summary in your own language, on your own key — a short and a long Markdown summary, off by default, billed to your own OpenAI/Anthropic/Google/xAI/DeepSeek/Perplexity/Mistral account, never to this Actor
- 📦 One consistent row shape — every row carries the same keys whether the video succeeded, was skipped, or errored, so CSV and Excel exports never end up ragged
⬆️ What data can I extract with YouTube Transcript Scraper?
Every row returned by the Actor combines video metadata, channel details, one or more transcripts, and (optionally) an AI summary:
| Field | Example Value | Use Case |
|---|---|---|
title | "Example talk" | Content identification, dataset labelling |
description | "In this talk..." | Topic/keyword extraction, RAG context |
channel_name | "Example Channel" | Attribution, channel-level rollups |
published_date | "2024-03-11" | Freshness filtering, trend analysis |
duration_seconds | 812 | Length filtering, cost estimation for AI calls |
views, likes, comment_count | 1284533, 20114, 842 | Popularity ranking, engagement benchmarking |
engagement_rate | 0.0165 | (likes + comments) / views, comparability across channels |
category, language | "Education", "en" | Segmentation, topic filtering |
upload_type | "short" | Separating Shorts from long-form video |
tags, hashtags | ["ted","talk"], ["#ai"] | Keyword/SEO research |
transcript | [{"start":"13.290","dur":"3.700","text":"Hear that?"}] | Timestamped captioning, video editing |
transcriptLanguage | "en" | Confirming which language the main transcript is in |
transcripts | array of per-language records | Multilingual corpus building |
summary / long_summary | short overview / Markdown | Content repurposing, briefing docs |
📜 Transcript and caption data
The transcripts array is the core of the dataset: one record per requested language, each with its language, languageName, trackType (manual / auto_generated / auto_translated), isMachineTranslated flag, isExactLanguageMatch flag, wordCount, characterCount, the joined text, and (when timestamps are enabled) the full entries list of {start, dur, text} segments. availableCaptionLanguages lists every caption language the video actually offers, with its track type, so you can see what exists even for languages you didn't request. transcriptCoveragePercent reports how much of the video's runtime the main transcript covers, and transcriptStatus reports the outcome (ok, partial, requested_languages_unavailable, no_captions_available, caption_fetch_failed, skipped_length_limit, or not_collected) — a video producer building a localization backlog can filter on missingTranscriptLanguages to find exactly which videos still need subtitles in a target market.
🎯 Fields you filter and target on
Requests are shaped by four real controls: transcriptLanguage (the main language, or the video's own original language), additionalTranscriptLanguages (extra languages returned alongside it), captionTrackTypes (all, manual_and_auto, or manual_only — how strict the accuracy/coverage trade-off is), and maxDurationSeconds (skip anything over a length threshold, e.g. 3600 to skip anything over an hour). Search-based discovery adds searchPhrases and maxVideosPerPhrase (1–50) as the scope controls when you don't already have specific links.
🔀 How does YouTube Transcript Scraper differ from the official YouTube Data API?
The YouTube Data API v3's caption endpoints — captions.list and captions.download — both require OAuth 2.0 authorization, not just an API key, as documented on Google's own developer site (developers.google.com/youtube/v3/guides/implementation/captions, checked 2026-08-15). That means a script using only an API key cannot call them at all; you need a signed-in OAuth flow, and captions.list alone costs 50 of the API's shared daily quota units, out of a default allocation of 10,000 units/day combined across all non-search.list/videos.insert endpoints (developers.google.com/youtube/v3/determine_quota_cost, checked 2026-08-15). Multi-language transcripts and AI summaries are not endpoints the official API offers at all — you'd build both yourself on top of it.
| Feature | YouTube Data API v3 | YouTube Transcript Scraper |
|---|---|---|
| Auth to fetch captions | OAuth 2.0 required for captions.list/captions.download | No YouTube login or API key |
| Multi-language transcripts in one call | Not available — one language fetch per request you build | Main + any number of extra languages in one row |
| Track-type honesty (manual vs auto vs translated) | captions.list returns a trackKind field you must interpret yourself | Returned pre-labelled as manual / auto_generated / auto_translated |
| AI summary | Not offered — build your own pipeline on top | Built in, using your own AI provider key |
| Quota model | Shared daily unit quota (captions.list = 50 units of 10,000/day) | Apify pay-per-event, one charge per processed video row |
| Setup | Google Cloud project, OAuth consent screen, quota request for scale | Paste links or a search phrase and run |
Why does the official captions API require OAuth instead of just an API key?
Google's caption endpoints are gated behind OAuth 2.0 authorization rather than a simple API key (confirmed on developers.google.com/youtube/v3/guides/implementation/captions, checked 2026-08-15). In practice this means an anonymous or server-side script cannot pull captions for arbitrary public videos using only a project API key — it needs a signed-in user flow, which is a meaningful integration cost for anyone who just wants transcripts for videos they don't own or manage. YouTube Transcript Scraper reads the same publicly published caption tracks without that OAuth step, returning them as structured rows.
Use the official API when you're building an app on behalf of a video owner and already run an OAuth consent flow. Use this Actor when you want transcripts and metadata for videos across many different channels without setting up authorization for each one.
🧑💻 How to use data extracted from YouTube?
🎙️ Content and localization teams
Feed a batch of videoUrls with a main transcriptLanguage plus additionalTranscriptLanguages for every market you localize into. Each row's transcripts array gives you the exact text to hand to translators or subtitle QA, and missingTranscriptLanguages flags videos that genuinely have no track in a target language yet, so a localization lead can prioritize which videos to caption next rather than checking each one by hand on YouTube.
🏢 Agencies and service providers
Run the same input across a client's channel or a competitor set on a schedule, pulling views, likes, comment_count and engagement_rate alongside transcript text, to produce a recurring content-performance and topic report without re-transcribing anything by hand each cycle.
📈 Market research and intelligence
Use searchPhrases with maxVideosPerPhrase to sample how a topic is being covered across many channels and languages at once — pulling category, language, channel_name and transcript text lets you map how a subject is framed differently across markets, using the transcript text itself rather than titles alone.
🤖 AI agents and automated pipelines
The text field inside each transcripts record is ready to drop straight into a RAG index or an LLM prompt without any HTML or .vtt cleanup, and the optional summary/long_summary fields give an automated pipeline a cheap first-pass digest before deciding whether to process the full transcript.
🔼 Input sample
Every field below matches the Actor's input schema exactly — same keys, same types, same defaults.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
videoUrls | No | array of strings | One YouTube video link per line — regular videos, Shorts, and youtu.be links all work | ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] |
searchPhrases | No | array of strings | Phrases to look up on YouTube when videoUrls is empty | ["spanish news", "french lesson"] |
maxVideosPerPhrase | No | integer (min 1, max 50, default 2) | How many videos to take from each search phrase | 2 |
transcriptLanguage | No | string enum (default "original") | Main transcript language: original or one of 35 language codes (en, es, pt, fr, de, it, nl, pl, ru, uk, tr, ar, he, fa, hi, bn, ta, ur, id, ms, vi, th, ja, ko, zh-Hans, zh-Hant, sv, da, no, fi, cs, ro, el, hu, sw) | "en" |
additionalTranscriptLanguages | No | array of strings (enum, same 35 codes minus original, unique items) | Extra languages returned alongside the main one, inside transcripts | ["es", "ja"] |
captionTrackTypes | No | string enum (default "all") | all (manual + auto + auto-translated), manual_and_auto, or manual_only | "all" |
includeTranscriptTimestamps | No | boolean (default true) | On: full {start, dur, text} segments per transcript. Off: plain text and counts only | true |
enableAiSummary | No | boolean (default false) | Generate a short and a long summary from the main transcript | true |
summaryLanguage | No | string enum (default "match_transcript") | match_transcript or one of the 35 language codes above | "es" |
aiModel | No | string enum (default "gpt-4o-mini") | One of: claude-haiku-4-5, claude-sonnet-5, claude-opus-4-8, gpt-4o-mini, gpt-4o, gpt-4.1-mini, gpt-4.1, o3-mini, gemini-2.0-flash-lite, gemini-2.0-flash, gemini-2.5-flash, gemini-2.5-pro, grok-3-mini, grok-3, deepseek-chat, sonar, sonar-pro, mistral-small-latest, mistral-large-latest | "gpt-4o-mini" |
aiApiKey | No | secret string | Your own provider API key. Environment fallbacks: OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, MISTRAL_API_KEY | "sk-..." |
aiApiBaseUrl | No | string | Custom endpoint for a private/enterprise deployment (e.g. Azure OpenAI resource URL) | "" |
aiModelName | No | string | Overrides the aiModel dropdown with an exact model/deployment name | "" |
maxDurationSeconds | No | integer (min 0, default 0) | Skip videos longer than this many seconds. 0 = no limit | 3600 |
maxRetries | No | integer (min 1, max 6, default 3) | Attempts per video before the row is written with an error reason | 3 |
urls | No | array of strings | Backward-compatible alias of videoUrls. If both are filled, videoUrls wins and urls is appended | [] |
proxyConfiguration | No | object | Apify Proxy configuration. Optional; larger runs are more reliable with it enabled | {"useApifyProxy": false} |
None of the fields are required — if both videoUrls/urls and searchPhrases are empty, the run fails immediately with a clear message instead of doing nothing silently.
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/VIDEO_ID_2"],"transcriptLanguage": "en","additionalTranscriptLanguages": ["es", "ja"],"captionTrackTypes": "all","includeTranscriptTimestamps": true,"enableAiSummary": true,"summaryLanguage": "es","aiModel": "gpt-4o-mini","aiApiKey": "<your own provider key>","maxDurationSeconds": 3600,"maxRetries": 3}
Common pitfall: transcriptLanguage is strict by design — if you request "de" and a video has no German track, the row reports transcriptStatus: "requested_languages_unavailable" with transcriptLanguage: null rather than silently substituting another language. Check availableCaptionLanguages on the same row before assuming the video simply has no transcript, and widen captionTrackTypes to "all" if you set it to manual_only.
🔽 Output sample
One JSON row per video, always with the same set of keys — null where a value doesn't apply, so exports to CSV/Excel/XML never end up with ragged columns. This is a subset of one real row, trimmed for length; the row-building code in src/main.py writes 51 top-level keys.
{"id": "dQw4w9WgXcQ","video_id": "dQw4w9WgXcQ","type": "video","status": "ok","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Example talk","description": "In this talk...","published_date": "2024-03-11","relativeDate": "1 year(s) ago","duration_seconds": 812,"views": 1284533,"likes": 20114,"comment_count": 842,"engagement_rate": 0.0165,"tags": ["ted", "talk"],"hashtags": ["#ai"],"thumbnails": {"default": "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg","high": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"},"category": "Education","language": "en","live_status": "not_live","upload_type": "normal","resolution": "1920x1080","age_limit": 0,"availability": "public","channel_id": "UCabc123","channel_name": "Example Channel","channel": {"id": "UCabc123","name": "Example Channel","handle": "examplechannel","url": "https://www.youtube.com/@examplechannel","subscriberCount": "1200000 subscribers","followerCount": 1200000,"logo": ["https://yt3.ggpht.com/..."],"badges": ["Verified"],"description": "Ideas worth spreading.","joined": "Oct 1, 2006","country": "US","links": [{"title": "Website", "url": "https://example.com"}]},"transcriptStatus": "ok","transcriptLanguage": "en","transcriptLanguageName": "English","transcriptTrackType": "manual","transcriptIsMachineTranslated": false,"transcriptLanguageCount": 2,"requestedTranscriptLanguages": ["en", "es"],"missingTranscriptLanguages": [],"availableCaptionLanguages": [{"language": "en", "languageName": "English", "trackType": "manual"},{"language": "es", "languageName": "Spanish", "trackType": "auto_translated"}],"availableCaptionLanguageCount": 160,"transcriptWordCount": 812,"transcriptCharacterCount": 4318,"transcriptCoveragePercent": 99.8,"transcript": [{"start": "13.290", "dur": "3.700", "text": "Hear that?"}],"transcripts": [{"requestedLanguage": "en","language": "en","languageName": "English","trackType": "manual","isMachineTranslated": false,"isExactLanguageMatch": true,"entryCount": 128,"wordCount": 812,"characterCount": 4318,"text": "Hear that? That's nothing...","entries": [{"start": "13.290", "dur": "3.700", "text": "Hear that?"}]},{"requestedLanguage": "es","language": "es","languageName": "Spanish","trackType": "auto_translated","isMachineTranslated": true,"isExactLanguageMatch": true,"entryCount": 128,"wordCount": 790,"characterCount": 4260,"text": "¿Oyes eso? No es nada...","entries": []}],"summary": "A short overview of the talk in Spanish.","long_summary": "## Overview\n\nDetailed Markdown summary...","summary_source": "transcript","summaryLanguage": "es","summaryLanguageRequested": "es","aiStatus": "ok","error": null,"scrapedAt": "2026-08-15T09:14:22Z"}
The complete key list the code writes to every row: type, status, inputUrl, url, id, video_id, title, description, published_date, relativeDate, duration_seconds, views, likes, comment_count, engagement_rate, tags, hashtags, thumbnails, category, language, live_status, upload_type, resolution, age_limit, availability, channel_id, channel_name, channel, transcript, transcripts, availableCaptionLanguages, availableCaptionLanguageCount, requestedTranscriptLanguages, missingTranscriptLanguages, transcriptLanguageCount, transcriptStatus, transcriptLanguage, transcriptLanguageName, transcriptTrackType, transcriptIsMachineTranslated, transcriptWordCount, transcriptCharacterCount, transcriptCoveragePercent, summary, long_summary, summary_source, summaryLanguage, summaryLanguageRequested, aiStatus, error, scrapedAt. The default dataset view surfaces 45 of these as table columns; age_limit, availability, transcriptLanguageName, transcriptIsMachineTranslated, transcriptCharacterCount and summaryLanguageRequested are still on every row, just not in the default view — open the row in JSON view or export the full dataset to see them. Export formats: JSON, CSV, Excel, XML and HTML, from the Apify Console or the API.
🎯 How do you filter and target specific transcripts?
Language strictness vs. coverage. transcriptLanguage: "original" always returns the video's own spoken language. Requesting a specific code instead is strict — a video with no track in that language reports transcriptStatus: "requested_languages_unavailable" rather than quietly substituting a different language under the requested label, so you can trust that a populated transcript field really is in the language you asked for.
Track-type quality threshold. captionTrackTypes is the accuracy/coverage trade-off: manual_only returns only creator-uploaded subtitles (fewer languages, most accurate), manual_and_auto adds YouTube's own speech-recognition captions (no machine translation), and all also accepts YouTube's auto-translated tracks — usually the only way to get transcripts in most non-source languages, with every such track flagged trackType: "auto_translated" and isMachineTranslated: true.
Volume control. For direct links, list every videoUrls entry you want — there's no maximum-items limit in the input schema. For search-based discovery, maxVideosPerPhrase (1–50) caps how many videos each phrase in searchPhrases contributes; total volume scales with how many phrases you supply.
Three concrete targeting examples:
{ "videoUrls": ["https://youtu.be/VIDEO_ID"], "transcriptLanguage": "de", "captionTrackTypes": "manual_only" }
Only accept a German transcript if it's a genuine creator-uploaded subtitle — no machine translation.
{ "videoUrls": ["https://www.youtube.com/watch?v=VIDEO_ID"], "transcriptLanguage": "original", "additionalTranscriptLanguages": ["en", "es", "ja"] }
Keep the video's native-language transcript as the main one, and add English, Spanish and Japanese as extra tracks in the same row.
{ "searchPhrases": ["ai product launch"], "maxVideosPerPhrase": 20, "maxDurationSeconds": 900, "captionTrackTypes": "all" }
Sample 20 videos matching a topic, skipping anything over 15 minutes, accepting any caption type for maximum language coverage.
▶️ Want to try other YouTube scrapers?
| Scraper | What it extracts |
|---|---|
| ../../youtube-video-subtitles-scraper/youtube-video-subtitles-scraper-with-engagement-filters | YouTube subtitles filtered by video engagement thresholds |
| ../../Facebook-Video-Transcript-Extractor/facebook-video-transcript-extractor-by-keyword-search | Video transcripts discovered by keyword search on Facebook |
| ../../Tiktok-Scraper/tiktok-scraper-with-repost-insights-data | Short-form video metadata and repost/engagement data on TikTok |
| ../../Google-Play-Scraper/google-play-scraper-country-pricing-in-app-purchases | App listing data and per-country pricing from Google Play |
💻 How to extract YouTube data programmatically
This Actor runs as a standard Apify Actor: one authenticated API call starts the run, and structured JSON rows land in a dataset you can poll or export.
🐍 Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"transcriptLanguage": "en","additionalTranscriptLanguages": ["es"],"enableAiSummary": False,}run = client.actor("<ACTOR_ID>").call(run_input=run_input)for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["title"], row["transcriptLanguage"], row["transcriptWordCount"])
📊 Export to spreadsheets or CRM
From the Apify Console, open the run's dataset and export directly to CSV or Excel — every row shares the same keys, so title, channel_name, views, transcriptLanguage and transcriptWordCount land as consistent columns you can pivot on immediately, with summary as a ready-made description column if you enabled the AI step.
⚖️ Is it legal to scrape YouTube?
Scraping publicly available YouTube data is generally legal — video metadata, view counts and caption tracks are published by YouTube for anyone to view without logging in, which is what this Actor reads. Because rows in this dataset include channel identifiers that can be tied to an individual creator (channel_name, channel handle, subscriber count), storing and reusing that data at scale should follow GDPR/CCPA principles: keep a documented lawful basis, avoid collecting more than you need, and honor removal or correction requests. This Actor does not access private, members-only or age-restricted content, and does not scrape viewer identities or comments. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
What happens if a video is removed, private, or hasn't started streaming?
The row's status becomes "error" and error carries a plain-language reason (e.g. "This video is private, removed or not publicly available." or "This video has not started streaming yet."). Metadata fields on that row stay null rather than partially filled.
Can I get the full timestamped transcript along with the video metadata?
Yes — every ok row includes both in the same object: video/channel metadata at the top level, and the main transcript's {start, dur, text} segments in transcript (plus every requested language, each with its own entries, inside transcripts) when includeTranscriptTimestamps is true.
How accurate is the transcript text?
The Actor returns exactly the caption track YouTube publishes at request time — manual tracks are the creator's own subtitles, auto_generated is YouTube's speech recognition, and auto_translated is YouTube's own machine translation of an auto-generated track. None of these are rewritten or corrected by the Actor; accuracy depends on which track type you accept via captionTrackTypes, and every row states exactly which type it returned.
How many videos can I process per run?
There's no maximum-items cap on videoUrls/urls in the input schema — you can list as many links as you want in one run. For search-phrase discovery, maxVideosPerPhrase caps each phrase at 1–50 videos; total volume scales with how many phrases you list in searchPhrases.
How does the strict language matching work?
Requesting a specific transcriptLanguage or additionalTranscriptLanguages code is exact — the Actor checks the video's real caption index (including regional variant matching, e.g. es will accept es-419 or es-ES) and only returns a track under that requested label if a genuine match exists. If it doesn't, the language shows up in missingTranscriptLanguages instead of being silently swapped for a different one.
Does YouTube Transcript Scraper work with Claude, ChatGPT, and AI agent frameworks?
There's no MCP server documented for this Actor. It's callable as a standard Apify Actor run through the apify_client SDK or the Apify API, so any agent framework that can make an authenticated HTTP call can trigger a run and read back the resulting dataset rows.
How does YouTube Transcript Scraper compare to other YouTube caption tools?
No verified competitor listing data was available at the time this README was written, so no specific comparison is made here. What's verifiable from this Actor's own source and schema: it returns multiple transcript languages in a single row, labels every track's true provenance (manual / auto_generated / auto_translated), and refuses to substitute a different language under a requested label — check any alternative's own documentation for whether it does the same.
Can I use YouTube Transcript Scraper without a YouTube API key or developer account?
Yes. No YouTube Data API key, OAuth consent screen, or Google Cloud project is required — you only need an Apify account to run the Actor. An AI provider key is only needed if you turn on enableAiSummary; without one, every other field is still returned in full.
Conclusion
YouTube Transcript Scraper turns a list of video links, or a topic search, into consistent JSON rows of metadata, honestly-labelled multi-language transcripts, and an optional AI summary in the language you choose — without a YouTube API key, OAuth setup, or a quota to manage. It's built for content and localization teams, agencies running recurring channel or topic monitoring, market researchers sampling how a topic is covered across languages, and AI pipelines that need clean transcript text without HTML or .vtt cleanup. Paste your links or search phrases into the input above and press Start to try it.