YouTube Scraper: Videos, Shorts, Channels & Comments
Pricing
from $1.00 / 1,000 results
YouTube Scraper: Videos, Shorts, Channels & Comments
Fast YouTube scraper with no browser and no API key: keyword search with filters, channel videos and Shorts, channel About data, playlists, video details (exact likes, date, description) and comments with replies. $1.00 per 1,000 results.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
subimpact
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
4
Monthly active users
6 days ago
Last modified
Categories
Features
Share
Fast, keyless YouTube scraper built on plain HTTPS calls to YouTube's internal API. No key, no login,
no headless browser. Keyword search (with sort and date filters), channel videos and Shorts tabs,
playlists, single video details (exact likes, exact publish date, full description, comment count) and
comment scraping, all in one run. Channel and playlist uploads can also come from YouTube's public
Atom feed (channelSource: "rss"), which makes watching many channels for new uploads cheap.
Pay per result: $1.00 per 1,000 results. You are charged $0.001 per delivered row and never for empty or failed work. Platform usage (compute, memory) is included in the price; it is small because the actor is a lightweight HTTP client, not a browser.
How this compares
Plain HTTPS calls to YouTube's internal API: no key, no login and no headless browser, so the compute it uses is small. One run covers keyword search with sort and date filters, channel videos and Shorts tabs, playlists, single video details and comments. At $1.00 per 1,000 results it is below the four most-used alternatives in this lane: streamers/youtube-scraper ($4.00) and streamers/youtube-shorts-scraper ($4.00), streamers/youtube-comments-scraper ($2.00) and streamers/youtube-channel-scraper ($1.30). For channel monitoring, channelSource: "rss" turns a channel list into a cheap new-upload feed (one small request per channel) and onlyNewVideos skips what an earlier run already delivered. Transcripts and media downloads are not offered (see the caveats below); pintostudio/youtube-transcript-scraper covers transcripts at $10.00 per 1,000 items.
| Actor | Price per 1,000 results | Platform usage |
|---|---|---|
| subimpact/youtube-scraper | $1.00 | Included |
| streamers/youtube-scraper | $4.00 | see listing |
| streamers/youtube-comments-scraper | $2.00 | see listing |
| streamers/youtube-channel-scraper | $1.30 | see listing |
| streamers/youtube-shorts-scraper | $4.00 | see listing |
Prices are Apify Store list prices on the Free plan, checked 24 October 2026. Competitor prices can change; check their listings.
What it scrapes
| Mode | Source | You get |
|---|---|---|
| Keyword search | searchQueries | Videos (and optionally Shorts) with title, duration, views, publish text, channel, thumbnail |
| Channel URL | startUrls (/@handle, /channel/, /c/, /user/) | Videos-tab or Shorts-tab items (or both), plus one channel row with subscribers, lifetime views, About info and external links |
| Playlist URL | startUrls (?list=) | Videos in playlist order |
| Video URL | startUrls (/watch?v=, youtu.be, /shorts/, /live/) | Full video details: exact likes, exact publish date, full description, comment count |
| Comments | scrapeComments | Top or Newest comments with author, like count, reply count, and optionally replies |
| Channel or playlist uploads feed | channelSource: "rss" | The 15 newest uploads from YouTube's public Atom feed, with exact views, likes, publish timestamp and description |
Input modes
{"searchQueries": ["python tutorial", "coldplay viva la vida"],"searchSortBy": "views","searchUploadDate": "year","maxResultsPerQuery": 100}
{"startUrls": [{ "url": "https://www.youtube.com/@MrBeast" }],"channelContent": "both","maxVideosPerChannel": 200,"includeChannelInfo": true}
{"startUrls": [{ "url": "https://www.youtube.com/playlist?list=PL4fGSI1pDJn6puJdseH2Rt9sMvt9E2M4i" }],"maxVideosPerChannel": 500}
{"startUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],"scrapeComments": true,"commentsSortBy": "top","maxCommentsPerVideo": 100,"includeReplies": true,"enrichVideoDetails": true}
You can mix modes: searchQueries and startUrls run together in one run.
Monitor channels for new uploads (RSS mode)
channelSource: "rss" switches channel URLs (and playlist URLs) from the channel tabs to YouTube's
public uploads feed: https://www.youtube.com/feeds/videos.xml?channel_id=.... It needs no key and one
small request per channel, so watching a few hundred channels is quick and cheap. Use it with a
schedule (for example every 30 minutes) and onlyNewVideos: true to pay only for uploads you have not
seen before.
{"startUrls": [{ "url": "https://www.youtube.com/@MrBeast" },{ "url": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ" },{ "url": "UCXuqSBlHAE6Xw-yeJA0Tunw" },{ "url": "https://www.youtube.com/feeds/videos.xml?playlist_id=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI" }],"channelSource": "rss","onlyNewVideos": true,"includeChannelInfo": false,"maxVideosPerChannel": 15}
In RSS mode startUrls accepts @handle, /channel/UC..., /c/, /user/ URLs, bare channel ids
(UC plus 22 characters) and feed URLs themselves. Playlist URLs use the playlist feed
(playlist_id=). Video URLs and searchQueries behave exactly as in tabs mode. Each entry in
startUrls is scraped on its own, so list a channel once.
How the monitor works:
- The feed carries the 15 newest uploads per channel, including Shorts and live streams. That is the whole window: an upload that has already rolled out of the 15 is not in the feed any more. This is the one limit of RSS mode. Run more often if a channel posts more than 15 videos between runs.
onlyNewVideosremembers the video ids it delivered per channel in a named key-value store in your account (stateStoreName, defaultyoutube-scraper-state, at most 500 ids per channel) and skips them on later runs. The state of a channel is saved only after that channel's rows were pushed, so a timed-out run can at worst deliver a few ids twice.publishedAfterskips feed entries older than an ISO date or datetime ("2026-10-01"or"2026-10-01T00:00:00Z"), which is handy for the first run on a list of channels.maxVideosPerChannelcaps the rows per feed as well (the feed itself never returns more than 15).enrichVideoDetails: trueadds the exact duration, exact like count and comment count per video at one extra request per video.includeChannelInfokeeps its tabs-mode meaning: onechannelrow from the channel page, plus one or two requests per channel for the About panel. Set it tofalsewhen monitoring hundreds of channels and you only want the uploads.
When YouTube's feed is down, the actor falls back to the channel tabs. The public feed
sometimes answers 404 for every channel for hours (it did in January 2024 and again in October 2026).
Rather than fail your inputs, the actor then reads the channel's Videos tab (or, for a playlist URL,
the playlist page) through the normal tab lane and takes up to 15 entries. Those rows carry
feedFallback: true and source: "rss", so your filters keep working. They differ from real feed
rows in three ways: viewCount and the other counts come from the tab (rounded, as YouTube shows
them) instead of the feed, publishedText is relative text such as 4 days ago (so publishedDate
is null and publishedAfter is applied as a conservative approximation), and Shorts or live streams
that only the feed listed may be missing. Once the feed answers again, rows return to normal, and
the run summary says how many inputs were served from the fallback lane.
Rows from the feed use the same fields as the other video rows, with source: "rss". The feed has no
duration, so durationText and durationSeconds are null unless you enable enrichVideoDetails.
publishedText is the feed's exact ISO timestamp (for example 2026-10-21T14:00:33+00:00) and
publishedDate its date part. description, viewCount and likeCount come from the feed when it
carries them. One real row from the example input above (trimmed):
{"itemType": "short","source": "rss","input": "https://www.youtube.com/@MrBeast","position": 1,"videoId": "mND4T0lzg_g","url": "https://www.youtube.com/watch?v=mND4T0lzg_g","title": "How People Treat You Based on Subscribers","viewCount": 20837279,"likeCount": 632139,"publishedText": "2026-10-23T18:00:08+00:00","publishedDate": "2026-10-23","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","channelName": "MrBeast","isShort": true,"isLive": false}
Output fields
One dataset row per item. itemType is one of video, short, channel, comment (videos and Shorts
are the same shape; a Short always has isShort: true and no duration because YouTube does not show one
in the Shorts grid). Every row also carries source (search, channel, playlist, video,
comments or rss), input, position (rank within its input) and scrapedAt.
Videos and Shorts:
| Field | Type | Notes |
|---|---|---|
videoId, url, title | string | canonical https://www.youtube.com/watch?v= URL |
description | string/null | full description, only with enrichVideoDetails or a video URL |
durationText, durationSeconds | / integer | 6:15:56 / 22556 |
viewCount, viewCountText | integer / string | 922364, 922,364 views |
likeCount, likeCountText | integer / string | exact 19491363 only with enrichVideoDetails; rounded 19M otherwise when shown |
publishedText, publishedDate | string / ISO date | 4 days ago; exact 2009-10-24 when available |
channelId, channelName, channelHandle, channelUrl | string/null | |
channelSubscriberCount, channelSubscriberCountText | integer / string | only when channel info was fetched |
channelVerified | boolean/null | verification badge |
thumbnailUrl | string | highest-resolution thumbnail YouTube served |
isLive | boolean | true for live streams |
badges | array/null | e.g. ["New", "4K"] |
commentCount, commentCountText | integer / string | only with enrichVideoDetails or video URL |
hashtags | array/null | extracted from the description |
feedFallback | boolean/null | true when the RSS feed was down and the row came from the channel / playlist lane, false for normal feed rows, null for rows of non-RSS inputs |
Channels (one row per channel URL when includeChannelInfo):
| Field | Type | Notes |
|---|---|---|
channelId, channelName, channelHandle, channelUrl | string/null | |
channelDescription, avatarUrl | string/null | |
subscriberCount, subscriberCountText | integer / string | 522000000, 522M subscribers |
videoCount, totalViewCount | integer | 1008, lifetime views |
country, joinedDate | string | United States, 2012-02-19 |
links | array/null | [{ "title": "...", "url": "..." }, ...] |
Comments:
| Field | Type |
|---|---|
commentId, videoId, text | string |
author, authorChannelId | string |
authorIsVerified, authorIsCreator | boolean |
likeCount, likeCountText, replyCount | integer |
publishedText | string (e.g. 6 years ago (edited)) |
isReply, parentCommentId | boolean / string |
Comments get author handles exactly as YouTube displays them (e.g. @grustache4569).
Limits and honest caveats
- No transcripts and no timed captions. Those endpoints are blocked from datacenter IPs; the actor does not call them.
- No video or audio download. The
playerendpoint is blocked for anonymous datacenter access, so stream URLs cannot be provided. - Duration for a bare video URL comes from a search lookup (
searchby the video id and an exact-match read) and can benullwhen the video is too new to appear in search. - Counts like "119M views" or "522M subscribers" are YouTube's rounded display figures. Exact view counts are available for videos with details; exact subscriber counts are never exposed without login.
- Exact like counts are only available when the video page itself is fetched (default for video URLs,
optional via
enrichVideoDetailsfor search/channel results; one extra request per video). - RSS mode returns at most the 15 newest uploads per channel or playlist because that is all the feed contains. Check the schedule interval against how often a channel posts.
maxTotalResults(default 1,000) is a hard global stop on all rows so a single run cannot snowball.- Proxies are optional: the scrape works over plain HTTPS from datacenter IPs. Enable Apify Proxy only for very high volumes if you see rate limiting (429s are retried automatically with backoff).
FAQ
Do I need an API key? No.
Is a proxy required? No, but you can enable one: {"proxyConfiguration": {"useApifyProxy": true}}.
What does it cost? $1.00 per 1,000 delivered results ($0.001 each), with platform usage included. You are never charged for rows that failed to be delivered.
Can I get comments only? Yes: pass a video URL with scrapeComments and the video row (1 result)
plus comment rows.
Can I mix search and URLs? Yes: searchQueries and startUrls are combined in a single run,
processed with up to maxConcurrency inputs at a time.
How do I watch a channel for new uploads? Use channelSource: "rss" with onlyNewVideos: true and
run the actor on a schedule (see "Monitor channels for new uploads (RSS mode)" above).