Youtube Playlist Scraper (Transcript & Subtitles) avatar

Youtube Playlist Scraper (Transcript & Subtitles)

Pricing

$14.99/month + usage

Go to Apify Store
Youtube Playlist Scraper (Transcript & Subtitles)

Youtube Playlist Scraper (Transcript & Subtitles)

This YouTube Playlist Extractor gathers complete playlist data—video links, titles, stats, thumbnails, and more. Great for creators, analysts, educators, and marketers who need organized video lists for reports, automation, or content planning.

Pricing

$14.99/month + usage

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

1

Bookmarked

39

Total users

1

Monthly active users

3 days ago

Last modified

Share

YouTube Playlist Scraper — Video Transcripts, Captions & Metadata

Youtube Playlist Scraper (Transcript & Subtitles) walks every video in a YouTube playlist or channel and returns each one as typed JSON — title, duration, view count, channel and playlist metadata, plus the video's caption track as a plain-text transcript with language, an auto/manual flag, and optional timestamped segments. Unlike scraping frameworks that return raw HTML, it returns structured JSON ready for your model, your database, or your pipeline, with no parsing step in between. This guide documents every input and output field, how caption-track selection actually works under the hood, and three concrete ways teams run it in production — enrichment, monitoring, and bulk dataset builds.

🧭 What Does Youtube Playlist Scraper (Transcript & Subtitles) Do?

Youtube Playlist Scraper (Transcript & Subtitles) accepts one or more YouTube playlist URLs (including a bare ?list= query string) or channel @usernames, and walks every video it finds on that playlist page. For each video it builds a metadata row — id, title, URL, duration, view count, channel, and playlist context — and, when transcript fetching is on, attaches the video's caption track as plain text, its language code, whether it was auto-generated, and the full catalogue of caption languages available for that video. No YouTube account or login is required: the Actor reads the public playlist page and the public caption (timedtext) endpoint directly, the same way a signed-out browser would.

  • 🎬 Full playlist walk — every video's videoId, title, videoUrl, duration and viewCount
  • 📝 Caption-track transcript as plain text, joined from every caption cue in order
  • 🌐 Preferred-language selection with automatic fallback to the best available track
  • 🙋 Manual-vs-auto-generated caption preference, with a flag on which one you actually got
  • 🈳 A catalogue of every caption language available for the video, not just the one returned
  • ⏱️ Optional timestamped segments (start, duration) for cue-level indexing
  • 📺 Channel and playlist metadata (channel name/id/url, playlist title, owner) attached to every row
  • 🔤 Channel handles resolved automatically to that channel's /playlists page, no manual URL-building

Features & How It Compares to Other YouTube Scrapers

Core output. Every row is typed JSON, not HTML — videoId, title, videoUrl, duration, durationLabel, channel.name/channel.id/channel.url, playlistInfo.playlistTitle, and (with transcripts on) transcript, transcriptLanguage, transcriptIsAutoGenerated, transcriptAvailable, and availableCaptionLanguages. Field names stay identical whether the input was a direct playlist URL or a channel handle that resolved to one.

How it compares. The two closest listings on the Apify Store, both reviewed 2026-07-26, are fastcrawler's youtube-transcript-subtitles-scraper and george.the.developer's youtube-transcript-scraper:

FeatureYoutube Playlist Scraper (Transcript & Subtitles)fastcrawler/youtube-transcript-subtitles-scrapergeorge.the.developer/youtube-transcript-scraper
Output formatTyped JSONTyped JSONTyped JSON
Playlist/channel as first-class inputYes — playlistInputs accepts playlist URLs and @usernames nativelyNot documented — input is a url array of individual videosYes — documented to accept video, playlist, channel URLs and IDs in the same urls field
Manual-vs-auto caption preference controlYes — preferManualCaptions, with transcriptIsAutoGenerated on the rowNot documentedNot documented
Catalogue of all available caption languages per videoYes — availableCaptionLanguagesNot documentedNot documented
Proxy behaviour documentedYes — direct → datacenter → residential fallback for the playlist page; dedicated residential proxy for caption fetchesNot documentedYes — documented, but the Actor always enforces one specific proxy group (BUYPROXIES94952) regardless of the proxyConfiguration input
Pricing model (as observed on their listing)Pay-per-event (row_result); amount not published in this Actor's schema$3 per 1,000 results, pay-per-result (fastcrawler listing, reviewed 2026-07-26)$0.005 per run + $0.004 per transcript, pay-per-event (george.the.developer listing, self-dated 2026-06-17)

If your use case is feeding structured data to an LLM, the output format row is the decision-maker — HTML parsing inside an agent loop is a reliability failure mode, not a feature. All three tools clear that bar; where they differ is caption-track control and how honestly the proxy behaviour is documented.

A third listing, lume/yt-transcripts, was also reviewed 2026-07-26. Its README documents per-video timestamped snippets and toggles to return the transcript, the snippets, or both, but does not publish a pay-per-event price or a playlist/channel input mode on the page — it is scoped to individual video URLs, so it is left out of the table above rather than compared on unpublished figures.

When another tool might suit you better. George.the.developer's scraper documents a maxConcurrency parameter (1–20) and a per-run cap of up to 5,000 videos across mixed video/playlist/channel/Shorts URLs in a single input array. If your workload is a large, mixed batch of individual video URLs rather than playlist-first traversal, that documented concurrency control may fit better than walking playlists one at a time.

Youtube Playlist Scraper within the Scrapio data stack. Youtube Playlist Scraper (Transcript & Subtitles) covers playlist and channel-level video transcripts. For single-video or Shorts-focused transcript extraction outside a playlist context, or for a playlist run without transcript enrichment (publish dates and full video stats only), use the sibling Scrapio Actors named for those entities in this account — see Related Scrapers below for the exact names.

Input flexibility. The same playlistInputs array can mix full playlist URLs, bare video links carrying a ?list= parameter, and channel handles in a single run — the Actor resolves each entry independently, so a single call can walk one creator's course playlist and another creator's podcast playlist side by side. There is no separate endpoint or mode switch to configure per input type.

Why Do Developers and Data Teams Scrape YouTube Playlists?

🏢 Content and media teams paste a course, podcast, or interview-series playlist URL into playlistInputs, get back every episode's transcript alongside title and channel.name, and repurpose the spoken content into show notes, subtitles, or blog drafts without re-watching each video. Because transcriptIsAutoGenerated flags which rows are machine-transcribed, editors know exactly which transcripts need a human pass before publishing, and preferManualCaptions lets a team default to whichever human-quality track a creator already uploaded rather than settling for ASR output by default.

📊 AI training data and RAG indexing. The transcript field is the high-information text field here — full spoken content per video, ready to chunk and embed. Two concrete uses: (1) RAG enrichment, where a playlist of product tutorials or lecture series becomes a searchable knowledge base keyed by videoId and title, with playlistInfo.playlistTitle giving retrieval systems a topic-level grouping for free; (2) training-data collection, where transcriptIsAutoGenerated and transcriptLanguage let you filter to only human-captioned, single-language material before fine-tuning, and availableCaptionLanguages tells you upfront whether a multilingual version even exists before you spend a run fetching it. Every field returns as a typed primitive (string, boolean, array) — no HTML entities or markup to strip first.

📱 Competitive and market intelligence. Point the Actor at a competitor's or industry channel's playlists on a schedule and track viewCount alongside title and extractedAt across runs to see which topics and formats are gaining traction, or diff availableCaptionLanguages to see when a channel starts localizing into new markets.

🔬 Research and academic use. Playlists of public lectures, panel discussions, or news-channel uploads convert into a timestamped, citable text corpus — pair includeTimestamps with the resulting transcriptSegments[] to reference an exact moment in a video by start time. Scope is limited to what YouTube has already made public; the Actor does not access private or unlisted playlists.

🎥 Product and SaaS development. Video-search, chapter-generation, and content-monitoring products can build on transcript and transcriptSegments as a raw ingestion layer, rather than maintaining their own caption-fetching and proxy-rotation logic in-house.

🍚 Input Parameters

All eight parameters, in schema order, exactly as defined in .actor/actor.json:

ParameterRequiredTypeConstraintsDescription
playlistInputsYesarray of stringsminItems: 1, editor: stringListPlaylist URLs or @usernames to walk. Every video's caption track is fetched. Search keywords are accepted by the field but not resolved — see the caveat below.
maxVideosNointegerdefault: 10, minimum: 0, maximum: 1000Cap on videos processed per playlist. Each video triggers a caption fetch, so keep it bounded. 0 = all videos on the playlist page.
includeTranscriptNobooleandefault: trueAttaches transcript, transcriptLanguage, transcriptIsAutoGenerated, transcriptAvailable, and availableCaptionLanguages to each row. When off, only the base video fields are returned.
transcriptLanguageNostringdefault: "en", editor: textfieldISO language code of the caption track to prefer (e.g. en, es, de). Falls back to the best available track if that language has no captions.
preferManualCaptionsNobooleandefault: trueWhen on, human-written caption tracks are chosen over auto-generated (ASR) ones where both exist. transcriptIsAutoGenerated tells you which you got.
includeTimestampsNobooleandefault: falseAlso emits transcriptSegments[]{text, start, duration} per caption cue. When off, the field is left out of the row entirely rather than set to null.
includeVideoDetailsNobooleandefault: trueWhen on, each row includes the full base fields (thumbnail, videoInfo, durationLabel, channel, playlist metadata, extractedAt). When off, a slim row is pushed instead — see Output Format below.
proxyConfigurationNoobjecteditor: proxy, prefill {"useApifyProxy": false}Optional. Read the caveat below — this input does not directly steer which proxy is used on a fallback.

Example input:

{
"playlistInputs": [
"https://www.youtube.com/playlist?list=PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw",
"@AnthropicAI"
],
"maxVideos": 25,
"includeTranscript": true,
"transcriptLanguage": "en",
"preferManualCaptions": true,
"includeTimestamps": false,
"includeVideoDetails": true,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Supported URL types and input formats

playlistInputs accepts three real shapes, read straight from src/main.py:

  1. A full playlist URL, e.g. https://www.youtube.com/playlist?list=PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw — used as-is.
  2. Any URL carrying a ?list= query parameter, e.g. a shared video link https://www.youtube.com/watch?v=…&list=PL… — the Actor parses out the list parameter and rebuilds the canonical playlist URL.
  3. A channel handle, with or without the leading @ (e.g. @AnthropicAI or AnthropicAI) — resolved internally to that channel's https://www.youtube.com/@handle/playlists page, and every playlist found there is processed in turn.

A bare keyword (not a URL and not recognized as a handle) is accepted by the field's type but is not resolved to any search results — the run logs a warning and returns no videos for that input. Treat playlistInputs as URLs and handles only.

📦 Output Format

Output is a flat JSON row per video, pushed to the run's default dataset in real time as each video is processed (not batched at the end). The dataset's default view shows 13 of these fields as table columns — videoId, title, videoUrl, duration, transcriptAvailable, transcriptLanguage, transcriptIsAutoGenerated, transcript, availableCaptionLanguages, viewCount, channel.name, playlistInfo.playlistTitle, extractedAt — but the underlying row carries more than the view shows. Every field below comes from the row-building code in src/extract_playlist.py and src/transcript.py, not just the view.

Full row (includeVideoDetails: true, includeTranscript: true, includeTimestamps: true):

{
"thumbnail.url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"title": "Building a RAG Pipeline From Scratch",
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"videoId": "dQw4w9WgXcQ",
"duration": "14:32",
"durationLabel": "14 minutes, 32 seconds",
"isPlayable": true,
"channel": {
"name": "AI Engineering Academy",
"id": "AIEngineeringAcademy",
"url": "https://www.youtube.com/@AIEngineeringAcademy"
},
"videoInfo": "245K views • 2 years ago",
"playlistInfo": {
"playlistId": "PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw",
"playlistUrl": "https://www.youtube.com/playlist?list=PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw",
"playlistTitle": "RAG Engineering Course",
"playlistDescription": "A full walkthrough of retrieval-augmented generation.",
"lastUpdated": null,
"owner": "AI Engineering Academy",
"videoCount": 10,
"totalVideosInPlaylist": 0,
"totalDuration": "58 minutes",
"totalDurationMinutes": 58
},
"extractedAt": "2026-07-26T09:41:12.000000Z",
"viewCount": "245K views",
"transcript": "Welcome to this tutorial on building a retrieval-augmented generation pipeline. Today we'll cover vector databases, embedding models, and chunking strategies.",
"transcriptLanguage": "en",
"transcriptIsAutoGenerated": false,
"transcriptAvailable": true,
"availableCaptionLanguages": [
{ "language": "English", "languageCode": "en", "isAutoGenerated": false, "isTranslatable": true },
{ "language": "English (auto-generated)", "languageCode": "en", "isAutoGenerated": true, "isTranslatable": true },
{ "language": "Spanish", "languageCode": "es", "isAutoGenerated": false, "isTranslatable": true }
],
"transcriptSegments": [
{ "text": "Welcome to this tutorial on building a retrieval-augmented generation pipeline.", "start": 0.0, "duration": 4.2 },
{ "text": "Today we'll cover vector databases, embedding models, and chunking strategies.", "start": 4.2, "duration": 4.6 }
]
}

Slim row (includeVideoDetails: false, transcript fields still merged on top when includeTranscript: true):

{
"videoId": "dQw4w9WgXcQ",
"title": "Building a RAG Pipeline From Scratch",
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"duration": "14:32",
"viewCount": "245K views",
"channel": { "name": "AI Engineering Academy" },
"playlistInfo": { "playlistTitle": "RAG Engineering Course" },
"transcript": "Welcome to this tutorial on building a retrieval-augmented generation pipeline...",
"transcriptLanguage": "en",
"transcriptIsAutoGenerated": false,
"transcriptAvailable": true,
"availableCaptionLanguages": [ { "language": "English", "languageCode": "en", "isAutoGenerated": false, "isTranslatable": true } ]
}

Two field-level details worth documenting plainly:

  • transcriptSegments is omitted, not nulled, when includeTimestamps is off. The key is deleted from the row before it's pushed — it will not appear in your dataset schema at all for that run, rather than showing up as null.
  • playlistInfo.videoCount, .totalDuration and .totalDurationMinutes fall back to hardcoded defaults (10, "58 minutes", 58) when the playlist-level stats can't be parsed from the page's sidebar or legacy renderer — which, on YouTube's current page layout, is common. Treat these three sub-fields as unreliable; the per-video fields (duration, viewCount, title, etc.) are extracted fresh per video regardless and are not affected.

Schema stability and export options

Field names are stable across runs and do not change when includeTranscript, includeTimestamps, or includeVideoDetails are left at their defaults between runs — only the presence of the transcript-related keys changes with those toggles. Results are stored in the Actor's default dataset and can be exported from the Apify Console, or via the API/apify_client, as JSON, CSV, Excel, or a few other Apify-supported formats — the same export options every Apify dataset supports, not a feature specific to this Actor.

💡 Youtube Playlist Scraper Strategy Guide

Strategy 1 — Real-time enrichment pipeline. A course platform or podcast CMS holds a youtube_playlist_url per series. On new-episode detection (or on a fixed interval), trigger a run with that single URL in playlistInputs. For each pushed row, write videoId as the join key and append transcript, title, and channel.name to the corresponding CMS record as a searchable transcript field. Because rows push in real time as each video is processed, a downstream worker can start consuming from the dataset before the run finishes.

Strategy 2 — Scheduled monitoring and alerting. Run the same playlistInputs on an Apify Schedule (daily or weekly). Diff each run's dataset against the previous one on videoId to catch newly added videos, and on transcriptAvailable to catch videos that had no captions last time but do now (a channel adding captions after the fact). Alert on either delta rather than re-processing the whole playlist by hand.

Strategy 3 — Bulk dataset build. For a research or RAG corpus spanning many playlists (a full lecture catalogue, a set of competitor channels), pass the full list of exact playlist URLs — not channel handles, for the reason covered below — with maxVideos: 0 for full coverage. Each playlist in the input list is processed in sequence within the run; the Actor's internal HTTP session caps concurrent connections at 10 per playlist fetch (aiohttp.TCPConnector(limit=10) in src/main.py), which is an implementation detail of a single run, not a documented account-level concurrency limit. Aggregate the resulting dataset export to CSV or a vector store for embedding.

StrategyBest forRun patternOutput format
Real-time enrichmentCMS/course catalogs needing searchable transcriptsSingle run per new episode or playlistJSON row per video, keyed on videoId
Scheduled monitoringTracking new videos or newly-added captions over timeRecurring run via Apify Schedules on fixed playlistInputsDataset diffed by videoId / transcriptAvailable across runs
Bulk dataset buildRAG or training corpus from many playlistsOne run, exact playlist URLs, maxVideos: 0Full dataset export to CSV/JSON
ScraperWhat it extracts
Youtube-Playlist-ScraperThe base playlist walk (video id, title, duration, view count, channel, playlist metadata) without transcript enrichment
youtube-playlist-scraper-publish-dates-full-video-statsPlaylist videos enriched with publish dates and full video statistics instead of transcripts
youtube-playlist-scraper-commentsPlaylist videos enriched with their comment threads
Youtube-Shorts-ScraperShorts-specific video and metadata extraction
youtube-shorts-scraper-transcripts-captionsTranscript and caption extraction scoped to Shorts rather than playlists
youtube-video-details-scraperSingle-video metadata and statistics outside a playlist context
youtube-video-details-scraper-subtitles-translationsSingle-video subtitle and translation extraction
youtube-search-scraperDiscovers videos by search keyword — the resolution step this Actor's playlistInputs field does not perform

How to Integrate Youtube Playlist Scraper With Your Stack

Youtube Playlist Scraper (Transcript & Subtitles) works with any language or tool that can make an HTTP request against the Apify API, or with Apify's official SDKs. Both examples below call the Actor by its Apify slug — replace <YOUR_USERNAME> with the account the Actor is run under.

Python

import csv
from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run_input = {
"playlistInputs": ["https://www.youtube.com/playlist?list=PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw"],
"maxVideos": 25,
"includeTranscript": True,
"transcriptLanguage": "en",
"preferManualCaptions": True,
}
run = client.actor("<YOUR_USERNAME>/youtube-playlist-scraper-transcript-subtitles").call(run_input=run_input)
rows = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
rows.append({
"videoId": item.get("videoId"),
"title": item.get("title"),
"channel": item.get("channel", {}).get("name"),
"transcriptAvailable": item.get("transcriptAvailable"),
"transcript": item.get("transcript"),
})
with open("playlist_transcripts.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["videoId", "title", "channel", "transcriptAvailable", "transcript"])
writer.writeheader()
writer.writerows(rows)

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_API_TOKEN>' });
const run = await client.actor('<YOUR_USERNAME>/youtube-playlist-scraper-transcript-subtitles').call({
playlistInputs: ['https://www.youtube.com/playlist?list=PLObrtcm1Kw6Odq5ks2R3bbJUGVVwQF-vw'],
maxVideos: 25,
includeTranscript: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const transcripts = items.map(v => ({ videoId: v.videoId, title: v.title, transcript: v.transcript }));
console.log(transcripts);

For fire-and-forget large jobs, Apify's platform-level Schedules and run-finished webhooks work with this Actor without any code change — attach a Schedule to re-run fixed playlistInputs on an interval, or poll client.dataset(...).iterate_items() once the run's status reaches SUCCEEDED rather than holding a connection open for the whole run.

Who Needs Youtube Playlist Scraper? (Use Cases & Industries)

🏢 Course and media platforms turn a full course or interview-series playlist into per-episode transcript text keyed by videoId, feeding an in-app transcript viewer or search box without manually captioning each upload. The same run also returns durationLabel and channel.name, so a platform can populate an episode list without a second lookup.

📊 AI and RAG teams ingest transcript and transcriptSegments from a set of domain playlists (technical talks, product demos) directly into an embedding pipeline, using transcriptIsAutoGenerated to filter for cleaner, human-captioned source text before it ever reaches a fine-tuning job.

📱 Marketing and competitive intelligence teams track a competitor's playlist over time via a Schedule, watching viewCount and title deltas per video to see which content formats are gaining traction, and availableCaptionLanguages to see when a channel expands into a new language market.

🔬 Researchers build a timestamped, citable corpus from public lecture or panel playlists, using transcriptSegments[].start to reference an exact spoken moment rather than a whole-video citation. Scope is limited to playlists YouTube has already made public.

Scraping publicly accessible web pages is generally lawful in most jurisdictions — see hiQ Labs v. LinkedIn (9th Cir. 2019) for the leading U.S. precedent on public-data scraping. What this Actor returns is public video and playlist metadata plus publicly available caption text, not private account data or content behind a login — so no personal-data framing applies the way it would for a scraper of user profiles or private messages. Separately, YouTube's Terms of Service restrict automated access to the site; violating a platform's ToS is ordinarily a civil contract matter between the scraper and the platform, not a criminal one, though the specifics depend on your jurisdiction and how the data is used. Youtube Playlist Scraper (Transcript & Subtitles) returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications, especially where a video's spoken content could itself constitute someone's copyrighted work.

❓ Frequently Asked Questions

Does Youtube Playlist Scraper work without a YouTube account? Yes. No YouTube account, Google login, or API key is required — the Actor reads the public playlist page and the public caption endpoint directly, the same content a signed-out browser would see.

What happens if a video has no captions, or captions are disabled? The row is still pushed with the base video fields, but transcriptAvailable is set to false and transcript is null — never a faked empty string. This also covers auto-generated-only videos when preferManualCaptions is on and no manual track exists (the Actor falls back to the auto-generated track rather than returning nothing).

How does Youtube Playlist Scraper handle YouTube's anti-scraping measures? The playlist-page fetch tries a direct request first, then falls back to an Apify datacenter proxy, then to an Apify residential proxy with retries, persisting whichever proxy state worked across the rest of the run. Caption (timedtext) requests are routed through a dedicated residential proxy by default, since raw caption endpoints are increasingly gated on datacenter IPs.

Does the proxyConfiguration input actually change which proxy is used? Only partially. Enabling it in the input toggles a setup step in the run log, but the playlist-page fallback ladder (direct → Apify datacenter group → Apify residential group, U.S.) and the caption-fetch proxy (always Apify residential, U.S.) are managed internally rather than driven by the group or country you set in proxyConfiguration. If you need a specific proxy group or country enforced on every request, this Actor's current proxy logic does not expose that control.

Can I run Youtube Playlist Scraper at scale without getting blocked? There's no published uptime or success-rate figure for this Actor. What's documented in the source is the retry and fallback behavior above, plus exponential backoff (up to 3 attempts) once a run is on the residential proxy tier. Larger maxVideos values mean more caption fetches per playlist, which is the main driver of run time.

What happens if I pass a channel handle (@username) instead of a playlist URL? The Actor fetches that channel's /playlists page and extracts the playlist links it finds there. Because the page's links are deduplicated through a Python set() before being capped to at most 10, and only the first 5 of those 10 are actually processed, the specific subset of playlists picked from a channel with more than 10 playlists can vary between otherwise identical runs — set ordering in Python is not guaranteed stable run to run. If you need the same playlists processed every time, pass their exact playlist URLs in playlistInputs instead of a channel handle.

How fresh is the data Youtube Playlist Scraper returns? Every run is a live fetch — there is no caching layer. extractedAt is stamped at the moment each video is processed, not read from a stored snapshot.

Which fields work best for AI training and RAG indexing? For RAG, transcript (the full spoken text) and transcriptSegments[].text (for cue-level chunking with a start offset) carry the most useful information. For training data, transcriptIsAutoGenerated and transcriptLanguage are the fields with the most consistent structure across every row — useful for filtering to a clean, single-language, human-captioned subset before fine-tuning. All fields return as typed primitives (string, boolean, array), so no HTML stripping or entity decoding is needed before passing them into a context window.

Does Youtube Playlist Scraper work with Claude, ChatGPT, and other AI agent tools? There is no dedicated MCP server documented for this Actor. It's callable as a standard Apify Actor run via the Apify API or apify_client/apify-client SDKs from inside any agent framework that can make an HTTP call — every response is typed JSON, ready to drop into a context window without a parsing step.

How does Youtube Playlist Scraper compare to other YouTube transcript scrapers? Against fastcrawler's and george.the.developer's listings (both reviewed 2026-07-26), this Actor is the only one of the three that treats a full playlist or channel as a first-class input alongside explicit manual-vs-auto caption preference and a per-video catalogue of available caption languages. George.the.developer's listing documents a higher single-run ceiling (up to 5,000 mixed video/playlist/channel URLs with configurable concurrency) that may suit very large mixed batches better than playlist-by-playlist traversal.

Does Youtube Playlist Scraper download the video or audio file itself? No. It fetches the playlist page's HTML and the video's public caption (timedtext) track only — never the video or audio stream. If you need the media file itself, this Actor is not the right tool; it is scoped to metadata and caption text.

What happens if I set maxVideos higher than the number of videos actually on the playlist? Nothing breaks — the Actor simply returns every video it finds on the playlist page, up to whichever is smaller: the page's own video count or your maxVideos value. There's no error for over-requesting.

Disclaimer

Youtube Playlist Scraper (Transcript & Subtitles) extracts only publicly available data from YouTube. This tool is intended for lawful use cases only. Users are responsible for complying with YouTube's terms of service and applicable data protection and copyright laws in their jurisdiction.