# YouTube Playlist Scraper (All Videos, Views, Duration) (`juliob.rangel/youtube-playlist-scraper-fast`) Actor

Paste YouTube playlist URLs or IDs and get every video in order: title, URL, channel, views, publish date, duration and thumbnail, plus the playlist's title, owner, video count and total views. No API key, no quota. Export to Excel, CSV or JSON.

- **URL**: https://apify.com/juliob.rangel/youtube-playlist-scraper-fast.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 video scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Playlist Scraper (All Videos, Views, Duration)

YouTube Playlist Scraper takes playlist URLs or IDs and returns every video in the playlist, in order: title, URL, channel, views, publish date, duration and thumbnail, plus the playlist's title, owner, video count and total views. Use it to export a YouTube playlist to Excel, CSV or JSON, or to get all video links from a playlist, with no YouTube API key and no quota.

### What does YouTube Playlist Scraper do?

You paste one or more playlists. For each playlist, the robot opens the public playlist page, reads the playlist details, then walks through the video list page by page (YouTube serves about 100 videos per page) until it reaches your limit or the end of the playlist. Each video becomes one row, and every row also carries the playlist's own details so you can mix many playlists in one table.

It accepts:

- Playlist URLs: `https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH`
- Watch URLs that contain a playlist: `https://www.youtube.com/watch?v=17WoOqgXsRM&list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH`
- Bare playlist IDs that start with `PL`, `UU`, `OL`, `FL`, `LL`, `UL` or `PU`, for example `PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH`, `UUBJycsmduvYEL83R_U4JriQ` (a channel's uploads) or `OLAK5uy_…`

Any other ID form also works if you paste it as a URL containing `list=`.

What comes out: for each video, its position, ID, title, URL, channel name, channel ID and channel URL, the view count (as a number and as YouTube's text), the publish date as YouTube shows it, the duration (as `mm:ss` and in seconds) and a thumbnail URL. For the playlist: ID, title, URL, owner, number of videos, total views and description.

No login, no cookies and no YouTube Data API key are needed.

### What data can you extract?

Each video in a playlist is one item with these fields:

| Field | What it means | Example |
|---|---|---|
| `playlistId` | ID of the playlist | `PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH` |
| `playlistTitle` | Title of the playlist | `Coding Challenges` |
| `playlistUrl` | Link to the playlist | `https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH` |
| `playlistOwner` | Channel that owns the playlist | `The Coding Train` |
| `playlistVideoCount` | Number of videos YouTube shows for the playlist | `246` |
| `playlistViews` | Total views YouTube shows for the playlist | `2718722` |
| `playlistDescription` | Description of the playlist | `Is it the gravy train or a train wreck?…` |
| `position` | Order of the video in the results for this playlist (1, 2, 3…) | `1` |
| `videoId` | 11-character video ID | `17WoOqgXsRM` |
| `title` | Video title | `Coding Challenge 1: Starfield Simulation` |
| `url` | Link to the video | `https://www.youtube.com/watch?v=17WoOqgXsRM` |
| `channelName` | Channel that published the video | `The Coding Train` |
| `channelId` | Channel ID of the video's channel | `UCvjgXvBlbQiydffZU7m1_aw` |
| `channelUrl` | Link to the video's channel | `https://www.youtube.com/@TheCodingTrain` |
| `views` | View count as a number (rounded the way YouTube shows it) | `1300000` |
| `viewsText` | View count as YouTube shows it | `1.3M views` |
| `published` | Publish date as YouTube shows it (relative, in English) | `10 years ago` |
| `duration` | Video length as shown on the thumbnail | `13:54` |
| `durationSeconds` | Video length in seconds | `834` |
| `thumbnail` | Thumbnail image URL | `https://i.ytimg.com/vi/17WoOqgXsRM/hqdefault.jpg` |
| `scrapedAt` | When the row was collected (ISO 8601, UTC) | `2026-10-09T20:23:22.559Z` |
| `input` | Only on error items: the line from your input | `PLxxxxxxxx` |
| `error` | Only on error items: what went wrong | `Playlist not found or private` |

The default table view shows `playlistTitle`, `position`, `title`, `channelName`, `views`, `published`, `duration` and `url`. Every field is in the full JSON, CSV and Excel exports.

### How to use YouTube Playlist Scraper

1. Open the robot in Apify Console and go to the **Input** tab.
2. In **Playlists**, paste one playlist URL or ID per line.
3. Set **Max videos per playlist** (default 100, up to 5,000).
4. Leave **Proxy** on the default Apify Proxy.
5. Click **Start**. Rows appear in the **Output** tab while the robot works.
6. Click **Export** to download the results as JSON, CSV, Excel, HTML or XML, or read them through the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `playlists` | array of strings (required) | `["https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"]` | Playlist URLs, watch URLs with `&list=`, or playlist IDs. |
| `maxVideosPerPlaylist` | integer, 1 to 5,000 | `100` | Stop after this many videos for each playlist. |
| `proxy` | object | `{ "useApifyProxy": true }` | Apify Proxy settings. |

Example input:

```json
{
  "playlists": [
    "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
    "UUBJycsmduvYEL83R_U4JriQ"
  ],
  "maxVideosPerPlaylist": 500,
  "proxy": { "useApifyProxy": true }
}
```

### Output example

One real item from a recent run on The Coding Train's "Coding Challenges" playlist:

```json
{
  "playlistId": "PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
  "playlistTitle": "Coding Challenges",
  "playlistUrl": "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
  "playlistOwner": "The Coding Train",
  "playlistVideoCount": 246,
  "playlistViews": 2718722,
  "playlistDescription": "Is it the gravy train or a train wreck? Watch me take on some viewer submitted coding projects!",
  "position": 1,
  "videoId": "17WoOqgXsRM",
  "title": "Coding Challenge 1: Starfield Simulation",
  "url": "https://www.youtube.com/watch?v=17WoOqgXsRM",
  "channelName": "The Coding Train",
  "channelId": "UCvjgXvBlbQiydffZU7m1_aw",
  "channelUrl": "https://www.youtube.com/@TheCodingTrain",
  "views": 1300000,
  "viewsText": "1.3M views",
  "published": "10 years ago",
  "duration": "13:54",
  "durationSeconds": 834,
  "thumbnail": "https://i.ytimg.com/vi/17WoOqgXsRM/hqdefault.jpg",
  "scrapedAt": "2026-10-09T20:23:22.559Z"
}
```

If a playlist is private or does not exist, you get one error item instead:

```json
{
  "input": "https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx",
  "playlistId": "PLxxxxxxxxxxxxxxxx",
  "error": "Playlist not found or private"
}
```

### How much does it cost?

The robot uses pay per event pricing. You pay only for the videos returned, and Apify platform usage is already included in the price.

| Event | Price (Free plan) |
|---|---|
| Video scraped | $0.001 per video, which is **$1.00 per 1,000 videos** |

Paid Apify plans get a discount:

| Plan | Price per 1,000 videos |
|---|---|
| Free | $1.00 |
| Bronze (-10%) | $0.90 |
| Silver (-20%) | $0.80 |
| Gold and higher (-30%) | $0.70 |

Worked examples on the Free plan:

- The full "Coding Challenges" playlist with 246 videos: **$0.246**.
- 20 playlists × 100 videos = 2,000 videos: **$2.00** ($1.40 on Gold).
- One very large playlist at the 5,000-video limit: **$5.00** ($4.50 on Bronze, $4.00 on Silver, $3.50 on Gold).

What is NOT charged:

- Error items: lines that are not a playlist URL or ID, playlists that are private or not found, and playlists where no videos were found.
- A video that shows up twice in the same playlist is returned only once.

### Use cases

- **Export a course or tutorial playlist** to a spreadsheet with titles, links and durations, and add up the total watch time from `durationSeconds`.
- **Compare episodes of a series**: see which videos in a playlist get the most views.
- **Feed other tools**: collect every video URL of a playlist and pass the list to a transcript or comments scraper.
- **List a channel's uploads**: use the `UU…` uploads playlist to get a channel's videos in order.
- **Monitor competitors' playlists** on a schedule and spot new videos as they are added.
- **Archive music playlists** with titles, channels and lengths.
- **Audit your own playlists**: find low-view videos or very long or very short entries.

### Tips and limits

- **Up to 5,000 videos per playlist.** That is the maximum of `maxVideosPerPlaylist`. The robot also stops at the end of the playlist.
- **Channel uploads trick.** A channel's uploads playlist ID is its channel ID with `UC` replaced by `UU`. For example, channel `UCBJycsmduvYEL83R_U4JriQ` has the uploads playlist `UUBJycsmduvYEL83R_U4JriQ`.
- **Some playlist details can be empty.** For channel uploads (`UU…`) playlists, YouTube does not show an owner, video count, total views or description in the same place, so `playlistOwner`, `playlistVideoCount`, `playlistViews` and `playlistDescription` can be `null`. The video rows are complete.
- **Views are rounded** the way YouTube shows them in lists: `1.3M views` becomes `1300000`. Keep `viewsText` if you need the original text. For exact view counts per video, use the YouTube Video Details Scraper on the URLs.
- **Dates are relative.** `published` is the text YouTube shows (`10 years ago`, or a "Streamed" / "Premiered" label). It is not an exact date.
- **`duration` can be empty** when YouTube shows no time badge on the thumbnail, for example on a live stream. `durationSeconds` is then `null` too.
- **`position` counts the rows returned** for that playlist, starting at 1, in the order YouTube lists the videos.
- **Private playlists can't be read.** Only playlists that open without logging in work. Watch Later and Liked videos of your own account are private.
- **Error items** are pushed for `Not a playlist URL or ID`, `Playlist not found or private` and `No videos found`. They are free.
- **Playlists are processed one after another**, and each page of videos is saved as soon as it is read.
- **Proxy.** Requests go through Apify Proxy, with retries on new IPs and a last try on the Residential proxy group when your account has access to it.

### Use it from the API, Python or JavaScript

JavaScript (Node.js):

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = {
  playlists: ['https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH'],
  maxVideosPerPlaylist: 1000,
};
const run = await client.actor('juliob.rangel/youtube-playlist-scraper-fast').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((v) => !v.error).map((v) => v.url));
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
run_input = {
    'playlists': ['https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH'],
    'maxVideosPerPlaylist': 1000,
}
run = client.actor('juliob.rangel/youtube-playlist-scraper-fast').call(run_input=run_input)
items = client.dataset(run['defaultDatasetId']).list_items().items
print([v['url'] for v in items if 'url' in v])
```

You can also call it over plain HTTP with the Apify API (for example the `run-sync-get-dataset-items` endpoint of `juliob.rangel~youtube-playlist-scraper-fast`).

It works with Make, Zapier, n8n, Google Sheets export, webhooks and AI agents through the Apify MCP server.

### FAQ

**Do I need a login, cookies or a YouTube API key?**
No. The robot reads public playlists the way a logged-out visitor sees them.

**Can I export a YouTube playlist to Excel or CSV?**
Yes. Click **Export** in the Output tab after the run and choose Excel, CSV, JSON, HTML or XML.

**How many videos can I get from one playlist?**
Up to 5,000 per playlist per run, set with `maxVideosPerPlaylist`. You can add as many playlists as you want to one run.

**Can I scrape a private playlist or my Watch Later list?**
No. Those need a login, and the robot does not log in, so you get an error item instead of videos.

**Why are some playlist fields `null`?**
YouTube does not show every playlist detail on every kind of playlist. Channel uploads (`UU…`) playlists often have no owner, video count or view total in the header.

**Why did I get an error item?**
The line was not a playlist URL or ID, the playlist is private or deleted, or YouTube returned no videos for it. Error items are not charged.

**Is scraping YouTube playlists legal?**
The robot only collects publicly available data. You are responsible for complying with YouTube's terms and with privacy laws such as GDPR and LGPD. If you store personal data, you need a legitimate reason.

### Related scrapers

- [YouTube Channel Videos Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-channel-videos)
- [YouTube Video Details Scraper (Views, Likes, Comments)](https://apify.com/juliob.rangel/youtube-video-details)
- [YouTube Transcript Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-transcript-fast)
- [YouTube Comments Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-comments-fast)
- [YouTube Search Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-search-fast)

***

## Extrator de Playlists do YouTube (PT-BR)

Cole links ou IDs de playlists do YouTube e receba todos os vídeos em ordem: título, link, canal, visualizações, data, duração e miniatura, além do título, dono, número de vídeos e visualizações da playlist. Sem chave de API. Você paga só por vídeo retornado.

# Actor input Schema

## `playlists` (type: `array`):

Playlist URLs (youtube.com/playlist?list=..., or a watch URL with \&list=) or playlist IDs (PL..., UU..., OLAK...).

## `maxVideosPerPlaylist` (type: `integer`):

Stop after this many videos for each playlist (YouTube serves 100 per page).

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "playlists": [
    "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"
  ],
  "maxVideosPerPlaylist": 100,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "playlists": [
        "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"
    ],
    "maxVideosPerPlaylist": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/youtube-playlist-scraper-fast").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "playlists": ["https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"],
    "maxVideosPerPlaylist": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/youtube-playlist-scraper-fast").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "playlists": [
    "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"
  ],
  "maxVideosPerPlaylist": 100
}' |
apify call juliob.rangel/youtube-playlist-scraper-fast --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,juliob.rangel/youtube-playlist-scraper-fast"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5QFQaRPgdZa1CbJgd/builds/Vor7cwJrzsgLN8v4F/openapi.json
