Youtube Video Summarizer With Multi-Language Transcripts avatar

Youtube Video Summarizer With Multi-Language Transcripts

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Youtube Video Summarizer With Multi-Language Transcripts

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

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

1

Monthly active users

4 days ago

Last modified

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 supply searchPhrases with a per-phrase result count (maxVideosPerPhrase)
  • 🌍 Multiple transcript languages in one pass — a main transcriptLanguage plus any number of additionalTranscriptLanguages, each fetched and returned separately
  • 🏷️ Honest track-type labelling — every returned transcript states whether it's a creator-uploaded manual subtitle, YouTube's own auto_generated caption, or an auto_translated machine 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:

FieldExample ValueUse 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_seconds812Length filtering, cost estimation for AI calls
views, likes, comment_count1284533, 20114, 842Popularity ranking, engagement benchmarking
engagement_rate0.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
transcriptsarray of per-language recordsMultilingual corpus building
summary / long_summaryshort overview / MarkdownContent 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.

FeatureYouTube Data API v3YouTube Transcript Scraper
Auth to fetch captionsOAuth 2.0 required for captions.list/captions.downloadNo YouTube login or API key
Multi-language transcripts in one callNot available — one language fetch per request you buildMain + 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 yourselfReturned pre-labelled as manual / auto_generated / auto_translated
AI summaryNot offered — build your own pipeline on topBuilt in, using your own AI provider key
Quota modelShared daily unit quota (captions.list = 50 units of 10,000/day)Apify pay-per-event, one charge per processed video row
SetupGoogle Cloud project, OAuth consent screen, quota request for scalePaste 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.

ParameterRequiredTypeDescriptionExample Value
videoUrlsNoarray of stringsOne YouTube video link per line — regular videos, Shorts, and youtu.be links all work["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]
searchPhrasesNoarray of stringsPhrases to look up on YouTube when videoUrls is empty["spanish news", "french lesson"]
maxVideosPerPhraseNointeger (min 1, max 50, default 2)How many videos to take from each search phrase2
transcriptLanguageNostring 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"
additionalTranscriptLanguagesNoarray of strings (enum, same 35 codes minus original, unique items)Extra languages returned alongside the main one, inside transcripts["es", "ja"]
captionTrackTypesNostring enum (default "all")all (manual + auto + auto-translated), manual_and_auto, or manual_only"all"
includeTranscriptTimestampsNoboolean (default true)On: full {start, dur, text} segments per transcript. Off: plain text and counts onlytrue
enableAiSummaryNoboolean (default false)Generate a short and a long summary from the main transcripttrue
summaryLanguageNostring enum (default "match_transcript")match_transcript or one of the 35 language codes above"es"
aiModelNostring 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"
aiApiKeyNosecret stringYour 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-..."
aiApiBaseUrlNostringCustom endpoint for a private/enterprise deployment (e.g. Azure OpenAI resource URL)""
aiModelNameNostringOverrides the aiModel dropdown with an exact model/deployment name""
maxDurationSecondsNointeger (min 0, default 0)Skip videos longer than this many seconds. 0 = no limit3600
maxRetriesNointeger (min 1, max 6, default 3)Attempts per video before the row is written with an error reason3
urlsNoarray of stringsBackward-compatible alias of videoUrls. If both are filled, videoUrls wins and urls is appended[]
proxyConfigurationNoobjectApify 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?

ScraperWhat it extracts
../../youtube-video-subtitles-scraper/youtube-video-subtitles-scraper-with-engagement-filtersYouTube subtitles filtered by video engagement thresholds
../../Facebook-Video-Transcript-Extractor/facebook-video-transcript-extractor-by-keyword-searchVideo transcripts discovered by keyword search on Facebook
../../Tiktok-Scraper/tiktok-scraper-with-repost-insights-dataShort-form video metadata and repost/engagement data on TikTok
../../Google-Play-Scraper/google-play-scraper-country-pricing-in-app-purchasesApp 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 ApifyClient
client = 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.

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.