How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi…in Playlist URLs or IDs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
YouTube Playlist Export turns public YouTube playlists into a table: one row per playlist position, with the video title, channel, publish date, duration, views, likes, comments and link. You paste playlist links or IDs and add your own free YouTube Data API v3 key, and you get the whole playlist in the same order as on YouTube.
positionis the place in the playlist, starting at 1, exactly as in the YouTube player.- A private or deleted video keeps its position. Its row has status
unavailableandunavailableReason(privateordeleted), so there are no holes and no renumbering. - With Include duration and view/like/comment counts on (the default), each row also has
durationSec,views,likesandcomments. nullmeans "no value from YouTube" (for example, hidden likes). It is never written as0.- Accepted inputs:
youtube.com/playlist?list=…, a watch link with&list=…,youtu.be/…?list=…,music.youtube.complaylist links,m.youtube.comlinks, or bare playlist IDs (PL…,UU…,OL…and others). The same playlist given twice is exported once. - A channel's uploads playlist works too: take the channel ID
UC…and change the first two letters toUU. If you paste a channel link, the row tells you this ID.
Good for
- You need the full list of videos of a course, podcast, music or tutorial playlist in a sheet.
- You audit or catalog many playlists and need exact positions and numbers.
- You want an official, stable data source with a clear quota.
Not a good fit
- You have no API key and do not want one. This Actor does not work without a key.
- Watch later and Liked videos (
WL,LL) and private playlists. Google gives them only to their owner after a sign-in, never with an API key. - Comments, transcripts or search results. See Related Actors.
Who uses it
Teachers
Save a course playlist as a list with lengths.
Music and video fans
Keep a backup list of a playlist, including removed videos.
Researchers
Collect video data from playlists into one table.
Price
Prices will be shown after release.
Questions
Do I need a YouTube API key?
Yes. You make a free key in a Google project. The Actor does not log in to YouTube.
Can I export Watch later or Liked videos?
No. Only the owner can read them after sign-in. Copy the videos to a public or unlisted playlist first.
How big can a playlist be?
Up to 20,000 entries per playlist and 100 playlists per run.
What happens to private videos?
They get a row with status unavailable and the reason, private or deleted.
Do I need a YouTube or Google account?
You need a Google account to make the free API key. The Actor does not log in to YouTube and does not use cookies.
Why are some positions not in a row 1, 2, 3?
They are. Every entry gets a row, also private and deleted ones, so position always matches the YouTube player. Filter by status = ok if you want only playable videos.
Does it cost Google money?
No. The YouTube Data API is free within the daily quota. You pay only the Apify price above.
Is personal data included?
Only public playlist and video data that YouTube shows: playlist and channel names and IDs. No viewer data.
Details
Step by step on Apify
- Get a key (see above).
- The Playlist URLs or IDs field already has one example playlist, and Max videos per playlist is set to 10.
- Paste your key into YouTube Data API key.
- Click Start. Ten videos take a few seconds.
- Open the Videos view of the dataset, or download it as CSV, Excel or JSON.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Course or tutorial outline | the course playlist | position, title, durationSec, url | Make a syllabus or a watch plan with total hours |
| Audit a channel's playlists | the channel's playlist links | views, likes, publishedAt, unavailableReason | Find weak, private or deleted videos |
| Archive or back up a playlist | any public playlist | videoId, title, channelTitle, addedAt | Keep a record of what was in it |
| Content research | competitor playlists | title, views, durationSec, publishedAt | Compare topics, length and reach |
| Catalog for an app or model | many playlists | all fields | Join on videoId or playlistId |
Tips for better results
- Filter by status ok to keep only playable videos.
- Private and deleted videos keep their position, so the order stays right.
- Refresh view and like counts with a new run. Old numbers go out of date.
Limits and good to know
Data comes from the YouTube Data API v3 under your own key and Google project. Please follow the YouTube API Services Terms of Service: they say you should not keep statistics such as views and likes for more than 30 days without refreshing them. Refresh them with a new run, or delete old datasets. This Actor is not affiliated with or endorsed by YouTube or Google.
- Up to 100 playlists per run and up to 20,000 entries per playlist. We tested one run with 20,000 videos: done in about 300 seconds, 801 quota units, 79 MB of memory
- YouTube itself gives at most 20,000 entries for a channel's uploads (
UU…) playlist, so very big channels are cut there - The default run timeout is 600 seconds. For more than about 30,000 videos in one run, set a higher timeout in the run options. The Actor stops reading at 30 minutes or 20 seconds before the timeout, whichever comes first, keeps the saved rows and ends as
PARTIALwith reasonTIME_LIMIT - If your daily quota runs out during a run, the Actor keeps the rows it saved, ends as
PARTIALwith reasonQUOTA_LIMIT, and the run SUCCEEDED. Run the rest after the quota resets - If Google keeps failing for two playlists in a row, the run keeps saved rows and ends with reason
SOURCE_ERROR - Counts are live at
fetchedAtand change all the time
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "ok",
"playlistId": "PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
"playlistTitle": "Coding Challenges",
"playlistChannelTitle": "The Coding Train",
"playlistUrl": "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
"position": 1,
"videoId": "17WoOqgXsRM",
"url": "https://www.youtube.com/watch?v=17WoOqgXsRM&list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
"title": "Coding Challenge 1: Starfield Simulation",
"description": "This is the first in a new series of vid…",
"channelTitle": "The Coding Train",
"channelId": "UCvjgXvBlbQiydffZU7m1_aw",
"publishedAt": "2016-04-13T03:17:50Z",
"addedAt": "2016-04-13T03:17:51Z",
"durationSec": 834,
"duration": "PT13M54S",
"views": 1389218,
"likes": 29580,
"comments": 1386,
"thumbnailUrl": "https://i.ytimg.com/vi/17WoOqgXsRM/maxresdefault.jpg",
"privacyStatus": "public",
"unavailableReason": null,
"errorCode": null,
"message": null,
"input": "https://youtu.be/17WoOqgXsRM?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH",
"source": "youtube-data-api-v3",
"fetchedAt": "2026-10-22T05:14:19.638Z"
}Data fields (27)
| Field | Type | Meaning |
|---|---|---|
status | string | Row result. ok = a public or unlisted video (charged as playlist-video). unavailable, not_found and invalid_input rows are charged as a small empty-result. api_key_required, api_key_error, quota_exceeded and error rows are not charged. |
playlistId | string | Playlist ID (PL…, UU…, OL…). |
playlistTitle | string | Playlist title. |
playlistChannelTitle | string | Channel that owns the playlist. |
playlistUrl | string | Link to the playlist. |
position | integer | 1-based position in the playlist, as YouTube shows it. |
videoId | string | YouTube video ID. |
url | string | Watch link that opens the video inside the playlist. |
title | string | Video title. |
description | string | Video description as returned by YouTube. |
channelTitle | string | Channel that uploaded the video (may differ from the playlist owner). |
channelId | string | Uploader channel ID. |
publishedAt | string | When the video was published (ISO 8601, UTC). |
addedAt | string | When the video was added to the playlist (ISO 8601, UTC). |
durationSec | integer | Length in seconds; null for live/upcoming streams or when includeStats is off. |
duration | string | Length as ISO 8601 duration (PT1H2M3S). |
views | integer | View count; null if hidden or includeStats is off. |
likes | integer | Like count; null if hidden by the owner or includeStats is off. |
comments | integer | Comment count; null if comments are off or includeStats is off. |
thumbnailUrl | string | Largest available thumbnail URL. |
privacyStatus | string | public, unlisted, private or privacyStatusUnspecified (deleted). |
unavailableReason | string | For status = unavailable: private or deleted. |
errorCode | string | Machine code on status rows, e.g. PLAYLIST_NOT_FOUND, API_KEY_INVALID, QUOTA_EXCEEDED. |
message | string | Plain-English explanation on status rows. |
input | string | Your input entry this row comes from. |
source | string | Always youtube-data-api-v3. |
fetchedAt | string | When this run fetched the data (ISO 8601). |
Input settings (4)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| YouTube Data API key | apiKey | string | |
| Playlist URLs or IDs required | playlistUrls | array | ["https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH"] |
| Max videos per playlist | maxItems | integer | 10 |
| Include duration and view/like/comment counts | includeStats | boolean | true |