YouTube Playlist Scraper - Cheaper avatar

YouTube Playlist Scraper - Cheaper

Pricing

from $0.80 / 1,000 results

Go to Apify Store
YouTube Playlist Scraper - Cheaper

YouTube Playlist Scraper - Cheaper

Enumerate every video in a YouTube playlist: title, channel, length, position. Bulk-paginated. Fast http only scraper, no cookies required

Pricing

from $0.80 / 1,000 results

Rating

0.0

(0)

Developer

Xtractoo

Xtractoo

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

YouTube Playlist Scraper

Enumerate every video inside any public YouTube playlist — title, channel, position, length, and thumbnails — in a clean structured JSON output, one row per video.

Why use this actor

  • No account / no login required — just paste a playlist URL or ID.
  • No API key needed — no YouTube Data API quotas, no OAuth, no key rotation; you get the same data the YouTube web app shows.
  • Flexible input — full URLs (https://www.youtube.com/playlist?list=...), watch-with-list URLs (watch?v=...&list=...), or raw playlist IDs (PLxxxx, RDxxxx, OLAKxxxx) are all accepted.
  • Automatic pagination — chains continuation tokens internally to walk playlists of any length, from a 10-video tutorial series to a 5,000-video music archive.
  • Preserves playlist order — every record carries its index field, so you can reconstruct the playlist exactly as the creator ordered it.
  • Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries the _input, _playlistId, _source, _scrapedAt envelope fields so you can join results back to your input list.

How it works

  1. You provide a list of YouTube playlist URLs or playlist IDs.
  2. The actor fetches the playlist, walks through every page of videos, and emits one flat JSON record per video (with videoId, title, channelTitle, position, length, and thumbnails).
  3. Results stream into your dataset, ready to download as JSON, CSV, or Excel.

You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.

Input

{
"playlists": [
"https://www.youtube.com/playlist?list=PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"PLrAXtmErZgOeiKm4sgNOknc9TTnMPEBL5"
],
"maxItems": 100,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["DATACENTER"]
}
}
FieldTypeDescription
playlistsarrayList of YouTube playlist URLs or playlist IDs to scrape. Accepts full URLs, watch?v=...&list=... URLs, or raw playlist IDs (PLxxxx, RDxxxx, OLAKxxxx).
maxItemsintegerMaximum number of videos returned per playlist. 0 means unlimited (fetch every video, paginating automatically). Default: 100.
proxyConfigurationobjectApify Proxy settings. Datacenter proxy works for most playlists; switch to residential if you hit rate limits on very large runs.

Output

Input: https://www.youtube.com/playlist?list=PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9

{
"videoId": "cMV4-xekoaY",
"index": "1",
"title": "Kay Flock - Being Honest (shot by RingRing Visuals)",
"lengthSeconds": "156",
"lengthText": "2:36",
"channelTitle": "Kay Flock",
"channelId": "UC2HMnUWiitQph86vY2VZO5Q",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/cMV4-xekoaY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB96o9AJ9v1y1K1ymRckyTpP2vyug",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/cMV4-xekoaY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLABeeJrV937NnKI3aFzBpuAsTH5RQ",
"width": 336,
"height": 188
}
// ... 2 more
],
"_input": "https://www.youtube.com/playlist?list=PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_playlistId": "PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_source": "S1-primary",
"_scrapedAt": "2026-05-18T10:43:39.481731+00:00"
}
{
"videoId": "KNexS61fjus",
"index": "2",
"title": "LE SSERAFIM (르세라핌) 'Smart' OFFICIAL MV",
"lengthSeconds": "194",
"lengthText": "3:14",
"channelTitle": "HYBE LABELS and LE SSERAFIM",
"channelId": null,
"thumbnails": [ /* ... 4 thumbnail sizes ... */ ],
"_input": "https://www.youtube.com/playlist?list=PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_playlistId": "PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_source": "S1-primary",
"_scrapedAt": "2026-05-18T10:43:39.481731+00:00"
}
{
"videoId": "Q97pvL6GsIA",
"index": "3",
"title": "날 바라바라봐 LOOK AT ME",
"lengthSeconds": "194",
"lengthText": "3:14",
"channelTitle": "TWICE",
"channelId": "UCzgxx_DM2Dcb9Y1spb9mUJA",
"thumbnails": [ /* ... 4 thumbnail sizes ... */ ],
"_input": "https://www.youtube.com/playlist?list=PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_playlistId": "PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9",
"_source": "S1-primary",
"_scrapedAt": "2026-05-18T10:43:39.481731+00:00"
}
FieldTypeDescription
videoIdstringYouTube video ID (11 chars). Build the URL with https://www.youtube.com/watch?v={videoId}.
indexstring1-based position of the video inside the playlist. Use this to preserve the creator's ordering.
titlestringVideo title as displayed by YouTube.
lengthSecondsstringTotal video duration in seconds.
lengthTextstringHuman-readable duration (e.g. "3:14", "1:02:33").
channelTitlestringDisplay name of the channel that uploaded the video.
channelIdstringChannel ID of the uploader. null for some auto-generated topic channels.
thumbnailsarrayThumbnail variants (typically 4 sizes from 168x94 up to 336x188). Each entry has url, width, height.
_inputstringThe playlist URL or ID exactly as you supplied it. Use this to join results back to your input list.
_playlistIdstringNormalized playlist ID extracted from the input (e.g. PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9).
_sourcestringInternal tag for the path used to fetch the record. S1-primary is the fastest, richest path.
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.

Error envelope

Inputs that fail to parse or playlists that cannot be reached return a structured error instead of crashing the run:

{
"_input": "PLthis-id-does-not-exist",
"_playlistId": "PLthis-id-does-not-exist",
"_error": "fetch_failed",
"_errorDetail": "playlist not found or private",
"_source": "S1-primary",
"_scrapedAt": "2026-05-18T10:44:10.012345+00:00"
}

Filter on _error to triage failed rows. Common error codes:

  • invalid_input — the string you passed isn't a recognizable playlist URL or ID.
  • fetch_failed — the playlist is private, deleted, or the request couldn't complete after retries.

Pricing

This actor is billed per result: $3.50 per 1,000 videos (Tier 3). Each video record = 1 result. Error envelopes are not billed.

Other Sosmed Actors

PlatformActorBest for
YouTubeYouTube Channel ScraperChannel-level metadata + uploads feed
YouTubeYouTube Video Detail ScraperFull per-video stats: views, likes, description, tags
TwitchTwitch Clips ScraperTop clips from any Twitch channel
PinterestPinterest Board ScraperAll pins inside a board, with images and source links
SubstackSubstack Publication Posts ScraperFull archive of posts from any Substack publication
RedditReddit Subreddit Posts ScraperPosts from any subreddit, with comments and metadata
TumblrTumblr Blog ScraperAll posts from a Tumblr blog, in order

Browse the full catalog at apify.com/xtracto.

Notes

  • Playlists with more than 5,000 videos are paginated automatically — set maxItems: 0 to fetch them all, or cap with a number to control cost.
  • Unlisted playlists work — as long as you have the URL (or the list=... ID), the actor will fetch them just like a public playlist.
  • Truly private playlists (owner-only) are not accessible and return _error: "fetch_failed".
  • "Mix" playlists (IDs starting with RD) are dynamically generated by YouTube and may return different videos on each run.
  • Region-blocked or removed videos may appear with title: null or lengthText: null — filter them downstream.
  • Playlist order is preserved via the index field; sort your dataset by index (as integer) to reconstruct the original order.