YouTube Playlist Scraper — Videos, Views & Changes
Pricing
from $0.40 / 1,000 videos
YouTube Playlist Scraper — Videos, Views & Changes
Scrape YouTube playlists: every video with title, channel, length, views and age, plus the playlist's own title, owner, video count and last update. Run it again or on a schedule to see which videos were added, removed or moved since the last run. Links or IDs, up to 5,000 videos each. No login.
Pricing
from $0.40 / 1,000 videos
Rating
0.0
(0)
Developer
Northbell
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Give it a list of YouTube playlists — youtube.com/playlist?list=… links, any link that contains list=…, or playlist IDs — and get every video in playlist order: position, title, channel, length, views and age, plus one summary row per playlist (owner, video count, total views, last update). $0.50 per 1,000 videos, no login, no API key.
Run it again — or put it on a daily schedule — and the rows also tell you what changed since the last run: which videos are new (isNewSinceLastRun), which were removed (removedSinceLastRun on the summary row) and how far each video moved up or down (positionChange). YouTube only shows you today's list; this keeps the previous one for you.
What you get
One free playlist summary row per playlist, then one playlist-video row per video.
| Field | What it is |
|---|---|
playlistId, url, title, input | the playlist, and the link or ID you gave |
ownerChannelName, ownerChannelId, ownerChannelHandle | the channel that owns the playlist (ownerChannelHandle is e.g. @freecodecamp) |
videoCount | the number of videos YouTube shows on the playlist page (2,331 videos → 2331) |
views, viewsText | on the summary row: the playlist's own view count as YouTube shows it |
lastUpdatedText | YouTube's wording: Last updated on Apr 17, 2023 or Updated today |
videosRead, complete | how many videos were read, and whether that is the whole playlist (false when the run stopped at Max videos per playlist, when YouTube stopped answering, or when YouTube returned fewer videos than the playlist page counts) |
hiddenUnavailableVideos | how many videos YouTube hides from the list because they are private or deleted (0 when none) |
addedSinceLastRun, removedSinceLastRun, previousRunAt | on the summary row: videos that are new since your previous run (videoId, title, position) and videos that are gone (videoId, title); null on the first run |
playlistId, playlistTitle, position | on a video row: its playlist and its place in it (1 = first) |
videoId, url, title | the video |
channelName, channelId, channelHandle | the channel that published the video (gaps are filled from the playlist's owner and the other rows of the same channel) |
duration, durationSeconds | length as shown (3:26:43) and in seconds |
views, viewsText | on a video row: views as the playlist shows them — rounded by YouTube above 999 (1.4M views → 1400000) |
publishedAgo | YouTube's relative wording (4 years ago) |
membersOnly | true for a members-only video (YouTube shows no view count for these) |
isNewSinceLastRun, previousPosition, positionChange | on a video row: true if the video was not in the previous run's list; where it was; and previousPosition − position, so positive = moved up (null on the first run) |
observedAt, type | when it was read, and playlist, playlist-video or error |
Use it for
- Catalog and course exports — every video of a course, series or channel list with length, views and age in one table, ready for Sheets or your BI tool
- Monitoring new uploads — schedule it daily on a competitor's playlist or a channel's Uploads list and filter
isNewSinceLastRun = trueto get just the new videos - Playlist upkeep —
removedSinceLastRunandhiddenUnavailableVideosshow videos that were taken out, deleted or made private - Feeding other tools — pass the
videoIds to a video-level scraper for exact views and likes
Input
{ "playlists": ["https://www.youtube.com/playlist?list=PLWKjhJtqVAbleDe3_ZA8h3AO2rXar-q2V", "PLBCF2DAC6FFB574DE"], "maxVideosPerPlaylist": 200 }
The previous list of each playlist is remembered in a named key-value store in your Apify account, so the second run of the same Actor already shows changes. Schedule it (Apify → Schedules) for a history. Up to 200 playlists per run and 5,000 videos per playlist; a long playlist takes one request per 100 videos.
To list all uploads of a channel, use its Uploads playlist: take the channel ID (UCxxxxxxxx…) and change the first two letters to UU (UUxxxxxxxx…). UULF… lists only its long videos, UULV… only its live streams and UUSH… only its Shorts (title and views only, see Notes).
Pricing
$0.50 per 1,000 videos, plus $0.01 per run. The playlist summary rows and the error rows (private, deleted or mistyped playlists) are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.
Notes
- Public data only: what anyone sees on a playlist page without signing in. Video descriptions and comments are not read, and email addresses are removed from titles and channel names.
- Private playlists, Liked videos, Watch later and YouTube Mixes (IDs starting with
RD) cannot be read and come back as a free error row. - YouTube hides private and deleted videos from a playlist, so
videosReadcan be lower thanvideoCount;hiddenUnavailableVideossays how many are hidden.positioncounts the videos that are listed (1 = first), so it has no gaps. viewsis empty when YouTube shows no view count for the video, which is what it does for members-only videos (membersOnly: true).durationanddurationSecondsare empty when YouTube shows no length on the thumbnail.channelHandleis empty when YouTube does not show the channel's@handleanywhere in the playlist page or no other row of that channel has it.- A channel's Shorts list (
UUSH…) is laid out differently by YouTube: YouTube returns at most the first 100 of them, socompleteisfalsewhen the list is longer, and each row has onlyvideoId,titleandviews.channelName,channelId,channelHandle,durationandpublishedAgoare empty there (the owner is on the summary row). - A video made by several channels together shows them as "Collaborators" on YouTube. The channel fields describe the first one listed, which is the channel that uploaded it.
viewson the summary row is the number YouTube shows for the playlist page itself. For a channel's Uploads list that is not the channel's total views.- Changes since the last run: a video is new (
isNewSinceLastRun: true) when it was not in the list the previous run read.removedSinceLastRunis only filled when this run read the whole playlist (complete: true), because videos below the limit may still be there. When the previous run stopped at the limit, videos deeper than it read getisNewSinceLastRun: nullinstead of a guess; within that depth, a video that was moved up from below the previous limit looks new. Titles inremovedSinceLastRunare the first 120 characters. Raise Max videos per playlist to read everything. - If YouTube shows videos on a playlist page but none can be read from it (for example after a layout change), you get a free error row instead of an empty "complete" list.
- If YouTube stops answering in the middle of a long playlist, you keep the videos already read, get a free error row saying where it stopped, and the stored list from the previous run stays as it was.
- If YouTube stops answering or asks for a sign-in several times in a row, the Actor stops waiting and returns the remaining playlists as free error rows; run it again later.
To get exact views and likes for single videos, see YouTube Video Stats Tracker. To track a whole channel (subscribers, total views, upload rhythm), see YouTube Channel Stats & Growth Tracker.
For AI agents
{"playlists": ["PLWKjhJtqVAbleDe3_ZA8h3AO2rXar-q2V"], "maxVideosPerPlaylist": 50} returns one playlist row (title, owner, videoCount) followed by one playlist-video row per video with position, title, channelName, duration and views. Rows have type: playlist, playlist-video or error. Pass several playlists in one call to pay the run fee once.