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

[Run this scraper free](https://apify.com/apidojo/youtube-playlist-scraper)

[See the three jobs](#jobs)

apidojo/youtube-playlist-scraper

**By playlist URL**

**By keyword**

**Playlists**

**Videos returned**

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.

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

**01 One playlist $0.05 · 100 videos in**

**02 Several lists 100 free per playlist**

**03 Find playlists Same price as naming one**

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

**Python**

**JavaScript**

**cURL**

```
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.](/scrapers/youtube-scraper/)

Sibling scrapers

-   [YouTube Channel Videos Scraper](/scrapers/youtube-channel-scraper/)
-   [YouTube Trending Scraper](/scrapers/youtube-trending-scraper/)
-   [YouTube Transcript Scraper](/scrapers/youtube-transcript-scraper/)

Guides

-   Measuring a course’s real length before you commit to it*Coming soon*
-   Auditing playlists for dead and private entries*Coming soon*
-   Seeding a transcript pipeline from a playlist*Coming soon*

## Read one playlist

A nickel, and a hundred videos come with it.

`startUrls: [one playlist URL] · maxItems: 100`

[Run this scraper free](https://apify.com/apidojo/youtube-playlist-scraper)

Apidojo is not affiliated with YouTube or Google LLC.

## Guides for this scraper

-   [YouTube scraping guides Videos, channels, playlists, comments and transcripts: what YouTube's data actually contains, and which fields arrive as text rather than as numbers.](/blog/youtube/)
-   [Measuring a YouTube course's real length Playlist duration is a guaranteed number, and a hundred videos come free with every query. Summing a curriculum's true running time costs a nickel.](/blog/youtube/youtube-course-length/)
