# YouTube Playlist & Shorts Scraper (`maged120/youtube-playlist-shorts-scraper`) Actor

Extract every video in a YouTube playlist, or every Short on a channel, with titles, views, durations, channels and thumbnails.

- **URL**: https://apify.com/maged120/youtube-playlist-shorts-scraper.md
- **Developed by:** [Maged](https://apify.com/maged120) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 results

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 & Shorts Scraper** extracts **every video in a YouTube playlist** and **every Short on a YouTube channel**, with titles, **view counts**, **durations**, channels, publish dates and thumbnails. Paste playlist links and channel handles together, and get one clean, export-ready table.

### What does YouTube Playlist & Shorts Scraper do?

Give it any public [YouTube](https://www.youtube.com) playlist and it lists the videos in order, with position, title, channel, views, duration and upload age. Give it a channel link or `@handle` and it lists that channel's **Shorts**, with title, views and link. Both kinds of input can go into the same run.

On the Apify platform you also get API access, scheduling, integrations (Google Sheets, Zapier, Make, webhooks), proxy rotation and run monitoring. You can track a playlist or a creator's Shorts over time without writing any code.

### Why use YouTube Playlist & Shorts Scraper?

- **Shorts research**: find which Shorts took off for a creator or competitor and spot the formats that work.
- **Playlist export**: turn any playlist (music, courses, podcasts) into a spreadsheet of titles, links and durations.
- **Content audits**: check the view distribution across a channel's Shorts or a curated playlist.
- **Trend & chart tracking**: schedule runs on chart playlists and watch position and views change over time.
- **Data pipelines**: feed video IDs into other tools, such as transcript, comment or video-detail scrapers.

### How to scrape a YouTube playlist or a channel's Shorts

1. Open the Actor and go to the **Input** tab.
2. Paste links into **Playlists and channels**, one per line:
   - playlists: `https://www.youtube.com/playlist?list=PL…`
   - channels: `https://www.youtube.com/@MrBeast`, `@MrBeast`, or a channel URL
3. Set **Max videos per playlist / channel** (or `0` for everything).
4. Click **Start**.
5. Open the **Output** tab (**Playlist videos** and **Shorts** views), or download the data as JSON, CSV, Excel or HTML.

### Input

| Field | Type | Description |
|---|---|---|
| `urls` | array | Playlist links and/or channel links / `@handles`. **Required.** |
| `maxItemsPerSource` | integer | Stop after this many videos per playlist or channel. `0` = all. Default `200`. |
| `proxyConfiguration` | object | Optional. Not needed for normal use. |

```json
{
    "urls": [
        "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
        "@MrBeast"
    ],
    "maxItemsPerSource": 200
}
```

### Output

Each video is one row. Rows are marked `entityType: "playlist_video"` or `entityType: "short"`. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

**Playlist video**

```json
{
    "entityType": "playlist_video",
    "sourceUrl": "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "playlistId": "PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "playlistTitle": "Popular Music Videos",
    "position": 121,
    "videoId": "L7mSNTMb5sY",
    "title": "…",
    "url": "https://www.youtube.com/watch?v=L7mSNTMb5sY",
    "channelName": "On The Radar Radio",
    "channelId": "UCa8b7nZo-iPKoJxspOplnWg",
    "views": 5600000,
    "viewsText": "5.6M views",
    "publishedText": "2 years ago",
    "duration": "4:31",
    "durationSeconds": 271,
    "thumbnailUrl": "https://i.ytimg.com/vi/L7mSNTMb5sY/hqdefault.jpg",
    "scrapedAt": "2026-09-25T15:12:59+00:00"
}
```

**Short**

```json
{
    "entityType": "short",
    "sourceUrl": "@MrBeast",
    "channelName": "MrBeast",
    "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
    "channelUrl": "http://www.youtube.com/@MrBeast",
    "position": 1,
    "videoId": "T_SMf9j50uc",
    "title": "Can We Build an Entire Village?",
    "url": "https://www.youtube.com/shorts/T_SMf9j50uc",
    "views": 19000000,
    "viewsText": "19M views",
    "thumbnailUrl": "https://i.ytimg.com/vi/T_SMf9j50uc/frame0.jpg",
    "scrapedAt": "2026-09-25T15:13:07+00:00"
}
```

### Output data fields

| Field | Description |
|---|---|
| `position` | Order in the playlist, or in the channel's Shorts tab (newest first). |
| `videoId` / `url` | Video ID and direct link. |
| `title` | Video title. |
| `channelName` / `channelId` | The uploader. |
| `views` / `viewsText` | View count as a number, and as YouTube displays it. |
| `duration` / `durationSeconds` | Video length (playlist videos). |
| `publishedText` | Upload age as shown by YouTube, e.g. "2 years ago" (playlist videos). |
| `playlistTitle` / `playlistId` | The playlist the video came from. |
| `thumbnailUrl` | Video thumbnail. |
| `error` | Present only on rows for inputs that couldn't be read. |

### How many results will I get?

One row per video. A 500-video playlist gives 500 rows, and a channel with 1,200 Shorts gives 1,200 rows (if uncapped). Use **Max videos per playlist / channel** to keep runs small while you test, then raise it or set it to `0` when you want the full list.

### Tips

- **Mix inputs freely**: playlists and channels can share one run.
- **Track over time**: schedule the Actor daily or weekly and compare `views` across runs to see which videos are growing.
- **Go deeper**: pass the `videoId` values into a video-details, transcript or comments scraper for richer data.

### FAQ

**Why are view counts rounded?** YouTube shows views in rounded form in playlists and on the Shorts tab (e.g. "19M"). The Actor converts them to numbers. For exact counts, run the video IDs through a video-details scraper.

**Which playlists work?** Any public or unlisted playlist whose link you have. Private playlists, and auto-generated "Mix" radio playlists, can't be read. They return a row explaining why.

**Can I get a channel's regular videos too?** This Actor focuses on playlists and Shorts. A channel's full upload list is itself a playlist: replace `UC` at the start of the channel ID with `UU` and paste `https://www.youtube.com/playlist?list=UU…`.

**Is scraping YouTube legal?** The Actor only collects publicly visible information. You're responsible for how you use the data under your local laws and YouTube's terms.

**Found a bug or need a custom feature?** Open an issue in the **Issues** tab. Custom solutions are available on request.

# Actor input Schema

## `urls` (type: `array`):

Paste playlist links (youtube.com/playlist?list=...) to get every video in the playlist, and channel links or @handles (youtube.com/@MrBeast) to get every Short on the channel. Mix both freely.

## `maxItemsPerSource` (type: `integer`):

Stop after this many videos from each playlist or channel. 0 = everything.

## `proxyConfiguration` (type: `object`):

Optional. Not needed for normal use — enable for very large or frequent runs.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "@MrBeast"
  ],
  "maxItemsPerSource": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "urls": [
        "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
        "@MrBeast"
    ],
    "maxItemsPerSource": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/youtube-playlist-shorts-scraper").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 = {
    "urls": [
        "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
        "@MrBeast",
    ],
    "maxItemsPerSource": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("maged120/youtube-playlist-shorts-scraper").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 '{
  "urls": [
    "https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI",
    "@MrBeast"
  ],
  "maxItemsPerSource": 200
}' |
apify call maged120/youtube-playlist-shorts-scraper --silent --output-dataset

```

## MCP server setup

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

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/Jbyia0f2bcmKLgSlT/builds/A2LraHhOmGxWxUx8w/openapi.json
