# YouTube Playlist Scraper - Every Video In Order (`gganbukim/youtube-playlist-scraper`) Actor

Export every video in a YouTube playlist with its position, title, views, duration and thumbnail. Handles playlists of any length, including a channel's uploads playlist. Filter by views or title before billing. No API key and no Data API quota.

- **URL**: https://apify.com/gganbukim/youtube-playlist-scraper.md
- **Developed by:** [DONGMIN KIM](https://apify.com/gganbukim) (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.50 / 1,000 playlist videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YouTube Playlist Scraper — Every Video, In Order

Export a playlist to a table: position, title, URL, views, duration and thumbnail. Works on
playlists of any length, and on a channel's uploads playlist.

No API key. The Data API caps at 10,000 quota units a day; this has no such ceiling.

### What it does well

- **Position is a field** — the ordering is the thing a playlist has that a channel listing does not, so it ships as `position` rather than being left to the row order of a dataset.
- **Full pagination** — the whole playlist, not the first 100.
- **Filters run before billing** — minimum views or a title fragment. **Filtered videos cost nothing.**
- **Multiple playlists per run**, each row tagged with its playlist.

### Honest scope

Playlists are also accepted directly by our Transcript and Comments Actors, which expand
them for you. Reach for this one when the playlist itself is the object of study — its
order, its length, what is in it — rather than a way of naming a set of videos.

### Input

```jsonc
{
  "playlistUrls": [
    "https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb",
    "UUX6OQ3DkcsbYNE6H8uQQuVA"
  ],
  "maxVideosPerPlaylist": 1000
}
```

#### Every option

The same wording you see in the Apify console, with the JSON key for API and MCP callers.

| Option | What it does | Default |
|---|---|---|
| **Playlists** — `playlistUrls` *(required)* | Playlist URLs, watch URLs carrying `?list=`, or bare ids (PL…, UU…, OLAK5…). A channel's uploads playlist works too. | — |
| **Max videos per playlist** — `maxVideosPerPlaylist` | Videos arrive 100 per request, so this is the main cost control. | `500` |
| **Minimum views** — `minViewCount` | Drop videos below this view count. Filtered videos are not billed. | `0` |
| **Title contains any of** — `titleContains` | Case-insensitive fragments. A video is kept if its title contains any of them. | — |
| **Concurrency** — `concurrency` | Playlists read in parallel. | `3` |
| **Proxy** — `proxyConfiguration` | Leave the default. Reads listing pages only, so it stays on cheap datacenter proxies. | `{"useApifyProxy":true}` |

### Output

One row per video.

```json
{
  "playlistId": "PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb",
  "playlistUrl": "https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb",
  "position": 1,
  "videoId": "8S0FDjFBj8o",
  "url": "https://www.youtube.com/watch?v=8S0FDjFBj8o",
  "title": "The first video in the playlist",
  "viewCount": 15641909,
  "durationSeconds": 356,
  "publishedText": "3 years ago",
  "thumbnailUrl": "https://i.ytimg.com/vi/8S0FDjFBj8o/hqdefault.jpg",
  "scrapedAt": "2026-08-20T09:14:02.113Z"
}
```

#### Every field

You are billed per video delivered, so here is everything a row can contain.

| Field | What it is |
|---|---|
| `playlistId` / `playlistUrl` | Which playlist the row came from, so a multi-playlist run reads without a join. |
| `position` | Position in the playlist, counted **before** filtering — so it still matches the playlist you would see on YouTube even when your filters remove rows. |
| `videoId` | The 11-character id. |
| `url` | `watch?v=` URL. |
| `title` | Video title. |
| `viewCount` | Views, parsed from the display text. |
| `durationSeconds` | Length in seconds. |
| `publishedText` | YouTube's relative text, when the playlist row carries one. |
| `isShort` | `true` when the entry is a Short. Playlists mix formats, so this is how you separate them without re-checking each video. |
| `thumbnailUrl` | Largest available thumbnail. |
| `scrapedAt` | When this run read the playlist. |

### Who this is for

- **Course and curriculum builders** — a tutorial playlist becomes a table with runtimes and the order preserved.
- **Anyone taking a whole back catalogue** — a channel's uploads playlist is every video it has ever published.
- **Curation researchers** — what a channel groups together, and in what order.
- **Data teams feeding other Actors** — playlist URLs in, video URLs out, straight into a transcript or comments run.

### Common uses

- **Course and series export** — turn a tutorial playlist into a table with runtimes.
- **Back-catalogue export** — a channel's uploads playlist (`UU` followed by the channel id without its `UC`) is every video it has published.
- **Curation research** — what a channel groups together, and in what order.
- **Feeding other Actors** — take the URLs into a transcript, comments or sponsorship run.

### Pricing

Pay per **video delivered** — $0.50 per 1,000. Videos removed by your filters and failed
playlists **cost nothing**.

Starting a run costs $0.00002 — the platform's $0.00001 minimum, charged once per GB of
memory, and these Actors run on 2 GB. That is two thousandths of a cent per run.

### Other Actors in this family

Same engines, same billing, no account or API key on any of them.

**YouTube & video**

- [Download YouTube Subtitles in Bulk — SRT, VTT & Text](https://apify.com/gganbukim/youtube-transcript-scraper) — Bulk subtitles from videos, channels or playlists — text, SRT, VTT or RAG chunks.
- [Export YouTube Comments to CSV — Replies and Likes](https://apify.com/gganbukim/youtube-comments-scraper) — Every comment and reply thread, with likes, authors and creator flags.
- [List Every Video on a YouTube Channel — Export to CSV](https://apify.com/gganbukim/youtube-channel-scraper) — A channel's whole back catalogue plus a subscriber and RSS summary row.
- [Find YouTube Sponsors — Brand Deals, Codes & Links](https://apify.com/gganbukim/youtube-sponsorship-finder) — Which brands pay which creators, with the campaign link, the code and the timestamp.
- [YouTube Search API — Bulk Results, No Quota](https://apify.com/gganbukim/youtube-search-scraper) — Many search terms at once, every result as a row, filtered before you are billed.
- [Track Deleted YouTube Videos & Title Changes](https://apify.com/gganbukim/youtube-channel-monitor) — What a channel quietly changed: deleted videos, rewritten titles, view velocity.
- [YouTube Creator Email Finder & Sponsor Lookup](https://apify.com/gganbukim/youtube-creator-leads) — A channel list into leads: the published email, audience bands, and who already sponsors them.

**Search demand**

- [AnswerThePublic Alternative — Autocomplete Keyword API](https://apify.com/gganbukim/long-tail-keyword-scraper) — One seed into hundreds of real keywords from Google, YouTube and Amazon autocomplete.
- [Google Trends API — Today's Trending Searches, No Key](https://apify.com/gganbukim/google-trends-scraper) — Today's trending searches by country, with traffic bands and the news behind them.

**E-commerce**

- [Export Any Shopify Store's Products to CSV or JSON](https://apify.com/gganbukim/shopify-product-scraper) — Any Shopify catalogue: variants, SKUs, live prices, stock, images, collections.
- [New Shopify Product Alerts — Competitor Drop Tracker](https://apify.com/gganbukim/shopify-new-arrivals-monitor) — Only what a store launched since the last run. Scanning is free.

**Hiring**

- [Greenhouse, Lever & Ashby Job Scraper — No API Key](https://apify.com/gganbukim/ats-job-scraper) — Paste a company domain, get its open roles from Greenhouse, Ashby, Lever or SmartRecruiters.
- [Ghost Job Detector — Track Reposts, Closures & Edits](https://apify.com/gganbukim/job-lifecycle-monitor) — What changed on a careers page: opened, closed, quietly reposted, or a ghost job.

### FAQ

**Will I get blocked, or my account banned?** There is no account to ban — no login, no cookies. Playlist pages are listing pages, the least defended surface YouTube has, so this runs on datacenter proxies almost all of the time. YouTube signals throttling with an HTTP 200 and an error body rather than an error code, which is the trap that silently halves most scrapers' results; this one detects it by reason and rotates.

**Is it legal to scrape a YouTube playlist?** It reads the same public playlist pages a
browser requests, with no login and nothing bypassed, and the fields are facts about videos
rather than the videos themselves. Public-data scraping is broadly treated as lawful in the
US; YouTube's Terms of Service are a separate contract question. Not legal advice.

**Does it work on private playlists?** No. A playlist must be public or unlisted — private
ones are invisible without a login, and this Actor uses none. The run reports that as the
failure reason rather than returning an empty result.

**Does it need a YouTube API key?** No.

**How much does 1,000 videos cost?** $0.50, plus $0.00002 for the run.

**Can I export the results to Excel or Google Sheets?** Yes. Every run's dataset downloads
as CSV, Excel, JSON, XML or RSS from the Storage tab, or straight from the API.

**Can I connect it to Zapier, Make or n8n?** Yes — Apify publishes integrations for all
three, plus webhooks that fire when a run finishes.

**Do I need to write code?** No. Fill the form in the console and press Start. It is also
available over MCP so an AI agent can call it directly.

**Can I run it on a schedule?** Yes, via Apify Schedules, webhooks, or the API.

# Actor input Schema

## `playlistUrls` (type: `array`):

Playlist URLs, watch URLs carrying a ?list= parameter, or bare ids (PL…, UU…, OLAK5…). A channel's uploads playlist works too.

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

Videos arrive 100 per request, so this is the main cost control. Leave high for the whole playlist.

## `minViewCount` (type: `integer`):

Drop videos below this view count. Filtered videos are not billed.

## `titleContains` (type: `array`):

Case-insensitive fragments. A video is kept if its title contains any of them.

## `concurrency` (type: `integer`):

Playlists read in parallel.

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

Leave the default. This actor only reads listing pages, so it almost always stays on cheap datacenter proxies.

## Actor input object example

```json
{
  "playlistUrls": [
    "https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb"
  ],
  "maxVideosPerPlaylist": 500,
  "minViewCount": 0,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per video, carrying its position in the playlist.

## `runSummary` (type: `string`):

Counts for this run: playlists done, videos delivered, rows filtered, failures, and the proxy tier used.

# 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 = {
    "playlistUrls": [
        "https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gganbukim/youtube-playlist-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 = { "playlistUrls": ["https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb"] }

# Run the Actor and wait for it to finish
run = client.actor("gganbukim/youtube-playlist-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 '{
  "playlistUrls": [
    "https://www.youtube.com/playlist?list=PLbpi6ZahtOH6Blw3RGYpWkSByi_T7Rygb"
  ]
}' |
apify call gganbukim/youtube-playlist-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gganbukim/youtube-playlist-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/Rg9HiMmyVTu82Ld4f/builds/hFX25Z7rdqMWKS1bu/openapi.json
