YouTube Playlist Scraper: a hundred videos a query
YouTube Playlist Scraper reads a public YouTube playlist and returns every video in it, each with numeric views and likes, its duration in seconds, and the channel that uploaded it.
Free Apify plan: 5 runs a month, 10 items a run. No credit card.
- $0.05
- per playlist queried
- 100
- videos included, the largest here
- $0.0005
- per video after
- 99.85%
- run success, last 30 days
Read on 27 September 2026.
A list you know, or a list you are looking for
Seven inputs, two of which cost money, and they cost the same. Both carry a hundred free videos, so the choice between naming a playlist and searching for one is about what you want back rather than about price.
A hundred free videos, three times any sibling
startUrls$0.05per playlist
100 videos in
Playlist URLs. The direct route, and the one to use when the list is already chosen.
https://www.youtube.com/playlist?list=PL…keywords$0.05per search
100 videos in
Terms to find playlists with. Same fee and same allowance as naming one outright.
["python tutorial"]gl / hl / sortus / en / rthe defaults
Search only
Region, language and ordering for a keyword search. Free to set, and the listing gives r as the relevance default.
gl: "DE", hl: "de"maxItems÷ $0.0005past the free 100
Run-wide
Total videos across the run. On a course playlist of eighty this never binds. On an auto-generated mix it does.
500
Because the allowance is a hundred either way, most real playlists cost exactly one query fee and nothing else. An album, a course module or a conference track will usually come back complete for a nickel.
| Apify actor | apidojo/youtube-playlist-scraper |
|---|---|
| Inputs | startUrls · keywords · gl · hl · sort · maxItems · customMapFunction |
| Two ways in | A playlist URL or a keyword search, both at $0.05 |
| Free allowance | 100 videos on either query type |
| Always returned | id, title, url, views, likes, duration, channel.id, channel.name, thumbnails, isLive |
| Sometimes returned | description, keywords |
| Types | views, likes and duration are numbers, so nothing needs parsing |
| Reliability | 99.85% of 671 runs succeeded in the last 30 days |
A course, a shelf of them, or a search for more
Three runs. The first is the common case and usually carries no item charges at all. The other two are what you do once you have decided the format is worth studying.
How do you scrape a YouTube playlist?
Paste the playlist URL. The query is $0.05 and the first hundred videos come with it, so any list of a hundred or fewer costs exactly a nickel however long the videos are.
Input
{
"startUrls": ["https://www.youtube.com/playlist?list=PL…"],
"maxItems": 100
}$0.05=$0.05
What comes back
The video record, Ten guaranteed fields, with real numbers for views and duration.
{
"id": "lL2ZwXj1tXM",
"title": "Three Days Grace - Never Too Late",
"url": "https://www.youtube.com/watch?v=lL2ZwXj1tXM",
"duration": 211,
"views": 272272914,
"status": "OK",
"isLive": false,
"isPrivate": false
}Most playlists never reach the item rate
A hundred videos is longer than an album, longer than most course modules and longer than a conference track. If your lists are that size, the per-video price is a number you will never actually pay, and the only figure that matters is the nickel.
How do you scrape multiple YouTube playlists?
List the URLs together. Five playlists of a hundred videos each is five hundred videos for $0.25, with no item charges at all, because every playlist brings its own hundred.
Input
{
"startUrls": [
"https://www.youtube.com/playlist?list=PL…",
"https://www.youtube.com/playlist?list=PL…"
],
"maxItems": 500
}5 × $0.05=$0.25
What comes back
The channel block, Who uploaded each video, so a multi-list run stays attributable.
{
"channel": {
"id": "UCK-VRwguZP3cokOAxI0F1HA",
"name": "ThreeDaysGraceVEVO",
"url": "https://www.youtube.com/channel/UCK-VRwguZP3cokOAxI0F1HA"
}
}Nothing on a row names its playlist
The guaranteed fields describe the video and its uploader, not the list it came from. For a multi-playlist run, either submit one URL per run, which costs the same, or stamp the source yourself through customMapFunction.
Can you search for YouTube playlists by keyword?
Yes, at the same $0.05 and with the same hundred videos included. Searching is not a cheaper way in here, so use it when you genuinely do not know which lists exist rather than as a way to save money.
Input
{
"keywords": ["python tutorial"],
"gl": "us",
"hl": "en",
"maxItems": 200
}$0.05 + 100 × $0.0005=$0.10
What comes back
The conditional fields, The two the listing marks as not guaranteed.
{
"description": "Three Days Grace's official music video...",
"keywords": ["three days grace", "rock", "music", "official video"]
}Search behaves differently here than on the channel actors
On the two channel scrapers a keyword search is much cheaper than a direct lookup, fivefold in one direction. On this actor the two are identical, so a habit carried over from those pages will not save you anything.
Ten fields promised, two not
A generous availability table by this family’s standards. The engagement figures are guaranteed here, where the Channel Scraper leaves its subscriber count optional, and only the free-text fields are conditional.
3
Always present
Identity
- id, the video ID
- title
- url, the watch link
3
Always present
Typed as numbers
- views
- likes
- duration, in seconds
4
Always present
Context
- channel.id, channel.name
- thumbnails, array of sizes
- isLive, a boolean
2
Sometimes present
The free text
- description
- keywords, array of tags
id · title · url | Video ID, title and watch URL. All guaranteed |
|---|---|
views | View count as a number, ready to compare and sum directly |
likes | Like count, documented as an always-present number |
duration | Seconds as a number. Sum it across a list to get a course’s real running time |
status | Record status, shown as "OK" in the listing’s sample |
channel.id · channel.name | The uploader. Both guaranteed, which single-channel playlists make easy to verify |
channel.url | Channel link, present in the sample alongside the two guaranteed channel fields |
thumbnails | Array of sizes, each with url, width and height |
isLive | Livestream indicator, guaranteed. Filter on it before averaging anything |
isPrivate | Shown in the sample. A private entry is a video you cannot watch but still paid for |
description | Conditional, and absent often enough that a pipeline needs the guard |
keywords | Conditional array of the video’s own tags |
duration being a guaranteed number is what makes this actor useful for course auditing. Summing it across a playlist gives the real length of a curriculum, which is the question anyone evaluating training content actually asks first.
Worth knowing before the first run
Two of these come from the listing’s availability table, two from its pricing section, and one from a discrepancy inside its own output sample.
- 01
A hundred videos come free with every query
Three times what the Channel Videos actor includes and five times the Comments actor. On lists of a hundred or fewer the item rate never applies at all.
- 02
Searching costs the same as naming
Both the playlist query and the keyword search are $0.05 with a hundred videos included. There is no cheaper door here, which is not true of the two channel scrapers.
- 03
The output sample repeats one number twice
It gives views and likes as the same value, 272272914, which cannot be right for a real video. Trust the availability table, where both are typed as numbers, rather than that pair of figures.
- 04
There is no playlist position field
The listing mentions "position in playlist" in prose, but no such field appears in its output sample or its availability table. Order arrives as dataset order, not as a value you can sort on later.
- 05
Private entries still cost
isPrivate appears in the sample, so a playlist containing videos you cannot watch will still return and bill rows for them. Filter after the fact, not before.
Free accounts run in demo mode: 5 runs a month, 10 items each.
Where the hundred runs out
These are the listing’s five published scenarios plus a search, all reproducing from its two charge events. Read them together and the shape is clear: below a hundred videos a playlist is a flat nickel, and above it the item rate takes over slowly.
| Run | Method | Calculation | Cost |
|---|---|---|---|
| 100 videos | 1 playlist | $0.05 | $0.05 |
| 200 videos | 1 playlist | $0.05 + 100 × $0.0005 | $0.10 |
| 200 videos | 1 keyword search | $0.05 + 100 × $0.0005 | $0.10 |
| 500 videos | 1 playlist, deep | $0.05 + 400 × $0.0005 | $0.25 |
| 500 videos | 5 playlists | 5 × $0.05 | $0.25 |
| 1,000 videos | 5 playlists | 5 × $0.05 + 500 × $0.0005 | $0.50 |
Rows four and five are the comparison worth making. Five hundred videos cost the same whether they come from one playlist read deep or five read to their free limit, because four extra allowances of a hundred exactly offset four extra nickels. Which one you want depends on the question, not on the bill.
Who works from a curated list?
The listing names course research, content auditing and video curation. A playlist is someone else’s editorial judgement already applied, which is exactly what makes it cheaper to analyse than a whole channel.
Course and training research
One playlist
Sum duration across a curriculum to get its real running time before committing anyone to it
$0.05 per course
Content auditing
Several lists
Check a whole shelf of playlists for dead, private or livestream entries in one pass
$0.25 per 500 videos
Music and catalogue work
One playlist
Read an album or a label playlist with numeric views on every track
$0.05 per 100 tracks
Curation research
Find playlists
Search for how others have grouped a topic, at the same price as naming a list outright
$0.05 per search
Transcription pipelines
One playlist, then pivot
Collect video IDs from a list, then hand them to the Transcript Scraper
$0.05 per 100 IDs
Reading a list end to end
The actor is apidojo/youtube-playlist-scraper. Since the allowance covers most real playlists entirely, the useful patterns are about what you do with the list rather than how you page through it.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("apidojo/youtube-playlist-scraper").call(run_input={
"startUrls": ["https://www.youtube.com/playlist?list=PL…"],
"maxItems": 100, # 100 come free, so most playlists cost one query fee
})
videos = list(client.dataset(run.default_dataset_id).iterate_items())
# duration is a guaranteed number, so a curriculum's length is one sum.
watchable = [v for v in videos if not v["isLive"] and not v.get("isPrivate")]
total_min = sum(v["duration"] for v in watchable) / 60
print(f"{len(watchable)} videos, {total_min:.0f} minutes")
# description and keywords are the only conditional fields, so guard them.
tagged = [v for v in watchable if v.get("keywords")]
print(f"{len(tagged)} of {len(watchable)} carry tags")
for v in sorted(watchable, key=lambda v: v["views"], reverse=True)[:5]:
print(f"{v['views']:>12,} {v['duration']:>5}s {v['title'][:50]}")import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
// One run per playlist: the cost is identical and the provenance survives.
const lists = ['PLaaa…', 'PLbbb…'];
for (const id of lists) {
const run = await client.actor('apidojo/youtube-playlist-scraper').call({
startUrls: [`https://www.youtube.com/playlist?list=${id}`],
maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const dead = items.filter((v) => v.isPrivate);
const hours = (items.reduce((n, v) => n + v.duration, 0) / 3600).toFixed(1);
console.log(id, items.length, 'videos', hours + 'h', dead.length, 'private');
}curl -X POST \
"https://api.apify.com/v2/acts/apidojo~youtube-playlist-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":["https://www.youtube.com/playlist?list=PL…"],"maxItems":100}'Export as JSON, CSV or Excel from the Storage tab. JSON keeps the thumbnails and keywords arrays intact, and CSV is fine if all you want is the durations and view counts.
YouTube Playlist Scraper FAQ
How much does it cost to scrape a YouTube playlist?
$0.05 for the playlist query, which includes the first 100 videos, then $0.0005 each. Any playlist of a hundred videos or fewer costs exactly a nickel.
Is searching cheaper than naming a playlist?
No. A keyword search and a playlist query are both $0.05 and both include roughly a hundred videos, so the two doors cost the same.
Why is the free allowance so much bigger here?
A hundred videos per query is three times what the Channel Videos Scraper includes and five times the Comments Scraper. It means most real playlists never reach the per-video rate at all.
Are views and likes numbers?
Yes. The availability table types views, likes and duration as numbers and marks all three always present, so no parsing is needed before comparison.
Which fields might be missing?
Only description and keywords are marked conditional. Everything else in the documented shape, id, title, url, views, likes, duration, channel.id, channel.name, thumbnails and isLive, is guaranteed.
Does the output say where a video sits in the playlist?
No. The listing mentions position in prose but publishes no such field, so order arrives as dataset order rather than as a value you can sort on afterwards.
What happens with private videos in a playlist?
They come back with isPrivate set and are billed like any other row. Filter them out after the run rather than expecting the actor to skip them.
Can I tell which playlist a video came from in a multi-list run?
Not from the row. Run one playlist per job, which costs the same, or add the source yourself with customMapFunction.
Where YouTube Playlist Scraper fits
Parent scraper
YouTube Scraper
Seven YouTube scrapers compared. This one has the largest free allowance of any of them by a factor of three, a hundred videos with every query, which makes curated lists the cheapest structured video data on the platform.
Sibling scrapers
- YouTubeYouTube Channel Videos Scraper
- YouTubeYouTube Trending Scraper
- YouTubeYouTube Transcript Scraper
Guides
- Measuring a course’s real length before you commit to itComing soon
- Auditing playlists for dead and private entriesComing soon
- Seeding a transcript pipeline from a playlistComing soon
Read one playlist
A nickel, and a hundred videos come with it.
startUrls: [one playlist URL] · maxItems: 100
Apidojo is not affiliated with YouTube or Google LLC.