YouTube Transcript Scraper: Merged Transcript Export avatar

YouTube Transcript Scraper: Merged Transcript Export

Pricing

$19.99/month + usage

Go to Apify Store
YouTube Transcript Scraper: Merged Transcript Export

YouTube Transcript Scraper: Merged Transcript Export

YouTube Transcript Scraper extracts full transcripts from public YouTube videos with ease. Quickly retrieve spoken content for research, summarization, SEO, or accessibility—just enter a video URL and get clean, structured text. No login or API key required.

Pricing

$19.99/month + usage

Rating

5.0

(7)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

266

Total users

0

Monthly active users

3 days ago

Last modified

Share

YouTube Transcript Scraper — Captions, Timestamps and Video Titles

YouTube Transcript Scraper: Merged Transcript Export pulls the full spoken-word transcript from any public YouTube video, or bulk-discovers videos from a channel, playlist, or keyword search first. Each result returns videoTitle, id, url, and transcripts — every caption language and format merged into one array — as clean, structured JSON with no HTML parsing and no manual copy-pasting. Open the Actor's page on Apify Store and start a run to see transcripts land in your dataset within minutes.

What is YouTube Transcript Scraper: Merged Transcript Export?

It's an Apify Actor that extracts spoken-word transcripts from YouTube videos, either one URL at a time or in bulk by expanding a channel, playlist, or search query into its videos first. No YouTube account or login is required — it reads only what a public visitor can already see. It's built for content teams, researchers, and AI/RAG engineers who need video transcript text as data rather than a video to watch.

What YouTube transcript data is publicly available to scrape?

Anyone with the video link can view a public YouTube video's captions without signing in — that's exactly what this Actor reads.

Data CategoryPublicly AvailableRestricted
Manually-created captionsYes, if uploadedNo, if never added
Auto-generated captionsYes, for most spoken videosNo — some videos lack an ASR track
Additional caption languagesYes, any track YouTube exposesLimited to tracks YouTube or the uploader provided
Video title, ID, and URLYes
Channel's uploaded videosYes, via the channel's videos page
Playlist's video listYes, via the public playlist page
Search results for a keywordYes, via the public search page
Private or unlisted videosNoRestricted — needs the direct authenticated link, not accessible to this Actor

YouTube Transcript Scraper: Merged Transcript Export only returns publicly visible data — what any visitor sees. Nothing behind a login wall.

What data can I extract with YouTube Transcript Scraper: Merged Transcript Export?

Every run returns one JSON object per video, combining discovery context with the full transcript content for that video.

Field NameDescription
idYouTube video ID
urlCanonical video watch URL
inputThe raw input value that produced this row — a URL you supplied, or a video ID discovered from a channel/playlist/search
videoTitleVideo title, captured at discovery time (channel/playlist/search modes)
typeAlways "video" in the main dataset
isChildtrue when the video was discovered from a channel/playlist/search query; false for a direct URL
discoveryModeThe mode used for the run: urls, channel, playlist, or search
containerTypedirect, channel, playlist, or search
sourceContainerThe channel URL, playlist URL, or search query this video came from (null for direct URLs)
scrapedAtISO timestamp of when the run collected this row

Transcript content

Field NameDescription
transcriptsArray holding every matching transcript track found for the video — this is the "merged" part: all languages and generation types the run was configured to include, in one field
transcripts[].languageHuman-readable transcript language/label (e.g. "English (auto-generated)")
transcripts[].languageCodeShort language code (e.g. en)
transcripts[].isGeneratedtrue if the track is YouTube's auto-generated captions, false if manually created
transcripts[].contentThe transcript text — a single string in text mode, or an array of timed cues (startMs, endMs, startTime, text) in timestamp mode
transcripts[].wordCountWord count for that transcript track
transcripts[].charCountCharacter count for that transcript track

🤖 Add-on: Need additional YouTube data?

Pair this Actor with YouTube Scraper for view counts, likes, comment counts, and full video/Shorts/channel metadata beyond transcripts. Use YouTube Channel Finder to discover channel URLs by keyword before feeding them into this Actor's channel discovery mode. For comment-level insight, YouTube Comments Scraper: AI Sentiment Analytics extracts comments alongside AI sentiment scoring.

How does YouTube Transcript Scraper differ from the official YouTube API?

YouTube Data API v3 lets you list a video's available caption tracks (captions.list), but its captions.download endpoint requires OAuth 2.0 authorization as the video's own channel owner (or a Creative Commons-licensed video) — it does not hand back transcript text for an arbitrary third-party video the way this Actor does.

FeatureYouTube Data API v3This Actor
Transcript/caption text for any public videoRequires OAuth as the video owner (or CC license)Returns transcript text directly, no ownership or OAuth needed
AuthenticationGoogle Cloud API key + OAuth for captionsNone — no YouTube account or login required
Channel/playlist video expansionplaylistItems.list / search.list, subject to Google Cloud API quotachannel/playlist discovery modes, capped by maxVideosPerContainer
Keyword searchsearch.list, quota-metered per callsearch discovery mode built in
Multi-language transcriptsTrack metadata available; downloading needs owner auth per trackincludeNonEnglishTranscripts returns any exposed language track directly
SetupGoogle Cloud project, API key, OAuth consent screenApify account, no credentials to provision

Use the official API if you already have OAuth access to your own channel's captions. Use this Actor when you need transcript text from videos you don't own, or want channel/playlist/search discovery without managing API quota.

How to use YouTube Transcript Scraper: Merged Transcript Export

Run it directly on Apify — no separate signup or API key needed beyond your Apify account.

  1. Open the Actor's page on Apify Store (scraper-engine/youtube-transcript-scraper-merged-transcript-export) and click Try for free.
  2. Add one or more links to directVideoUrls for single/multiple videos — this is the only input most runs need.
  3. Optionally set transcriptOutputFormat (text or timestamp), includeAutoGeneratedCaptions, or includeNonEnglishTranscripts to control what's returned.
  4. Start the run.
  5. Download the dataset as JSON, CSV, or Excel, or pull it via the Apify API.

How to scale to bulk YouTube transcript extraction

Set discoveryMode to channel, playlist, or search and list channel/playlist URLs in containerUrls (or keywords in searchQueries) instead of individual video links. Each entry is expanded into its own videos, capped by maxVideosPerContainer (up to 500 per container), so multiple channels or queries in one run each contribute their own batch of transcripts — no need to loop runs manually for bulk collection.

What can you do with YouTube transcript data?

  • A content strategist repurposing video into blog posts uses transcripts[].content and videoTitle to draft written articles from spoken video content without manual transcription.
  • An SEO researcher mapping a competitor's content uses transcripts[].content together with sourceContainer (a whole channel) to find topic and keyword gaps across every video at once.
  • An AI/RAG engineer building a searchable video knowledge base uses transcripts[].content, videoTitle, and id as chunk text and metadata to index videos into a vector store for retrieval-augmented generation.
  • A localization or QA team auditing caption coverage uses transcripts[].languageCode and transcripts[].isGenerated to see which languages are auto-generated versus manually created before ordering translations.
  • An archivist or educator uses discoveryMode: "playlist" to pull every lecture transcript from a course playlist into one searchable dataset instead of pasting each URL by hand.

How does YouTube Transcript Scraper handle rate limits and blocking?

The Actor routes both transcript fetches and discovery requests (channel/playlist/search page loads) through Apify Proxy, defaulting to the residential proxy group when proxyConfiguration.useApifyProxy is enabled, to reduce the chance of YouTube blocking the requesting IP. Each video is processed independently in a try/except loop, so one video that errors out (missing captions, a dead link, a parsing failure) is logged and skipped without stopping the rest of the run. Channel and search discovery follow YouTube's own pagination/continuation tokens with a bounded retry loop, so a single stuck continuation can't loop forever. The Actor does not solve CAPTCHAs — if YouTube presents one, that request will fail and get logged rather than silently retried indefinitely.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
discoveryModeNoStringHow videos are gathered: urls (default, individual links), channel, playlist, or search (bulk expansion)"channel"
containerUrlsNoArrayChannel or playlist URLs to expand, used when discoveryMode is channel or playlist["https://www.youtube.com/@GoogleDevelopers"]
searchQueriesNoArrayKeyword queries to expand into matching videos, used when discoveryMode is search["apify web scraping tutorial"]
maxVideosPerContainerNoIntegerCaps how many videos are expanded from each channel/playlist/query (default 10, 1–500)10
sortByNoStringOrder to expand discovered videos in: date (newest first, default) or popularity (most viewed first)"date"
minDurationSecondsNoIntegerSkip discovered videos shorter than this many seconds; discovery modes only (default 0 = no minimum)0
maxDurationSecondsNoIntegerSkip discovered videos longer than this many seconds; discovery modes only (default 0 = no maximum)0
minViewsNoIntegerSkip discovered videos with fewer views than this; discovery modes only (default 0 = no minimum)0
publishedAfterNoStringOnly keep discovered videos published after this date — absolute (2024-01-01) or relative (30 days, 6 months)"30 days"
directVideoUrlsNoArrayYouTube video links to extract transcripts from directly, used when discoveryMode is urls["https://www.youtube.com/watch?v=4KbrxIpQgkM"]
includeAutoGeneratedCaptionsNoBooleanInclude YouTube's auto-generated English captions when no manual English transcript existstrue
includeNonEnglishTranscriptsNoBooleanInclude transcripts in languages other than Englishfalse
transcriptOutputFormatNoStringTranscript style: timestamp (time-coded cues) or text (plain text)"text"
proxyConfigurationNoObjectProxy setup; uses Apify Residential Proxy by default when needed{"useApifyProxy": true}

Example input

{
"discoveryMode": "channel",
"containerUrls": ["https://www.youtube.com/@GoogleDevelopers"],
"searchQueries": [],
"maxVideosPerContainer": 10,
"sortBy": "date",
"minDurationSeconds": 0,
"maxDurationSeconds": 0,
"minViews": 0,
"publishedAfter": "30 days",
"directVideoUrls": ["https://www.youtube.com/watch?v=4KbrxIpQgkM"],
"includeAutoGeneratedCaptions": true,
"includeNonEnglishTranscripts": false,
"transcriptOutputFormat": "text",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

⬆️ Output

Every run writes typed, consistent JSON to the default dataset — one item per video, exportable as JSON, CSV, Excel, or via the Apify API. Each pushed row corresponds to exactly one billed row_result event; failed videos are logged and skipped, not pushed as unbilled rows.

Example output

{
"id": "4KbrxIpQgkM",
"url": "https://www.youtube.com/watch?v=4KbrxIpQgkM",
"input": "https://www.youtube.com/@GoogleDevelopers",
"transcripts": [
{
"language": "English",
"languageCode": "en",
"isGenerated": false,
"content": "Welcome back to another episode of Google Developers...",
"wordCount": 481,
"charCount": 2604
},
{
"language": "English (auto-generated)",
"languageCode": "en",
"isGenerated": true,
"content": "welcome back to another episode of google developers...",
"wordCount": 476,
"charCount": 2571
}
],
"type": "video",
"isChild": true,
"discoveryMode": "channel",
"containerType": "channel",
"sourceContainer": "https://www.youtube.com/@GoogleDevelopers",
"videoTitle": "Building with the Gemini API",
"scrapedAt": "2026-07-25T00:00:00Z"
}

How does it work?

For direct video URLs, the Actor calls the video's caption API directly to pull every matching transcript track. For channel, playlist, and search discovery, it requests YouTube's own public channel/playlist/search pages and the same internal endpoints YouTube's front end uses, parsing the embedded video listing data to find matching videos — supporting both YouTube's older and newer page-data formats so discovery keeps working as YouTube updates its UI. Discovered videos are then filtered by duration, views, and publish date before their transcripts are fetched the same way as direct URLs. Requests route through Apify Proxy to reduce blocking. Only publicly visible video and caption data is returned, and the output schema (the same set of fields per row) stays stable regardless of how YouTube's own page layout changes.

Integrations

YouTube Transcript Scraper: Merged Transcript Export runs on Apify, so it works with anything that can call an HTTP API or an Apify client library — no proprietary SDK required.

Calling YouTube Transcript Scraper: Merged Transcript Export programmatically

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("scraper-engine/youtube-transcript-scraper-merged-transcript-export").call(run_input={
"discoveryMode": "urls",
"directVideoUrls": ["https://www.youtube.com/watch?v=4KbrxIpQgkM"],
"transcriptOutputFormat": "text",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["videoTitle"], item["transcripts"][0]["wordCount"])

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

MCP integration for AI agents

This Actor is reachable through Apify's Actors MCP Server, which exposes Actors on Apify Store as callable tools for MCP-compatible clients such as Claude Desktop and Claude Code. Register it by connecting from this Actor's page in Apify Console, or by running npx @apify/actors-mcp-server configured with this Actor's store ID.

No-code tools (n8n, Make, LangChain)

In n8n, use the HTTP Request node (or the community Apify node) pointed at this Actor's run endpoint, passing directVideoUrls or containerUrls in the request body. In Make, use the Apify app's "Run Actor and get dataset items" module and map discoveryMode and containerUrls from an earlier scenario step. In LangChain, call the same Apify API endpoint from a custom Tool, or load results with the community Apify dataset loader, so an agent can pull fresh video transcripts mid-conversation.

Scraping publicly visible video transcripts is generally lawful in most jurisdictions, since this Actor only returns captions a viewer with the video's public link can already see or read on the page — nothing behind a private or members-only wall. Transcript text is typically not personal data on its own; it only becomes subject to GDPR/CCPA-style rules if the spoken content is about, or identifies, a real person (an interview, a personal vlog, named individuals discussed on camera). YouTube's Terms of Service also restrict automated data collection independent of privacy law. Consult legal counsel if your use case involves bulk storage of personal data.

Frequently asked questions

What YouTube transcript fields does this Actor return?

It returns id, url, videoTitle, and transcripts (with language, content, wordCount, and more per track) for every video, plus discovery context like discoveryMode and sourceContainer. See the data fields section above for the full list.

What does "merged" actually mean for the transcript export?

It means every available transcript track for a single video — manual captions, auto-generated captions, and any additional languages you enable — is combined into one transcripts array on that video's single output row, instead of splitting each language or caption type into its own dataset item. It does not merge multiple different videos into one document; each video always gets its own row.

Does this Actor require a YouTube account or login?

No. It only reads publicly visible video pages and caption data — no YouTube account, cookies, or session ID are needed for any input mode.

How many videos can I extract in one run?

There's no fixed cap in the input schema — direct mode processes however many links you list in directVideoUrls, and discovery mode processes up to maxVideosPerContainer (max 500) videos for each entry in containerUrls or searchQueries, so a run with multiple container entries can cover several hundred videos.

What happens if a video has no transcript available?

That video's transcripts array comes back empty rather than failing the run — the Actor logs that no caption track was found and continues to the next video, so one uncaptioned video doesn't stop the rest of the batch.

Can I scrape multiple YouTube videos at once?

Yes — list multiple links in directVideoUrls for direct mode, or use discoveryMode: "channel", "playlist", or "search" with multiple entries in containerUrls/searchQueries to bulk-expand many videos in a single run.

Does this Actor work with Claude, ChatGPT, and other AI agent tools?

Yes — it's reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude Desktop and Claude Code, and callable as a plain HTTP API by any agent framework that can make a request.

Does this Actor return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with consistent field names across runs — no HTML parsing or CSS selectors needed. Pass transcripts[].content directly to an LLM, index it into a vector store, or feed it to an agent tool.

What happens when YouTube changes its page layout?

The Actor is maintained to keep pace with YouTube's front-end changes — it already supports both YouTube's legacy and current video-listing data formats for channel, playlist, and search discovery, so the output schema stays stable even when YouTube updates its UI.

Can I use this Actor without managing proxies or browser infrastructure?

Yes — proxying (residential by default) is handled internally through proxyConfiguration, and no browser automation setup is required on your end.

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

For RAG, index transcripts[].content as the searchable text with videoTitle, id, and url as metadata for citations. For structured training data, transcripts[].wordCount, charCount, languageCode, and isGenerated return as consistent typed primitives across every record.

Scraper NameWhat it extracts
YouTube ScraperVideo, Shorts, channel, and search metadata — views, likes, comments, subscribers, duration, and more
YouTube Channel FinderDiscovers YouTube channels by keyword or URL
YouTube Comments Scraper: AI Sentiment AnalyticsVideo comments enriched with AI-driven sentiment analysis

Your feedback

Found a bug or missing a field? Let us know so we can fix it. Reach out through the Actor's Issues tab on Apify Console, or contact Scraper Engine support directly — active maintenance keeps this Actor working as YouTube changes.