# YouTube Playlist Scraper: Export CSV, Length & Deleted Videos (`s_actors/youtube-playlist-scraper`) Actor

Export every video of any YouTube playlist to CSV, Excel or JSON: titles, channels, views, dates, durations. No 200-video limit. Playlist length at 1.25x-2x, all playlists of a channel, playlist search, names of deleted videos and change alerts. No API key.

- **URL**: https://apify.com/s_actors/youtube-playlist-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Videos, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.16 / 1,000 videos

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: Export Playlist Videos to CSV

Export **every video of any YouTube playlist** to CSV, Excel or JSON: position, title, channel, views, date and length. **No 200-video limit**: long playlists are read to the end. Get the **playlist length at 1.25x to 2x**, all playlists of a channel, playlist search, and **fix broken playlists**: the titles of deleted videos YouTube hides from the list, with a **replacement link** for each (a re-upload or the official video).

```json
{ "playlists": ["https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"] }
```

No YouTube API key, no quota, no login. Use it as a **YouTube playlist API**: one call returns clean JSON.

#### What you get

**One row per video.** Real example, September 2026:

| # | video | channel | views | published | length | status | replacement |
|---|---|---|---|---|---|---|---|
| 1 | Coding Challenge 1: Starfield Simulation | The Coding Train | 1.3M | 2016 | 13:54 | available | |
| 2 | Coding Challenge #2: Menger Sponge Fractal | The Coding Train | 322K | 2016 | 14:01 | available | |
| 100 | *(deleted)*: was **Miley Cyrus - Party In The U.S.A.** | Miley Cyrus Topic | | | | unavailable | [Official Video](https://www.youtube.com/watch?v=M11SvDtPBhA), HollywoodRecordsVEVO, 1.1B views, match 100 |

| Video field | Description |
|---|---|
| `position`, `videoId`, `url`, `title` | Order in the playlist and the video |
| `status` | `available`, `unavailable` (deleted or private) or `removed` (monitoring) |
| `previousTitle`, `titleSource`, `archivedAt`, `archiveUrl` | What a deleted video was: from an earlier run or from the Wayback Machine |
| `replacementUrl`, `replacementTitle`, `replacementChannel`, `replacementViews`, `replacementDuration`, `replacementMatch` | The best YouTube match for a deleted video: a re-upload, the official video or another upload of the same clip; `replacementMatch` 0-100 (title and length) |
| `channelName`, `channelId`, `channelUrl` | The video's channel (a playlist can mix channels) |
| `views`, `viewsText`, `publishedText`, `publishedDate` | Views and upload date as YouTube shows them in playlists (1.3M, 10 years ago) |
| `duration`, `durationSeconds`, `isLiveNow`, `thumbnail` | Length and preview |
| `change` | Monitoring: `added`, `removed` or `became unavailable` |
| `playlistId`, `playlistTitle`, `playlistUrl`, `playlistOwner` | The playlist |

**Or one row per playlist** (Results = Playlists):

| playlist | videos | length | at 1.25x | at 1.5x | at 2x | avg video | updated |
|---|---|---|---|---|---|---|---|
| Coding Challenges | 246 | 106:45:58 | 85:24:46 | 71:10:39 | 53:22:59 | 0:26:02 | 2026-04-27 |

Plus `ownerName`, `ownerUrl`, `views`, `unavailableVideos`, `durationAt1_75x`, `longestVideoDuration`, `mostViewedVideo`, `description`, `thumbnail`.

#### How it works

1. Add playlists: links, `watch?v=...&list=...` links, playlist IDs, or channels (`@handle`) for all their playlists. Or search playlists by keyword
2. Choose **Results**: Videos (the full list) or Playlists (one summary row each)
3. Run, then download as CSV, Excel or JSON, or call it as an API

| Input | What it does |
|---|---|
| **Playlists or channels** | Any public playlist; a channel gives all its playlists |
| **Find playlists by keyword** | "python course", "lofi study music": the top playlists of a YouTube search |
| **Include unavailable videos** | Show the videos YouTube hides ("Unavailable videos are hidden"), on by default |
| **Find titles of deleted videos** | Name each deleted or private video from earlier runs or the Wayback Machine |
| **Find replacements** | For each named deleted video, the best matching video on YouTube now (on by default, free) |
| **Only changes** | Monitoring: later runs return only added, removed and newly deleted videos |

#### Why this Actor

| | |
|---|---|
| 📜 **The whole playlist** | The YouTube web page stops at 200 videos; this Actor reads 1,000+ video playlists to the end |
| 🕵️ **Deleted video finder + replacements** | See which videos disappeared, what they were (13 of 15 old deleted videos named in our test) and **a link to watch instead**: a re-upload or the official video (12 of 13 correct in our test; check `replacementMatch`) |
| ⏱️ **Playlist length calculator** | Total length and length at 1.25x, 1.5x, 1.75x and 2x for courses and study lists |
| 🔔 **Playlist change alerts** | Scheduled runs report added, removed and deleted videos with their old titles |
| 📺 **Channels and search** | All playlists of a channel, or the top playlists for a keyword |
| 💰 **$0.05 for a 246-video playlist** | $0.002 per playlist + $0.0002 per video; the popular playlist scraper charges $0.025 per playlist + $0.0005 per video after 100 |

#### Pricing

Pay per result, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Playlist (read in full) | $0.002 | $0.0018 | $0.0016 |
| Video (one row) | $0.0002 | $0.00018 | $0.00016 |
| Deleted video title found (Wayback Machine) | $0.003 | $0.0027 | $0.0024 |

| Task | Cost |
|---|---|
| Export a 246-video playlist | $0.052 |
| Length of 100 playlists (Results = Playlists) | $0.20 |
| Daily change check of 10 playlists for a month | ~$0.63 + changed videos |

Archive lookups that find nothing and titles known from earlier runs are free.

#### Ready-made tasks

| Task | What you get |
|---|---|
| [Export YouTube Playlist to CSV or Excel](https://apify.com/s_actors/youtube-playlist-scraper/examples/export-youtube-playlist-to-csv) | Every video of a playlist as a table |

#### Monitor your playlists

1. Add your playlists (or a channel), turn on **Only changes** and **Find titles of deleted videos**
2. Save as a task and schedule it daily
3. The first run remembers every video; later runs return only `added`, `removed` and `became unavailable` rows, each with the title it had

The Actor also remembers titles of every playlist it has read (key-value store `youtube-playlist-titles` in your account), so a video deleted later is named for free.

#### FAQ

**Why do playlists stop at 200 videos elsewhere?** The YouTube web page gives no next page after 200 videos. This Actor switches to the YouTube app's playlist pages and continues to the end.

**How are deleted videos named?** YouTube shows only the ID of a deleted or private video. The Actor looks for the title in its own earlier runs, then in copies of the video's page archived by the Wayback Machine (web.archive.org). Popular videos are usually archived; unknown ones may not be.

**Can I still watch a deleted video?** Not the deleted upload itself: YouTube removed it. With **Find replacements** the Actor searches YouTube for its old title and gives the best match with a score: often the official video, a re-upload or another upload of the same song. A score near 100 means the same title (and length, when the archive had it); check lower scores by eye.

**Why are views rounded?** Playlists show rounded views (1.3M). For exact views, likes and comments of each video use [YouTube Video Details Scraper](https://apify.com/s_actors/youtube-video-details-scraper).

**Mixes and private playlists?** Only public playlists; YouTube Mixes (RD...) and Watch Later are personal and not supported.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "How long is this course playlist at 1.5x, and which videos were deleted from it?"

#### Other YouTube tools

| Tool | What it does |
|---|---|
| [YouTube Trending & Charts Scraper](https://apify.com/s_actors/youtube-trending-scraper) | Trending music videos and trailers, top songs, artists, Shorts songs, podcasts by country, chart history |
| [YouTube Thumbnail Downloader](https://apify.com/s_actors/youtube-thumbnail-downloader) | Thumbnails of videos, channels and searches in HD, ZIP, thumbnail change history |
| [YouTube Search Scraper](https://apify.com/s_actors/youtube-search-scraper) | Search results with every filter, newest first, without Shorts |
| [YouTube Channel Scraper](https://apify.com/s_actors/youtube-channel-scraper) | Channel stats, growth history, videos, Shorts and streams |
| [YouTube Channel Email Scraper](https://apify.com/s_actors/youtube-channel-email-scraper) | Public emails, websites and socials of channels, influencer lists by niche |
| [YouTube Video Details Scraper](https://apify.com/s_actors/youtube-video-details-scraper) | Full details and exact stats of any videos, views tracker over time |
| [YouTube Shorts Scraper](https://apify.com/s_actors/youtube-shorts-scraper) | Shorts of channels, searches, hashtags and sounds: exact stats, viral score |
| [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper) | Transcripts and subtitles of videos, channels and playlists: text, SRT, search |
| [YouTube Comments Scraper](https://apify.com/s_actors/youtube-comments-scraper) | Comments and replies of videos, Shorts and channels, only-new monitoring |
| [YouTube SEO & Rank Tracker](https://apify.com/s_actors/youtube-seo-rank-tracker) | Searches a video ranks for, keyword rankings, tags, suggestions |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the results to a Google Sheet |

#### Is it legal?

The Actor reads only public data that YouTube and the Wayback Machine show to any visitor, without logging in, and does not download videos. Use it for research, archiving your own playlists and monitoring.

# Actor input Schema

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

One per line: playlist links (youtube.com/playlist?list=...), video links from a playlist (watch?v=...\&list=...), playlist IDs (PL..., UU..., OL...) or channels (youtube.com/@handle, /channel/UC..., @handle): a channel gives all its public playlists.

## `searchQueries` (type: `array`):

Optional. YouTube playlist search, e.g. "python course" or "lofi study music": the top playlists of each query are scraped.

## `resultType` (type: `string`):

Videos = the full video list (export to CSV / Excel). Playlists = one row per playlist: total length and length at 1.25x, 1.5x, 1.75x and 2x, videos, unavailable videos, views, last update, most viewed video.

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

0 = all videos. Playlists longer than 200 videos are read in full (the YouTube web page stops at 200).

## `maxPlaylistsPerChannel` (type: `integer`):

For channel inputs: how many of the channel's playlists, in the order of its Playlists tab.

## `maxPlaylistsPerSearch` (type: `integer`):

For search queries: how many playlists from the top of the results.

## `includeUnavailable` (type: `boolean`):

Show the videos YouTube hides ("Unavailable videos are hidden"): region-blocked ones with full data, deleted and private ones with status unavailable.

## `recoverDeletedTitles` (type: `boolean`):

For each deleted or private video: its title and channel from this Actor's earlier runs, else from archived copies on the Wayback Machine (web.archive.org, usually 2-40 s per video). Charged only when a title is found.

## `findReplacements` (type: `boolean`):

With Find titles of deleted videos: search YouTube for each recovered title and return the best match (a re-upload, the official video or another upload of the same song or clip) with a match score. Free.

## `maxRecoveries` (type: `integer`):

Limit of deleted videos looked up in the Wayback Machine in one run.

## `onlyChanges` (type: `boolean`):

For scheduled runs: the first run returns every video and remembers the playlists; later runs return only videos that were added, removed (with their last title) or became unavailable (with the title they had).

## `monitorName` (type: `string`):

Name of the memory used by Only changes. Use a different name for each task.

## `maxConcurrency` (type: `integer`):

How many requests to YouTube run at the same time.

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

Requests go direct first and switch to Apify datacenter proxies when YouTube refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every failed request attempt.

## Actor input object example

```json
{
  "playlists": [
    "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"
  ],
  "resultType": "videos",
  "maxVideosPerPlaylist": 0,
  "maxPlaylistsPerChannel": 100,
  "maxPlaylistsPerSearch": 20,
  "includeUnavailable": true,
  "recoverDeletedTitles": false,
  "findReplacements": true,
  "maxRecoveries": 200,
  "onlyChanges": false,
  "monitorName": "default",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

## `videos` (type: `string`):

Position, title, status, title before deletion, channel, views, date, length, change.

## `playlists` (type: `string`):

Length at every speed, videos, unavailable videos, views, last update (Results = Playlists).

## `all` (type: `string`):

Every field of every row.

# 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"
    ]
};

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

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

```

## MCP server setup

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