Skip to content
    ↑↓ to choose · Enter to open

    · 13 min read

    YouTube Playlist Scraper: 24 Data Fields per Record (2026)

    By CrawlerBros Engineering Team

    Each playlist record carries 24 output fields, including video positions, precise durations in seconds, uploader channel details, and comprehensive playlist-level metadata. The data collector uses a fast, HTTP-first scraping protocol, automatically falling back to Playwright only when necessary to bypass structural obstacles. A thousand playlist items cost $5.00 on the free-plan tier, and the run-start fee is charged on every run regardless of the output. This Actor is built specifically for researchers and developers cataloging structured video sequences, tracklists, or video series; it is not for those looking to scrape user comments or channel-wide metrics.

    Try it: open YouTube Playlist Scraper on Apify, sign in on the free plan and run the prefilled example.

    Can you try YouTube Playlist Scraper before paying?

    Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of YouTube Playlist Scraper a month, before run-start charges and platform usage.

    The example request further down caps maxVideos at 10, so a first run returns at most 10 results and costs at most $0.05 in result charges. That is enough to see the real shape of the data before deciding anything.

    YouTube Playlist Scraper was last updated on 2026-06-22. It is one of 1,725 Actors CrawlerBros publishes on Apify, which together have 668,977 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.

    What does it cost to run YouTube Playlist Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.05 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    The primary control impacting your bill is playlistUrls, combined with maxVideos. Setting maxVideos to 0 fetches every item in a playlist, which will consume more results and increase your dataset costs. To test your integration cheaply, run the Actor with maxVideos capped at 10 to keep result charges at $0.05.

    How do you run YouTube Playlist Scraper from the API?

    The schema marks 1 of its 4 controls as required: playlistUrls. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for YouTube Playlist Scraper, so the request works once your token is in place.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~youtube-playlist-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"playlistUrls":["https://www.youtube.com/playlist?list=PLgzTt0k8mXzEk586ze4BjvDXR7c-TUSnx"],"maxVideos":10,"includeUnavailableVideos":false,"market":"US"}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "playlistUrls": [
        "https://www.youtube.com/playlist?list=PLgzTt0k8mXzEk586ze4BjvDXR7c-TUSnx"
      ],
      "maxVideos": 10,
      "includeUnavailableVideos": False,
      "market": "US"
    }
    
    run = client.actor("crawlerbros~youtube-playlist-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "playlistUrls": [
        "https://www.youtube.com/playlist?list=PLgzTt0k8mXzEk586ze4BjvDXR7c-TUSnx"
      ],
      "maxVideos": 10,
      "includeUnavailableVideos": false,
      "market": "US"
    }
    
    const run = await client.actor('crawlerbros~youtube-playlist-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.

    Which YouTube Playlist Scraper inputs matter, and which can you skip?

    The input schema requires only the playlistUrls field, which accepts full YouTube URLs or raw playlist IDs. Most users should leave includeUnavailableVideos set to false on their first run to avoid cluttering the dataset with deleted items. Set the market parameter to localize the language of the returned metadata to a specific region.

    • playlistUrls (array): YouTube playlist URLs or playlist IDs. Supports full URLs (youtube.com/playlist?list=...) or bare playlist IDs (PLxxxxxx).
    • maxVideos (integer): Maximum number of videos to scrape per playlist. Set to 0 to get all videos. Default: 0.
    • includeUnavailableVideos (boolean): When videos are hidden/private in a playlist, emit placeholder rows with isAvailable=false. Default: false.
    • market (string): YouTube market/region for playlist page language. Affects the language of metadata returned. Default: "US".

    Fixed-choice controls: market accepts 31 values (default US), including US (United States), GB (United Kingdom), CA (Canada), AU (Australia).

    What does YouTube Playlist Scraper return?

    The output records are ideal for mapping video structures, indexing video series, and monitoring changes in playlist ordering. They conspicuously do not contain raw video files, comments, or detailed channel descriptions. If your project requires downloading the actual video files, consider using another tool.

    • position: number - Position in playlist (1-based)
    • videoId: string - YouTube video ID
    • title: string - Video title
    • url: string - Full video URL with playlist context
    • thumbnailUrl: string - Highest resolution thumbnail
    • duration: string - Duration as "H:MM:SS" or "M:SS"
    • durationSeconds: number - Duration in seconds
    • isAvailable: boolean - Whether the video is playable
    • viewCountText: string - View count display text (e.g. "1.2M views")
    • publishedTimeText: string - Relative publish time (e.g. "3 years ago")
    • videoChannelName: string - Video uploader channel name
    • videoChannelId: string - Video uploader channel ID
    • videoChannelUrl: string - Video uploader channel URL
    • playlistId: string - Playlist ID
    • playlistTitle: string - Playlist title
    • playlistUrl: string - Full playlist URL
    • playlistVideoCount: number - Total videos in playlist
    • playlistViewCount: integer - Total views across the playlist
    • playlistOwner: string - Playlist creator name
    • playlistOwnerChannelId: string - Playlist owner channel ID
    • playlistOwnerHandle: string - Playlist owner handle (e.g. "@channel")
    • playlistDescription: string - Playlist description
    • lastUpdated: string - Last-updated text (e.g. "Updated 2 days ago")
    • scrapedAt: string - ISO 8601 timestamp

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open YouTube Playlist Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Locate the target playlist on YouTube and copy its full URL or extract the bare ID starting with PL, RD, UU, OL, LL, FL, or WL.
    2. Paste the URL or ID into the playlistUrls array in the Actor input tab.
    3. Set the maxVideos parameter to 10 for an initial test run, which caps result charges at $0.05 before the run-start fee and platform usage.
    4. Toggle includeUnavailableVideos to true if you need placeholder rows to maintain accurate position indexing for deleted or hidden videos.
    5. Select the appropriate market identifier from the drop-down menu to ensure metadata is returned in your target language.
    6. Run the Actor and open the dataset viewer once the run finishes.
    7. Export the results as JSON or CSV and verify that output fields like position, videoId, and durationSeconds are populated.
    8. Increase maxVideos to 0 when you are ready to fetch all items, letting the automated pagination process the entire playlist.

    How do you apply it? Three worked playbooks

    These are YouTube Playlist Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Course content cataloging

    Outcome: Map every lesson in an online course playlist

    Configure: Set playlistUrls to ["https://www.youtube.com/playlist?list=PLgzTt0k8mXzEk586ze4BjvDXR7c-TUSnx"], maxVideos to 0, and includeUnavailableVideos to true.

    Working method: Run the Actor on the educational playlist URL. Inspect the exported dataset to verify that the position field aligns with the lesson order, and use durationSeconds to calculate the total runtime of the curriculum.

    Deliverable: A spreadsheet mapping the exact course structure, containing video titles, video IDs, positions, and durations.

    Stop condition: The script finishes but playlistVideoCount does not match the number of rows, or critical lessons are missing due to isAvailable returning false.

    Use case 2: Music playlist archival

    Outcome: Back up your saved playlists before they change

    Configure: Set playlistUrls to your target music playlist ID, maxVideos to 0, and includeUnavailableVideos to true.

    Working method: Execute the run to capture the current state of the tracklist. Compare the videoId values against a previous archive run to isolate which tracks have been removed, added, or made unavailable.

    Deliverable: A historical JSON snapshot file of the playlist containing video titles, channel names, and high-resolution thumbnail URLs.

    Stop condition: The runner completes but returns empty titles for videos that were recently deleted, indicating you must check the isAvailable flag.

    Use case 3: Competitor content research

    Outcome: Analyze what videos a brand has organized into playlists

    Configure: Set playlistUrls to the competitor's public playlist URLs, maxVideos to 0, and market to "US".

    Working method: Run the scraper across the list of competitor playlists. Aggregate the resulting dataset by videoChannelId and examine the viewCountText and publishedTimeText fields to evaluate which playlist categories generate the highest viewer engagement.

    Deliverable: An analytical report of the competitor's structured video assets, showing video distribution and view engagement across playlists.

    Stop condition: The scraper completes but returns empty playlistOwner or playlistTitle fields, indicating the playlist may have been set to private.

    What breaks, and how do you design around it?

    When playlists exceed the 5,000-video limit set by YouTube, the platform itself caps the list, meaning no scraper can access the hidden videos. If you hit this limit, look for sub-playlists or channel uploads to segment the data. For private playlists, you will receive empty datasets, so ensure all target URLs are public before running.

    When should you not use YouTube Playlist Scraper?

    Do not use this Actor if you need to extract the underlying video files themselves; instead, use YouTube Video Downloader to save the media. If you need to search for video playlists based on search terms rather than scraping specific playlist IDs, YouTube Search Scraper is the better choice. If your goal is to extract deep video metrics like comments, transcripts, or creator emails, you should use YouTube Video Details Scraper or YouTube Email Scraper respectively, as this tool is strictly limited to playlist structure and metadata.

    What should you check before trusting the output?

    • Verify that position values are sequential and do not skip integers unless includeUnavailableVideos is set to false.
    • Check that durationSeconds contains a valid positive integer rather than null for all playable video entries.
    • Assert that playlistVideoCount matches the total number of rows returned when maxVideos is set to 0.
    • Validate that isAvailable is false for any returned rows where title or videoChannelName is empty or shows placeholder text.
    • Confirm that the scrapedAt timestamp is in valid ISO 8601 format and matches the execution day.

    None of this proves a record is correct. It gives a scheduled YouTube Playlist Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    What is the exact cost to scrape a playlist with 500 videos?

    At the free-plan rate of $5.00 per 1,000 results, scraping 500 video items costs $2.50 in result charges. Please note that Apify also bills platform usage for memory and CPU run-time on top of this result charge, and a run-start fee is charged for every execution.

    Does this scraper require a YouTube API key to run?

    No. The scraper accesses public web interfaces directly using an HTTP-first method and a browser fallback. You do not need to register for a Google Cloud account, generate credentials, or worry about daily API quota limits.

    How do I scrape every video uploaded by a specific channel?

    You can scrape all uploads by finding the channel's hidden uploads playlist ID, which begins with the UU prefix. Input this UU playlist ID directly into the playlistUrls field to retrieve the channel's entire public video history.

    Can I retrieve private or unlisted video details from a playlist?

    Private and deleted videos cannot be fully scraped because their metadata is hidden. However, by enabling includeUnavailableVideos, the Actor will emit placeholder rows with isAvailable set to false, allowing you to maintain correct indexing of the remaining videos.

    How does the Actor handle extremely long playlists?

    The Actor features built-in automatic pagination. It will continue to request next-page tokens and step through the playlist sequentially until it reaches the end of the public playlist or hits your specified maxVideos limit.

    Where to go next

    When you are ready to run it, open YouTube Playlist Scraper on Apify; the free plan covers up to 1,000 results a month.

    Start with the YouTube Playlist Scraper Actor page for the current input schema, pricing tier, and run history.

    It is part of the YouTube Scraping Suite, which puts every related Actor on one page with its price and run history.

    If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:

    Other Actors we maintain for related data:

    Related guides:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-25.

    • Actor last updated by its maintainers on 2026-06-22.

    • Run outcome figures cover the 30 day public window ending 2026-09-25.

    • YouTube Playlist Scraper on Apify

    Featured actors

    Youtube Playlist Scraper

    Scrape all videos from YouTube playlists. Get playlist metadata and complete video listings including titles, durations, thumbnails, and position in playlist.

    Run on Apify ↗