YouTube Playlist Scraper - Videos in a Playlist
Pricing
from $0.38 / 1,000 videos
YouTube Playlist Scraper - Videos in a Playlist
Export the videos in a YouTube playlist, from a link or a bare PL or UU id. Each row has the videoId, title, watch URL, uploader, views, age, runtime and thumbnail, with views and age as YouTube prints them. Up to 5,000 videos per run. $0.40 per 1,000 videos.
Pricing
from $0.38 / 1,000 videos
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
4
Monthly active users
a minute ago
Last modified
Categories
Share
Scrape the videos in a YouTube playlist as rows: paste playlist links or bare PL and UU ids
and you get one row per video with the id, title, watch link, uploader, view count, age, runtime and
the largest thumbnail YouTube offers. It keeps paging, so a long playlist comes back in one run
rather than stopping at the first twenty.
The thing that catches people out: channelName is read off each video's own byline, not off the
playlist. A playlist collecting clips from nineteen creators gives you nineteen different channels,
which is usually what you want and occasionally not.
| Input | Playlist links, or bare PL, UU, OL, RD, FL, LL ids |
| Output | One row per video: id, title, watch link, uploader name and id, views, age and runtime as YouTube prints them, thumbnail |
| Ceiling | 5,000 videos per run |
| Account needed | None |
| Price | $0.40 per 1,000 videos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 12,500 |
🔍 What YouTube Playlist Scraper does
Anything with ?list= in it works, including a plain watch link that happens to carry a playlist
parameter. Bare ids work too, and so does a Mix. No Google API key needed.
It follows the playlist page by page to the end, or until maxItems. That number is the budget for
the whole run, not per playlist, so it is also your spend cap.
Videos are deduplicated by videoId across every playlist in the run. A video sitting in two of your
playlists is returned once and billed once.
📋 What data you get from each YouTube playlist video
| What you get | Field |
|---|---|
| The 11 character video id and the watch link | videoId, url |
| Title | title |
| The video's own uploader | channelName, channelId |
| Views, as YouTube prints them | viewCountText |
| How long ago it went up | publishedTimeText |
| Runtime | lengthText |
| The largest thumbnail on offer | thumbnail |
Always playlist here, so rows merge with the other YouTube scrapers | mode |
▶️ How to scrape a YouTube playlist
- Open YouTube Playlist Scraper and click Try for free.
- Paste links into Playlist URLs, or ids into Playlist IDs.
- Set Max videos. Start at 100 while you look at the output.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it over the Apify API.
Send at least one playlist. With nothing valid in either box, the run fails rather than returning a polite row.
💰 How much does it cost to scrape a YouTube playlist?
$0.40 per 1,000 videos on the Free plan. Paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 videos.
You pay per video row delivered. Diagnostic rows and duplicates inside a run are never billed, so a
playlist that returns nothing delivers no charged rows. maxItems is the ceiling on both the rows
and the spend.
📥 What you give it
{"playlistUrls": ["https://www.youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf"],"maxItems": 100}
| Field | Default | What it is |
|---|---|---|
playlistUrls | none | Any link containing ?list=. A watch link with a list parameter counts. The form opens with one example playlist. |
playlistIds | none | Or bare ids: PL, UU, OL, RD, FL, LL. Ids only: a link pasted here fails. |
maxItems | 100 | Total videos across every playlist in the run, 1 to 5,000. This is also your spend cap. |
notionConnector, notionParentId | none | Optional. Write each video into a Notion database as well as the dataset. |
proxyConfiguration | Apify default | Leave it alone unless you have your own servers you want the run to go out through. |
📤 What you get back
A real row from a real run, with the thumbnail link cut short:
{"ok": true,"videoId": "0VH1Lim8gL8","title": "Deep Learning State of the Art (2020)","url": "https://www.youtube.com/watch?v=0VH1Lim8gL8","channelName": "Lex Fridman","channelId": "UCSHZKyawb77ixDdsGog4iWA","viewCountText": "1.3M views","publishedTimeText": "6 years ago","lengthText": "1:27:41","thumbnail": "https://i.ytimg.com/vi/0VH1Lim8gL8/hqdefault.jpg?sqp=...","mode": "playlist"}
| Field | How to read it |
|---|---|
videoId | Use it as your key across runs. |
channelName, channelId | The video's own uploader, read off its byline. Roughly one row in a hundred arrives with no byline and these two come back blank. |
viewCountText | "1.3M views", as the playlist page renders it. The exact figure is not in it. |
publishedTimeText | "6 years ago". Relative to when the run read the page. |
lengthText | "1:27:41". Empty on a live stream or a premiere. |
🧾 Reading the output
Two kinds of row land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A video | ok: true | yes |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. A playlist that fails gets its own uncharged
diagnostic row naming the playlistId and the reason, and the run carries on to the next one.
| Code | What it means |
|---|---|
RATE_LIMITED, SERVER_ERROR, NETWORK | That playlist would not answer this run. Re-running usually clears it. |
NOT_SERVED | This video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NO_RESULTS | The run finished with nothing to show. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The videos delivered before that are in the dataset and charged as usual. Give the run more time, or ask for fewer videos, to get the rest. |
A run ends as failed only when the time limit stopped it before any video came back.
One quirk of the Overview table: it shows the video columns only, so a diagnostic row reads as a
blank line there. Open the row or download the JSON to see the errorCode.
💡 What people use it for
- Turning a course or conference playlist into a spreadsheet, then working down it.
- Pulling a channel's uploads playlist as a single ordered list.
- Collecting video links from a curated playlist for the transcript or comments actors.
- Auditing a playlist you inherited, to see which creators are actually in it.
From a course playlist to searchable notes, in three runs:
- Run this on the playlist and copy the
urlcolumn. - Paste the links into the Video URLs or IDs box of YouTube Transcript Scraper for the text of each lesson.
- Paste the same links into the Video URLs box of YouTube Comments Scraper to find the questions learners keep asking.
🚧 What it does not do
- Public and unlisted playlists only. A private playlist needs a signed-in account and will not work here.
- No exact view counts and no real dates. The strings are what the page carries. If you need integers and real dates, parse what you can and accept the rounding.
- No descriptions, likes, comments or transcripts. Those are separate actors, in the table below.
- A very long playlist can stop before its end. There is a ceiling on how far one run pages through a playlist. It sits well past most real playlists, but it is there.
- The playlist's own title and owner are not returned. Rows describe videos, not the playlist.
- Order is the playlist's order, and there is no sort option.
- Nothing valid in the input fails the run rather than returning an explanatory row.
- It is not an official YouTube tool. Dami's Studio is independent and is not affiliated with or endorsed by YouTube or Google, or by any other company named on this page.
🧭 Which YouTube scraper do you need?
| If you want | Use |
|---|---|
| Videos in a playlist | This one |
| A channel's uploads, without finding its playlist id | YouTube Channel Scraper |
| Keyword search results, or a channel's newest uploads | YouTube Scraper |
| Transcripts for a whole channel or playlist in one run | YouTube Transcript Bulk Scraper |
| What a video says, as text, SRT and VTT | YouTube Transcript Scraper |
| Comments under a video | YouTube Comments Scraper |
| The video, its audio or its subtitles as a file | YouTube Downloader Pro |
❓ Questions people ask
Do I need a YouTube or Google account?
No. Nothing here is signed in.
Is maxItems per playlist?
No, it is the total for the run. Five playlists at 100 gives you 100 rows altogether, not 500.
Why does channelName differ row to row?
Because it is the video's uploader, not the playlist's owner. On a channel's own uploads playlist they are the same thing.
Can I get a channel's videos without knowing its playlist id?
Yes, YouTube Channel Scraper takes the channel link or handle directly.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/youtube-playlist-scraper. Either way
the run happens on your Apify account at the same price.
Is scraping a YouTube playlist legal?
This reads public and unlisted playlist pages, nothing signed in. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the playlist link or id you used and the run ID, and the log is enough for us to see what happened.