YouTube Scraper: Videos, Shorts, Channels & Comments avatar

YouTube Scraper: Videos, Shorts, Channels & Comments

Pricing

from $1.00 / 1,000 results

Go to Apify Store
YouTube Scraper: Videos, Shorts, Channels & Comments

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

subimpact

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

4

Monthly active users

6 days ago

Last modified

Features

Limited permissions

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.

ActorPrice per 1,000 resultsPlatform usage
subimpact/youtube-scraper$1.00Included
streamers/youtube-scraper$4.00see listing
streamers/youtube-comments-scraper$2.00see listing
streamers/youtube-channel-scraper$1.30see listing
streamers/youtube-shorts-scraper$4.00see 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

ModeSourceYou get
Keyword searchsearchQueriesVideos (and optionally Shorts) with title, duration, views, publish text, channel, thumbnail
Channel URLstartUrls (/@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 URLstartUrls (?list=)Videos in playlist order
Video URLstartUrls (/watch?v=, youtu.be, /shorts/, /live/)Full video details: exact likes, exact publish date, full description, comment count
CommentsscrapeCommentsTop or Newest comments with author, like count, reply count, and optionally replies
Channel or playlist uploads feedchannelSource: "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.
  • onlyNewVideos remembers the video ids it delivered per channel in a named key-value store in your account (stateStoreName, default youtube-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.
  • publishedAfter skips 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.
  • maxVideosPerChannel caps the rows per feed as well (the feed itself never returns more than 15).
  • enrichVideoDetails: true adds the exact duration, exact like count and comment count per video at one extra request per video.
  • includeChannelInfo keeps its tabs-mode meaning: one channel row from the channel page, plus one or two requests per channel for the About panel. Set it to false when 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:

FieldTypeNotes
videoId, url, titlestringcanonical https://www.youtube.com/watch?v= URL
descriptionstring/nullfull description, only with enrichVideoDetails or a video URL
durationText, durationSeconds/ integer6:15:56 / 22556
viewCount, viewCountTextinteger / string922364, 922,364 views
likeCount, likeCountTextinteger / stringexact 19491363 only with enrichVideoDetails; rounded 19M otherwise when shown
publishedText, publishedDatestring / ISO date4 days ago; exact 2009-10-24 when available
channelId, channelName, channelHandle, channelUrlstring/null
channelSubscriberCount, channelSubscriberCountTextinteger / stringonly when channel info was fetched
channelVerifiedboolean/nullverification badge
thumbnailUrlstringhighest-resolution thumbnail YouTube served
isLivebooleantrue for live streams
badgesarray/nulle.g. ["New", "4K"]
commentCount, commentCountTextinteger / stringonly with enrichVideoDetails or video URL
hashtagsarray/nullextracted from the description
feedFallbackboolean/nulltrue 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):

FieldTypeNotes
channelId, channelName, channelHandle, channelUrlstring/null
channelDescription, avatarUrlstring/null
subscriberCount, subscriberCountTextinteger / string522000000, 522M subscribers
videoCount, totalViewCountinteger1008, lifetime views
country, joinedDatestringUnited States, 2012-02-19
linksarray/null[{ "title": "...", "url": "..." }, ...]

Comments:

FieldType
commentId, videoId, textstring
author, authorChannelIdstring
authorIsVerified, authorIsCreatorboolean
likeCount, likeCountText, replyCountinteger
publishedTextstring (e.g. 6 years ago (edited))
isReply, parentCommentIdboolean / 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 player endpoint is blocked for anonymous datacenter access, so stream URLs cannot be provided.
  • Duration for a bare video URL comes from a search lookup (search by the video id and an exact-match read) and can be null when 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 enrichVideoDetails for 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).