YouTube Playlist Scraper - Videos in a Playlist avatar

YouTube Playlist Scraper - Videos in a Playlist

Pricing

from $0.38 / 1,000 videos

Go to Apify Store
YouTube Playlist Scraper - Videos in a Playlist

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

Dami's Studio

Maintained by Community

Actor 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.

InputPlaylist links, or bare PL, UU, OL, RD, FL, LL ids
OutputOne row per video: id, title, watch link, uploader name and id, views, age and runtime as YouTube prints them, thumbnail
Ceiling5,000 videos per run
Account neededNone
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 getField
The 11 character video id and the watch linkvideoId, url
Titletitle
The video's own uploaderchannelName, channelId
Views, as YouTube prints themviewCountText
How long ago it went uppublishedTimeText
RuntimelengthText
The largest thumbnail on offerthumbnail
Always playlist here, so rows merge with the other YouTube scrapersmode

▶️ How to scrape a YouTube playlist

  1. Open YouTube Playlist Scraper and click Try for free.
  2. Paste links into Playlist URLs, or ids into Playlist IDs.
  3. Set Max videos. Start at 100 while you look at the output.
  4. Click Start.
  5. 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
}
FieldDefaultWhat it is
playlistUrlsnoneAny link containing ?list=. A watch link with a list parameter counts. The form opens with one example playlist.
playlistIdsnoneOr bare ids: PL, UU, OL, RD, FL, LL. Ids only: a link pasted here fails.
maxItems100Total videos across every playlist in the run, 1 to 5,000. This is also your spend cap.
notionConnector, notionParentIdnoneOptional. Write each video into a Notion database as well as the dataset.
proxyConfigurationApify defaultLeave 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"
}
FieldHow to read it
videoIdUse it as your key across runs.
channelName, channelIdThe 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.

RowHow to spot itBilled
A videook: trueyes
A diagnosticok: false and an errorCodeno

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.

CodeWhat it means
RATE_LIMITED, SERVER_ERROR, NETWORKThat playlist would not answer this run. Re-running usually clears it.
NOT_SERVEDThis video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NO_RESULTSThe run finished with nothing to show.
TIME_LIMITThe 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:

  1. Run this on the playlist and copy the url column.
  2. Paste the links into the Video URLs or IDs box of YouTube Transcript Scraper for the text of each lesson.
  3. 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 wantUse
Videos in a playlistThis one
A channel's uploads, without finding its playlist idYouTube Channel Scraper
Keyword search results, or a channel's newest uploadsYouTube Scraper
Transcripts for a whole channel or playlist in one runYouTube Transcript Bulk Scraper
What a video says, as text, SRT and VTTYouTube Transcript Scraper
Comments under a videoYouTube Comments Scraper
The video, its audio or its subtitles as a fileYouTube 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.

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.