YouTube Playlist Scraper — Public Video Metadata
Pricing
from $5.00 / 1,000 playlist video saveds
YouTube Playlist Scraper — Public Video Metadata
Extract public YouTube playlist videos in order and optionally download each one as an MP4 (360p to 4K). Returns video IDs, titles, channels, durations, thumbnails, URLs and saved file links for every playlist you supply.
Pricing
from $5.00 / 1,000 playlist video saveds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
19 days ago
Last modified
Categories
Share
What is YouTube Playlist Scraper — Public Video Metadata?
YouTube Playlist Scraper is an Apify Actor for extracting public YouTube playlist videos in order. It accepts public playlist URLs, raw playlist IDs, and watch URLs that include a list= parameter. One dataset record corresponds to one playlist entry, and the record can include playlist identity, video ID, video URL, title, position, channel name, duration, thumbnail URL, view count text, publication text, playability, source route, and scrape timestamp. The outcome is a structured dataset that is ready for exports, enrichment, and downstream automation.
Download playlist videos as MP4
Turn on Download videos as MP4 (downloadVideos: true) to also save every playable playlist video as an MP4 file in the run's key-value store. Each row then gets downloadStatus (downloaded, failed or not_requested), videoFileUrl (link to the saved MP4), fileSizeBytes, videoWidth, videoHeight, downloadRoute (direct, datacenter or residential) and downloadError.
Choose the quality with videoQuality (360p, 480p, 720p, 1080p or best, up to 4K when the source has it; default 720p) and skip very large files with maxFileSizeMb (default 500). Downloads try a direct connection first, then a datacenter proxy, then a residential proxy, so music videos and label uploads download too. Leave the option off for a fast metadata-only run.
Best fit and connected workflows
This Actor fits workflows that start with a public YouTube playlist and end with structured metadata you can reuse elsewhere.
Common routing patterns:
- Course and curriculum inventories, where each playlist item becomes one row for review or export.
- Content research, where playlist order and public metadata help organize a channel series or editorial archive.
- Competitor research, where a public series can be mapped into titles, channels, durations, and source URLs.
- Workflow chains, where this Actor supplies video rows to another public YouTube enrichment step.
For example, you can run this Actor first, then send the returned public video records to YouTube Comments Scraper (with Replies) when your next step is to review public discussion around a returned video record.
Practical scenario
Maya is organizing a training library. She starts with a public playlist URL for a course series and sets maxResults to 25.
The Actor returns rows with fields such as:
playlistTitlepositiontitlechannelNamedurationTextvideoUrlthumbnailUrlisPlayable
Maya sees the playlist order, the channel name for each video, and the canonical watch URLs. She uses that table to decide which videos to copy into her internal content tracker, then sends the selected video URLs into a separate enrichment workflow.
Input
Pass public YouTube playlist URLs, raw playlist IDs, or watch URLs that include list=.
| Field | Type | Description |
|---|---|---|
playlists | array of strings | Public YouTube playlist URLs or raw playlist IDs to extract. The Actor deduplicates entries. |
maxResults | integer | Maximum number of validated playlist-video rows saved across the whole run. Range: 1 to 500. Default: 25. |
includeUnavailable | boolean | Includes playlist entries that YouTube publicly labels as private, deleted, or unavailable when they are present in the public response. Default: false. |
Focused input example
{"playlists": ["https://www.youtube.com/playlist?list=PL590L5WQmH8fJ54F369BLDSqIwcs-TCfs"],"maxResults": 25,"includeUnavailable": false}
Output
Each dataset row represents one public playlist entry in playlist order.
| Field | Type | Description |
|---|---|---|
playlistId | string | Public YouTube playlist identifier from the input URL. |
playlistUrl | string | Canonical public playlist URL. |
playlistTitle | string or null | Public playlist title when YouTube returns it. |
playlistOwnerName | string or null | Public playlist owner or channel name when returned. |
videoId | string or null | YouTube video ID; null for an unavailable entry without a public video ID. |
videoUrl | string or null | Canonical watch URL including the source playlist when the entry is playable. |
title | string | Visible playlist-entry title. |
position | integer or null | One-based position shown in the public playlist when returned. |
channelName | string or null | Visible channel name for the playlist video when returned. |
channelUrl | string or null | Public channel URL when returned. |
durationText | string or null | Visible duration such as 12:34 when returned. |
durationSeconds | integer or null | Parsed duration in seconds when the visible duration is conventional. |
thumbnailUrl | string or null | Largest public thumbnail URL returned for the entry. |
viewCountText | string or null | Visible view-count text when YouTube exposes it in the playlist response. |
publishedText | string or null | Visible relative or absolute publication text when returned. |
isPlayable | boolean | Whether the public playlist response exposes a usable video reference. |
source | string | Extraction route that supplied the record: the routing options listed in the input schema. |
scrapedAt | string | ISO 8601 time at which the row was normalized. |
Illustrative output record
{"playlistId": "PL590L5WQmH8fJ54F369BLDSqIwcs-TCfs","playlistUrl": "https://www.youtube.com/playlist?list=PL590L5WQmH8fJ54F369BLDSqIwcs-TCfs","playlistTitle": "Year in Search","playlistOwnerName": "Google","videoId": "KIViy7L_lo8","videoUrl": "https://www.youtube.com/watch?v=KIViy7L_lo8&list=PL590L5WQmH8fJ54F369BLDSqIwcs-TCfs","title": "2016 - Year in Search","position": 1,"channelName": "Google","channelUrl": "https://www.youtube.com/@Google","durationText": "2:01","durationSeconds": 121,"thumbnailUrl": "https://i.ytimg.com/vi/KIViy7L_lo8/hqdefault.jpg","viewCountText": null,"publishedText": null,"isPlayable": true,"scrapedAt": "2026-07-22T00:00:00.000Z"}
How it works
This Actor normalizes public playlist-video records into a single dataset schema.
Implementation facts from the live contract:
- The primary route uses the primary data provider public playlist endpoint when the owner-managed key secret is configured.
- If that provider route is unavailable, the Actor can use YouTube's public playlist payload and continuation tokens.
- Both routes are normalized into the same output structure.
- With
downloadVideoson, each playable video is fetched with yt-dlp and saved as an MP4 in the run's key-value store. - The
sourcefield identifies the route that supplied each record. - The Actor writes public playlist-video records to the dataset and also stores terminal state, counts, source routing, and billing telemetry in
OUTPUTandRUN_SUMMARY.
Pricing
This Actor uses Pay per event pricing, plus Apify platform usage when applicable in the live account configuration. The pricing tab in the Apify console shows the live pricing details.
Billing events from the actor contract:
- Actor start: one event after valid playlist input is accepted and before public data requests begin.
- Playlist video saved: one event for each validated public playlist-video row persisted to the dataset.
Downloading videos adds no extra event charge; the extra compute and proxy traffic appear as Apify platform usage on your run. A simple event-count example in words: if a run starts and saves twenty-five playlist videos, it includes one start event and twenty-five saved-video events. Check the live Pricing tab for the current charge summary before running.
Use with AI agents (MCP)
This Actor is usable through Apify MCP as a tool for retrieving structured public playlist metadata.
Tool description: fetch ordered public YouTube playlist rows and return public metadata for each playlist entry, including video identity, channel context, duration, thumbnails, and source URL fields.
Exact Actor identity: khadinakbar/youtube-playlist-scraper
Extract the public videos from this playlist in order. Use the returned rows to build a clean list of titles, channels, durations, thumbnails, and watch URLs for downstream analysis. Keep the run focused on this public playlist and return the dataset items for review.
Output interpretation:
resultspoints to the dataset items with validated playlist-video rows.runSummaryprovides counts, source routing, and billing telemetry.outputis the compact terminal outcome record for machine use.sourcetells you whether a row came from the routing options listed in the input schema.scrapedAtrecords when the row was normalized.
Provenance and scope:
- The Actor works with public playlist data.
- One record equals one playlist entry.
- Unavailable public entries can be included when YouTube exposes them in the playlist response and
includeUnavailableis enabled. - Pagination is handled by the Actor; the
maxResultsinput caps the total number of saved rows across the whole run. - Cost control comes from the
maxResultscap, which limits the number of saved rows.
API example
import { ApifyClient } from "apify-client";const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const run = await client.actor("khadinakbar/youtube-playlist-scraper").call({playlists: ["https://www.youtube.com/playlist?list=PL590L5WQmH8fJ54F369BLDSqIwcs-TCfs",],maxResults: 25,includeUnavailable: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Best results and outcome guidance
Use complete public playlist URLs or raw playlist IDs for the cleanest input. When you only need the core playlist inventory, keep includeUnavailable set to its default value. When you are reviewing public playlist order, use the position field together with title and videoUrl. When you are planning follow-up enrichment, videoId, channelName, thumbnailUrl, and source provide a practical handoff set.
Continue the workflow
- Then use YouTube Search Scraper — Videos, Channels, Playlists & Filters to extend YouTube Playlist Scraper — Video Metadata research with a complementary discovery contract.
- Then use YouTube Shorts Scraper — Titles, Views, Hashtags, Transcripts & Viral Score to extend YouTube Playlist Scraper — Video Metadata research with a complementary content contract.
Design note
I found that the dataset view is intentionally centered on playlistTitle, position, title, channelName, durationText, videoUrl, isPlayable, source, and scrapedAt, which makes the table view directly useful for ordered playlist review.
FAQ
Can I pass a watch URL instead of a playlist URL?
Yes. The input accepts watch URLs when they include a list= parameter, along with public playlist URLs and raw playlist IDs.
What does one dataset row mean?
One row represents one public playlist entry, in playlist order, with metadata normalized into the output schema.
Which fields are most useful for downstream workflows?
For most workflows, title, videoUrl, channelName, durationText, thumbnailUrl, position, and source are the most immediately useful.
How does this Actor connect to comment research?
Use this Actor first to collect public playlist video URLs, then route the returned records into YouTube Comments Scraper (with Replies) when you want comments for selected videos.
How can I keep the run focused?
Set maxResults to the number of rows you want to save across the whole run. The cap applies to the run total.
Responsible use
Downloaded videos belong to their creators: reuse them only where you own the rights, have permission, or another legal basis applies.
Use only public YouTube playlist metadata in line with applicable law, platform terms, and privacy expectations. Keep usage focused on public research, exports, and automation workflows that work with visible playlist data.