YouTube Playlist Scraper - Cheaper
Pricing
from $0.80 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
indexfield, 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,_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of YouTube playlist URLs or playlist IDs.
- 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). - 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"]}}
| Field | Type | Description |
|---|---|---|
playlists | array | List of YouTube playlist URLs or playlist IDs to scrape. Accepts full URLs, watch?v=...&list=... URLs, or raw playlist IDs (PLxxxx, RDxxxx, OLAKxxxx). |
maxItems | integer | Maximum number of videos returned per playlist. 0 means unlimited (fetch every video, paginating automatically). Default: 100. |
proxyConfiguration | object | Apify 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"}
| Field | Type | Description |
|---|---|---|
videoId | string | YouTube video ID (11 chars). Build the URL with https://www.youtube.com/watch?v={videoId}. |
index | string | 1-based position of the video inside the playlist. Use this to preserve the creator's ordering. |
title | string | Video title as displayed by YouTube. |
lengthSeconds | string | Total video duration in seconds. |
lengthText | string | Human-readable duration (e.g. "3:14", "1:02:33"). |
channelTitle | string | Display name of the channel that uploaded the video. |
channelId | string | Channel ID of the uploader. null for some auto-generated topic channels. |
thumbnails | array | Thumbnail variants (typically 4 sizes from 168x94 up to 336x188). Each entry has url, width, height. |
_input | string | The playlist URL or ID exactly as you supplied it. Use this to join results back to your input list. |
_playlistId | string | Normalized playlist ID extracted from the input (e.g. PL0xfS3j79Q27O1m6o5O92yxVTgtw1xEc9). |
_source | string | Internal tag for the path used to fetch the record. S1-primary is the fastest, richest path. |
_scrapedAt | string | ISO-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
| Platform | Actor | Best for |
|---|---|---|
| YouTube | YouTube Channel Scraper | Channel-level metadata + uploads feed |
| YouTube | YouTube Video Detail Scraper | Full per-video stats: views, likes, description, tags |
| Twitch | Twitch Clips Scraper | Top clips from any Twitch channel |
| Pinterest Board Scraper | All pins inside a board, with images and source links | |
| Substack | Substack Publication Posts Scraper | Full archive of posts from any Substack publication |
| Reddit Subreddit Posts Scraper | Posts from any subreddit, with comments and metadata | |
| Tumblr | Tumblr Blog Scraper | All 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: 0to 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: nullorlengthText: null— filter them downstream. - Playlist order is preserved via the
indexfield; sort your dataset byindex(as integer) to reconstruct the original order.