YouTube Playlist Scraper — Public Video Metadata avatar

YouTube Playlist Scraper — Public Video Metadata

Pricing

from $5.00 / 1,000 playlist video saveds

Go to Apify Store
YouTube Playlist Scraper — Public Video Metadata

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

19 days ago

Last modified

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:

  • playlistTitle
  • position
  • title
  • channelName
  • durationText
  • videoUrl
  • thumbnailUrl
  • isPlayable

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=.

FieldTypeDescription
playlistsarray of stringsPublic YouTube playlist URLs or raw playlist IDs to extract. The Actor deduplicates entries.
maxResultsintegerMaximum number of validated playlist-video rows saved across the whole run. Range: 1 to 500. Default: 25.
includeUnavailablebooleanIncludes 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.

FieldTypeDescription
playlistIdstringPublic YouTube playlist identifier from the input URL.
playlistUrlstringCanonical public playlist URL.
playlistTitlestring or nullPublic playlist title when YouTube returns it.
playlistOwnerNamestring or nullPublic playlist owner or channel name when returned.
videoIdstring or nullYouTube video ID; null for an unavailable entry without a public video ID.
videoUrlstring or nullCanonical watch URL including the source playlist when the entry is playable.
titlestringVisible playlist-entry title.
positioninteger or nullOne-based position shown in the public playlist when returned.
channelNamestring or nullVisible channel name for the playlist video when returned.
channelUrlstring or nullPublic channel URL when returned.
durationTextstring or nullVisible duration such as 12:34 when returned.
durationSecondsinteger or nullParsed duration in seconds when the visible duration is conventional.
thumbnailUrlstring or nullLargest public thumbnail URL returned for the entry.
viewCountTextstring or nullVisible view-count text when YouTube exposes it in the playlist response.
publishedTextstring or nullVisible relative or absolute publication text when returned.
isPlayablebooleanWhether the public playlist response exposes a usable video reference.
sourcestringExtraction route that supplied the record: the routing options listed in the input schema.
scrapedAtstringISO 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 downloadVideos on, each playable video is fetched with yt-dlp and saved as an MP4 in the run's key-value store.
  • The source field 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 OUTPUT and RUN_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:

  • results points to the dataset items with validated playlist-video rows.
  • runSummary provides counts, source routing, and billing telemetry.
  • output is the compact terminal outcome record for machine use.
  • source tells you whether a row came from the routing options listed in the input schema.
  • scrapedAt records 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 includeUnavailable is enabled.
  • Pagination is handled by the Actor; the maxResults input caps the total number of saved rows across the whole run.
  • Cost control comes from the maxResults cap, 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

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.