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
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 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.
