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.

apidojo/youtube-playlist-scraper
Input method

Estimated run cost

$0.00

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 / sort

    us / 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.

YouTube Playlist Scraper specificationsapidojo/youtube-playlist-scraper
Apify actorapidojo/youtube-playlist-scraper
InputsstartUrls · keywords · gl · hl · sort · maxItems · customMapFunction
Two ways inA playlist URL or a keyword search, both at $0.05
Free allowance100 videos on either query type
Always returnedid, title, url, views, likes, duration, channel.id, channel.name, thumbnails, isLive
Sometimes returneddescription, keywords
Typesviews, likes and duration are numbers, so nothing needs parsing
Reliability99.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
Field referenceDocumented in the actor README
id · title · urlVideo ID, title and watch URL. All guaranteed
viewsView count as a number, ready to compare and sum directly
likesLike count, documented as an always-present number
durationSeconds as a number. Sum it across a list to get a course’s real running time
statusRecord status, shown as "OK" in the listing’s sample
channel.id · channel.nameThe uploader. Both guaranteed, which single-channel playlists make easy to verify
channel.urlChannel link, present in the sample alongside the two guaranteed channel fields
thumbnailsArray of sizes, each with url, width and height
isLiveLivestream indicator, guaranteed. Filter on it before averaging anything
isPrivateShown in the sample. A private entry is a video you cannot watch but still paid for
descriptionConditional, and absent often enough that a pipeline needs the guard
keywordsConditional 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.

What a run costsQuery fee + $0.0005 × billable items
RunMethodCalculationCost
100 videos1 playlist$0.05$0.05
200 videos1 playlist$0.05 + 100 × $0.0005$0.10
200 videos1 keyword search$0.05 + 100 × $0.0005$0.10
500 videos1 playlist, deep$0.05 + 400 × $0.0005$0.25
500 videos5 playlists5 × $0.05$0.25
1,000 videos5 playlists5 × $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

Read one playlist

A nickel, and a hundred videos come with it.

startUrls: [one playlist URL] · maxItems: 100

Run this scraper free

Apidojo is not affiliated with YouTube or Google LLC.