YouTube Playlist Scraper - Videos to JSON, No API Key
Pricing
from $16.00 / 1,000 read playlists
YouTube Playlist Scraper - Videos to JSON, No API Key
Lists up to 200 videos from a YouTube playlist (YouTube's own limit) as JSON: video ID, title, URL, channel, duration, views and publish age, with no API key. $0.02 per playlist plus $0.005 per 25 videos. Input: {"playlistUrls":["https://www.youtube.com/playlist?list=PL..."]}
Pricing
from $16.00 / 1,000 read playlists
Rating
0.0
(0)
Developer
Broke to Built
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
15 hours ago
Last modified
Categories
Share
YouTube Playlist Extractor — No API Key, Every Video, Duration
YouTube Playlist Extractor returns up to 200 videos from a public YouTube playlist (YouTube's own limit), with video ID, title, URL, channel, duration and view count, without an API key, at $0.02 per playlist plus $0.005 per 25 videos on the Apify Free plan.
- Price: $0.02 per playlist read plus $0.005 per block of 25 videos returned, on the Free plan (less on paid plans). A 19-video playlist costs $0.025. A playlist that is private, empty or errors is not charged.
- Example input:
{ "playlistUrls": ["https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"] } - Output fields:
playlistId,url,title,description,channel,videoCountReportedByYouTube,videosReturned,truncated,videos
Give it a playlist URL, get back every video the playlist exposes — video ID, title, watch URL, channel, duration in seconds, view count and publish age. One playlist or up to 50 in a single run (25 by default). No API key, no login, no browser.
What problem this solves
Getting a playlist's contents out of YouTube normally means a Data API key with a daily quota, or a scraper that breaks the next time YouTube renames a field. Both are more setup than the job deserves when all you wanted was the list of videos.
This returns the list as one JSON record, and it is built to be called by code and by AI agents rather than clicked.
Common requests this handles
Phrased the way people actually ask, so you — or an AI agent picking a tool — can match on the real requirement rather than the category name:
- "Get every video in a YouTube playlist." One record per playlist, with the videos as an ordered array carrying
position. - "YouTube playlist to JSON / CSV." Dataset export handles JSON, CSV and Excel.
- "Extract playlist videos without an API key." No YouTube Data API key, no quota units, no OAuth, no cookies.
- "Get video IDs and URLs from a playlist." Both are on every row; the watch URL is built from the ID so it is always valid.
- "How long is this playlist in total?" Every video carries
durationSecondsas a number — sum the column. - "Bulk: read a list of playlists at once." Pass up to 50 playlist URLs (set
maxPlaylists; the default is 25); each becomes its own record, and a playlist that fails does not stop the others. - "Feed a playlist into a transcript or summarisation pipeline." The output is the input list for our YouTube Transcript Extractor and YouTube Comments Scraper.
- "Get the channel name for each video in a playlist." Resolved even when YouTube omits it from the row (see below).
Input
| Field | Type | Required | What it does |
|---|---|---|---|
playlistUrls | string[] | yes | Playlist URLs, watch URLs containing list=, or bare playlist IDs |
maxVideos | number | no | Stop after this many videos per playlist (default 200, YouTube's own ceiling) |
maxPlaylists | number | no | Cap playlists processed per run (default 25, max 50) |
{ "playlistUrls": ["https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"] }
What you get back
One record per playlist:
| Field | Meaning |
|---|---|
playlistId, url, title, description | The playlist itself |
channel | The playlist owner |
videoCountReportedByYouTube | The total YouTube states for this playlist |
videosReturned | How many rows we actually returned |
truncated | true when more videos exist than you received |
videos[] | position, videoId, title, url, channel, durationText, durationSeconds, viewCountText, viewCount, publishedText, thumbnail |
Output copied from a real run, trimmed:
{"playlistId": "PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab","title": "Essence of linear algebra","channel": "3Blue1Brown","videosReturned": 19,"truncated": false,"videos": [{"position": 1,"videoId": "fNk_zzaMoSs","title": "Vectors | Chapter 1, Essence of linear algebra","url": "https://www.youtube.com/watch?v=fNk_zzaMoSs","channel": "3Blue1Brown","durationText": "9:52","durationSeconds": 592,"viewCountText": "12M views","viewCount": 12000000,"publishedText": "10 years ago"}]}
Honest limits
Read these before you buy — they are the things that would otherwise surprise you.
- 200 videos per playlist is YouTube's ceiling, not ours. Its listing surface stops handing out further pages at 200. Measured on a 400-plus-video podcast playlist: 100 on the first page, 100 more from one continuation, then nothing. A longer playlist comes back with
truncated: truerather than a silently short list. videoCountReportedByYouTubecan disagree withvideosReturned. YouTube counts entries in the header that its listing surface then does not hand out — usually deleted, private or region-blocked videos. Both numbers are reported so you can see the gap instead of guessing which one to trust.- View counts are as YouTube displays them.
viewCountis parsed from text like"12M views", so it carries that rounding.viewCountTextkeeps the original string. publishedTextis relative ("10 years ago"), because that is what the listing surface provides. There is no absolute publish date on this endpoint.- Private and deleted playlists return an error record, not a crash, and are never charged.
Pricing
$0.02 per playlist successfully read, plus $0.005 per block of 25 videos returned (whole blocks), on the Apify Free plan. A 19-video playlist costs $0.025; a 200-video playlist costs $0.06. Paid Apify plans pay less per event ($0.0186 and $0.00465 on Bronze, $0.0174 and $0.00435 on Silver, $0.016 and $0.004 on Gold and up).
Two events rather than one flat fee because the playlist read is fixed work and the video rows are the variable value — a flat price would either overcharge a 3-video playlist or undercharge a 200-video one. Playlists that error, or that expose no videos, are recorded and cost nothing.
Use from code or AI agents
curl -X POST "https://api.apify.com/v2/acts/eliai~youtube-playlist-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"playlistUrls":["https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"]}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("eliai/youtube-playlist-extractor").call(run_input={"playlistUrls": ["https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():for v in item.get("videos", []):print(v["position"], v["title"], v["durationSeconds"])
FAQ
Do I need a YouTube API key? No. Nothing to create, no quota to manage.
Does it work on private playlists? No — only playlists a logged-out visitor can open. Private ones return an error record and are not charged.
Auto-generated playlists (Mixes, RD…)? Those are personalised and generated per viewer, so there is no stable list to return.
Can I get transcripts too? Not from this Actor — feed videos[].videoId into YouTube Transcript Extractor.
Why is channel the same on every row? Because most playlists hold one creator's videos. YouTube omits the channel from the row in that case, so the playlist owner is filled in.
Who made this
Built by Broke to Built. Questions or a playlist that misbehaves: open an issue on the Actor page and include the URL.
Changelog
- 0.1 (2026-08-27) — first release. Parses YouTube's current
lockupViewModelplaylist rows; the previously universalplaylistVideoRendererno longer appears in playlist responses at all. Resolves the channel from the playlist owner when rows omit it, and reports YouTube's own video total alongside the number actually returned.