Vexaloom Labs

YouTube Playlist Contents & Channel Playlist Finder

List every video in a YouTube playlist, or discover every public playlist a channel owns, with titles, durations, thumbnails, and playlist metadata.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
playlistUrlsarrayoptionalYouTube playlist URLs, watch URLs with a list parameter, or bare playlist IDs whose videos you want. Combine with Channel URLs or Search Queries in one run.
channelUrlsarrayoptionalChannel handles, URLs, or channel IDs. The actor lists every public playlist, show, course, podcast, and album on each channel.
searchQueriesarrayoptionalKeywords to search for public playlists and courses, for example "python course" or "lofi study". Up to 20 queries per run.
Show all input fields
FieldTypeRequiredDescription
playlistUrlsarrayoptionalYouTube playlist URLs, watch URLs with a list parameter, or bare playlist IDs whose videos you want. Combine with Channel URLs or Search Queries in one run.
channelUrlsarrayoptionalChannel handles, URLs, or channel IDs. The actor lists every public playlist, show, course, podcast, and album on each channel.
searchQueriesarrayoptionalKeywords to search for public playlists and courses, for example "python course" or "lofi study". Up to 20 queries per run.
maxPlaylistsintegeroptionalMaximum number of collections to list per channel.
maxSearchResultsintegeroptionalMaximum number of playlist results to return for each search query.
maxVideosintegeroptionalMaximum number of rows to return per playlist. Set to 0 for every video. Unavailable placeholders count toward the limit when enabled.
includeUnavailableVideosbooleanoptionalEmit a placeholder row for each deleted, private, or hidden playlist entry, with its real position and thumbnail.
includeVideoDetailsbooleanoptionalAdd exact views, likes, publish date, description, category, and tags for every available video. Turn off for a faster listing-only run.

Download the published input schema

View complete JSON
{
  "properties": {
    "channelUrls": {
      "description": "Channel handles, URLs, or channel IDs. The actor lists every public playlist, show, course, podcast, and album on each channel.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "title": "Channel URLs (list their playlists)",
      "type": "array"
    },
    "includeUnavailableVideos": {
      "default": false,
      "description": "Emit a placeholder row for each deleted, private, or hidden playlist entry, with its real position and thumbnail.",
      "prefill": false,
      "title": "Include Unavailable Videos",
      "type": "boolean"
    },
    "includeVideoDetails": {
      "default": true,
      "description": "Add exact views, likes, publish date, description, category, and tags for every available video. Turn off for a faster listing-only run.",
      "prefill": true,
      "title": "Include Exact Video Details",
      "type": "boolean"
    },
    "maxPlaylists": {
      "default": 100,
      "description": "Maximum number of collections to list per channel.",
      "editor": "number",
      "maximum": 10000,
      "minimum": 1,
      "title": "Max Playlists Per Channel",
      "type": "integer"
    },
    "maxSearchResults": {
      "default": 20,
      "description": "Maximum number of playlist results to return for each search query.",
      "editor": "number",
      "maximum": 100,
      "minimum": 1,
      "title": "Max Results Per Search",
      "type": "integer"
    },
    "maxVideos": {
      "default": 0,
      "description": "Maximum number of rows to return per playlist. Set to 0 for every video. Unavailable placeholders count toward the limit when enabled.",
      "editor": "number",
      "maximum": 10000,
      "minimum": 0,
      "prefill": 3,
      "title": "Max Videos Per Playlist",
      "type": "integer"
    },
    "playlistUrls": {
      "description": "YouTube playlist URLs, watch URLs with a list parameter, or bare playlist IDs whose videos you want. Combine with Channel URLs or Search Queries in one run.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [
        "https://www.youtube.com/playlist?list=PLgzTt0k8mXzEk586ze4BjvDXR7c-TUSnx"
      ],
      "title": "Playlist URLs",
      "type": "array"
    },
    "searchQueries": {
      "description": "Keywords to search for public playlists and courses, for example \"python course\" or \"lofi study\". Up to 20 queries per run.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "title": "Playlist Search Queries",
      "type": "array"
    }
  },
  "schemaVersion": 1,
  "title": "YouTube Playlist Scraper Input",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
resultsstringoptionalDataset containing playlist videos, channel collections, search results, and status rows.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Playlist video rows with exact views, likes, publish dates and unavailable placeholders, plus channel collection and playlist-search rows.",
  "properties": {
    "results": {
      "description": "Dataset containing playlist videos, channel collections, search results, and status rows.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "YouTube Playlist Scraper dataset",
      "type": "string"
    }
  },
  "title": "YouTube Playlist Contents & Channel Playlist Finder Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "views": {
    "detailed": {
      "display": {
        "component": "table",
        "properties": {
          "channelName": {
            "format": "text",
            "label": "Channel"
          },
          "duration": {
            "format": "text",
            "label": "Duration"
          },
          "isAvailable": {
            "format": "boolean",
            "label": "Available"
          },
          "likeCount": {
            "format": "number",
            "label": "Likes"
          },
          "playlistOwner": {
            "format": "text",
            "label": "Owner"
          },
          "playlistTitle": {
            "format": "text",
            "label": "Playlist"
          },
          "playlistType": {
            "format": "text",
            "label": "Collection Type"
          },
          "playlistUnavailableVideoCount": {
            "format": "number",
            "label": "Unavailable"
          },
          "playlistVideoCount": {
            "format": "number",
            "label": "Playlist Videos"
          },
          "position": {
            "format": "number",
            "label": "#"
          },
          "publishedAt": {
            "format": "text",
            "label": "Published"
          },
          "recordType": {
            "format": "text",
            "label": "Type"
          },
          "scrapedAt": {
            "format": "text",
            "label": "Scraped At"
          },
          "searchQuery": {
            "format": "text",
            "label": "Search Query"
          },
          "searchRank": {
            "format": "number",
            "label": "Rank"
          },
          "title": {
            "format": "text",
            "label": "Title"
          },
          "url": {
            "format": "link",
            "label": "URL"
          },
          "videoCount": {
            "format": "number",
            "label": "Collection Videos"
          },
          "videoId": {
            "format": "text",
            "label": "Video ID"
          },
          "viewCount": {
            "format": "number",
            "label": "Views"
          }
        }
      },
      "title": "Detailed",
      "transformation": {
        "fields": [
          "recordType",
          "position",
          "videoId",
          "title",
          "url",
          "duration",
          "durationSeconds",
          "isAvailable",
          "isLiveContent",
          "viewCount",
          "viewCountText",
          "likeCount",
          "publishedAt",
          "publishedTimeText",
          "videoDescription",
          "videoCategory",
          "videoKeywords",
          "videoChannelName",
          "videoChannelId",
          "videoChannelHandle",
          "videoChannelUrl",
          "playlistId",
          "playlistTitle",
          "playlistUrl",
          "playlistType",
          "playlistVideoCount",
          "playlistAvailableVideoCount",
          "playlistUnavailableVideoCount",
          "playlistTotalDuration",
          "playlistTotalDurationSeconds",
          "playlistOwner",
          "playlistOwnerChannelId",
          "playlistOwnerHandle",
          "playlistDescription",
          "playlistViewCount",
          "playlistVisibility",
          "lastUpdated",
          "lastUpdatedDate",
          "channelName",
          "channelId",
          "channelHandle",
          "channelUrl",
          "videoCount",
          "videoCountText",
          "searchQuery",
          "searchRank",
          "scrapedAt"
        ]
      }
    },
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "duration": {
            "format": "text",
            "label": "Duration"
          },
          "playlistTitle": {
            "format": "text",
            "label": "Playlist"
          },
          "playlistType": {
            "format": "text",
            "label": "Collection Type"
          },
          "position": {
            "format": "number",
            "label": "#"
          },
          "recordType": {
            "format": "text",
            "label": "Type"
          },
          "searchQuery": {
            "format": "text",
            "label": "Search Query"
          },
          "title": {
            "format": "text",
            "label": "Title"
          },
          "url": {
            "format": "link",
            "label": "URL"
          },
          "videoChannelName": {
            "format": "text",
            "label": "Channel"
          },
          "videoCount": {
            "format": "number",
            "label": "Videos"
          },
          "videoId": {
            "format": "text",
            "label": "Video ID"
          },
          "viewCount": {
            "format": "number",
            "label": "Views"
          }
        }
      },
      "title": "Overview",
      "transformation": {
        "fields": [
          "recordType",
          "position",
          "title",
          "videoId",
          "playlistTitle",
          "playlistType",
          "viewCount",
          "duration",
          "videoChannelName",
          "videoCount",
          "searchQuery",
          "url"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

YouTube Playlist Contents & Channel Playlist Finder

Collect every video in a YouTube playlist, discover all of a channel's public collections, and search YouTube for playlists by keyword. Every available video can carry exact views, likes, publish date, description, category, and tags, while deleted or private entries can be returned as clearly marked placeholders with their real positions.

What this actor does

  • Playlist contents — every public video in one or many playlists, including 1,000+ item playlists
  • Hidden unavailable entries — optional placeholder rows for deleted, private, or removed videos, preserving their true position
  • Exact video details — views, likes, ISO publish date, description, category, tags, live status, and all thumbnail sizes
  • Channel collections — playlists, shows, courses, podcasts, and albums with their real video/episode counts
  • Playlist search — keyword search across public playlists and courses, ranked per query
  • Mixed runs — combine playlist URLs, channel URLs, and search queries in one input
  • Empty fields are omitted from every record

Output: per video (playlistUrls mode)

  • recordType — video
  • position — the video's real position in the playlist, counting hidden entries
  • videoId, title, url, thumbnailUrl, thumbnails[]
  • duration, durationSeconds
  • isAvailable — false for placeholder rows
  • viewCount, viewCountText — exact views from the video page
  • likeCount — exact likes when YouTube exposes them
  • publishedAt — ISO 8601 date/time
  • publishedTimeText — the relative label shown in the playlist
  • videoDescription, videoCategory, videoKeywords[], isLiveContent
  • videoChannelName, videoChannelId, videoChannelHandle, videoChannelUrl — the video's uploader
  • playlistId, playlistTitle, playlistUrl, playlistType
  • playlistVideoCount — the count YouTube declares for the playlist
  • playlistAvailableVideoCount, playlistUnavailableVideoCount
  • playlistTotalDurationSeconds, playlistTotalDuration
  • playlistOwner, playlistOwnerChannelId, playlistOwnerHandle, playlistDescription, playlistViewCount
  • playlistThumbnailUrl, playlistVisibility
  • lastUpdated, lastUpdatedDate — the latter only when the label contains an exact date
  • scrapedAt

Placeholder rows keep recordType, videoId, position, thumbnailUrl, playlist context, and isAvailable: false. YouTube does not reveal the title or channel of a hidden entry, so those fields are omitted.

Output: per playlist (channelUrls mode)

  • recordType — playlist
  • playlistId, playlistUrl, title, playlistType — playlist, show, course, podcast, album, radio_mix, or uploads
  • videoCount, videoCountText — for example 28 and "28 episodes"
  • thumbnailUrl
  • firstVideoId, firstVideoUrl — where the collection starts
  • channelName, channelId, channelHandle, channelUrl, channelAvatarUrl
  • lastUpdated — when the card shows an update label
  • scrapedAt

Output: per search result (searchQueries mode)

  • recordType — playlist
  • searchQuery, searchRank
  • playlistId, playlistUrl, title, playlistType
  • channelName, channelId, channelHandle, channelUrl
  • thumbnailUrl, firstVideoId, firstVideoUrl
  • scrapedAt

Search cards do not show a reliable video count, so videoCount is omitted. Pass a returned playlist ID to playlistUrls to collect its contents.

Output: status and error rows

If a playlist, channel, or query cannot be read, the dataset still receives a row with recordType: "status" or "error", the relevant input, and a plain-language message, so an empty dataset never hides a failure.

Input

Field Type Default Description
playlistUrls array – Playlist URLs, watch URLs with list=, or bare playlist IDs
channelUrls array – Channel handles, URLs, or channel IDs whose collections you want
searchQueries array – Playlist search terms, up to 20 per run
maxPlaylists integer 100 Maximum collections to list per channel
maxSearchResults integer 20 Maximum results per search query
maxVideos integer 0 Maximum rows per playlist; 0 returns everything
includeUnavailableVideos boolean false Emit placeholder rows for hidden playlist entries
includeVideoDetails boolean true Add exact per-video metrics, dates, descriptions, categories, and tags

Supported playlist formats include youtube.com/playlist?list=..., youtube.com/watch?v=...&list=..., music.youtube.com/playlist?list=..., youtu.be/...?list=..., and bare IDs such as PL..., UU..., RD..., or OL....

Example: full playlist with exact video details

{
    "playlistUrls": ["https://www.youtube.com/playlist?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU"],
    "maxVideos": 50,
    "includeVideoDetails": true
}

Example: recover hidden entries from a damaged playlist

{
    "playlistUrls": ["PLhMDlPcDRBKQsawQMVty_dNztC8QgppML"],
    "includeUnavailableVideos": true,
    "includeVideoDetails": false
}

Example: discover every collection on a channel

{
    "channelUrls": ["@kurzgesagt"],
    "maxPlaylists": 50
}

Example: search playlists and collect one result in the same run

{
    "searchQueries": ["python course", "lofi study music"],
    "maxSearchResults": 10,
    "playlistUrls": ["PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU"],
    "maxVideos": 20
}

Use cases

  • Course catalogs — export every lesson, its position, duration, and publish date from an educational playlist
  • Playlist backups — snapshot a playlist's contents and see which entries have disappeared
  • Podcast and show indexing — discover a channel's podcast, show, and course collections with episode counts
  • Content research — search a topic, compare playlist titles and owners, then pull the winners' full contents
  • Channel audits — inventory every public collection a creator has published
  • Viewership analysis — compare exact views and likes across videos in the same playlist

FAQ

How many videos can one playlist return? YouTube allows up to 5,000 entries in a public playlist. The actor reads through the entire list and reports what the source actually exposes.

Why is playlistVideoCount larger than the number of rows? The declared count includes entries YouTube hides from the normal list. Set includeUnavailableVideos to true to receive a placeholder for each hidden entry. playlistAvailableVideoCount and playlistUnavailableVideoCount show the split.

Why do some exact fields appear on one video but not another? YouTube hides like counts on some videos and does not publish a category or tags for every upload. Those fields are omitted rather than estimated; the rest of the record stays intact. publishedAt contains a full timestamp when YouTube exposes one and a calendar date when only the date is available.

Do I need a YouTube API key, login, or proxy? No. The actor reads public YouTube data with no account, key, cookie, or proxy setup.

Why is playlistViewCount missing on some playlists? YouTube does not display an aggregate view count for every collection type, such as auto-generated radio mixes. When the source has no count, the field is omitted.

Can I scrape private or personal playlists? No. Playlists such as Watch Later, Liked Videos, and other account-only lists are not publicly readable and are out of scope.

Why do search results omit videoCount? Playlist search cards do not show a video count. The actor returns the result identity and ranking; use the returned playlist ID with playlistUrls to get the full contents and counts.

What does playlistOwner contain? The owner's display name without the interface prefix, for example Timeline - World History Documentaries rather than by Timeline - World History Documentaries.

Is this actor affiliated with YouTube? No. It is an independent tool that reads publicly visible YouTube pages and is not operated or endorsed by YouTube or Google.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build swYZ3TQrDebcdec5a. Documentation is regenerated from the default published build; private drafts are not included.