ViewStats Scraper – YouTube Channel Analytics & Growth Data avatar

ViewStats Scraper – YouTube Channel Analytics & Growth Data

Pricing

from $1.00 / 1,000 channel results

Go to Apify Store
ViewStats Scraper – YouTube Channel Analytics & Growth Data

ViewStats Scraper – YouTube Channel Analytics & Growth Data

Scrape YouTube channel analytics from ViewStats. Look up channels by handle, URL, or keyword search. Returns subscribers, views, rankings, growth from weekly to all-time, revenue estimates, historical time series, longs vs shorts, featured video, and similar channels.

Pricing

from $1.00 / 1,000 channel results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

6

Monthly active users

5 days ago

Last modified

Share

ViewStats YouTube Analytics Scraper

Pull rich YouTube channel analytics from ViewStats in seconds. Give it a list of channel handles or URLs (or a keyword to search), and get back subscriber counts, lifetime views, video counts, global and country rankings, period growth with revenue estimates, daily and monthly averages, longs vs shorts splits, the featured video, similar channels, and a full historical time series. Accurate, low cost, and quick to run.

Why this scraper

  • Fast and accurate: clean, structured channel data with no setup.
  • Low cost and free-plan friendly, so you can start without a paid subscription.
  • More fields than the typical alternative: rankings, week/month/quarter/year/all-time growth, revenue ranges, upload frequency, longs vs shorts, featured video, similar channels, and a daily or monthly time series.
  • Two ways in: a list of channels (handles or URLs), or a keyword search that resolves matching channels for you.
  • Reliable: keeps working across site updates.
  • Pay only for what you collect: profile detail, similar channels, and the time series are optional toggles.

Data you get

Sample shape, values are illustrative placeholders, not from a live channel.

FieldExample
channelIdUC00000000000000000000
handlesamplecreator
displayNameSample Creator
urlhttps://www.viewstats.com/@samplecreator/channelytics
youtubeUrlhttps://www.youtube.com/@samplecreator
verifiedtrue
countryUS
subscriberCount1000000
viewCount500000000
videoCount250
globalSubscribersRanking1500
globalViewsRanking1800
countrySubscriberRanking300
categorySubscriberRanking120
viewstatsRanking2000
estimatedRevenueLowUsdMonthly10000
estimatedRevenueHighUsdMonthly30000
uploadFrequencyPerMonth8
avatarUrlhttps://yt3.ggpht.com/0000000000000000=s800-c-k-c0x00ffffff-no-rj
bannerUrlhttps://yt3.googleusercontent.com/00000000000000000000
descriptionSample channel description text appears here.
dateCreated2015-01-01T00:00:00.000Z
growthperiod stats object (week / month / quarter / year / all time)
averagesdaily / weekly / monthly / yearly averages object
longsAndShortslongs vs shorts split per period
featuredVideofeatured video object (title, views, likes, duration)
similarChannelsarray of related channels with counts and similarity score
statsTimeSeriesarray of dated data points (subscribers, views, revenue, upload events)
scrapedAt2026-01-01T00:00:00.000Z
changeTypeNEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED — incremental mode only
changedFields["subscriberCount", "viewCount"] — incremental mode only, present when changeType is UPDATED
firstSeenAt2026-01-01T00:00:00.000Z — incremental mode only
lastSeenAt2026-01-02T00:00:00.000Z — incremental mode only

How to use

Search a single channel and get everything:

{
"mode": "channels",
"channels": ["@MrBeast"],
"includeProfileDetails": true
}

Several channels by handle and URL, core fields only (cheapest):

{
"mode": "channels",
"channels": ["@MrBeast", "https://www.youtube.com/@mkbhd", "tseries"],
"includeProfileDetails": false,
"maxItems": 3
}

Keyword search, resolve the top matches:

{
"mode": "search",
"searchTerms": ["tech reviews", "mrbeast"],
"maxChannelsPerSearch": 10
}

Add similar channels and a daily time series:

{
"mode": "channels",
"channels": ["@MrBeast"],
"includeProfileDetails": true,
"includeSimilarChannels": true,
"includeStatsTimeSeries": true,
"statsRange": "365",
"statsGroupBy": "daily"
}

Daily monitoring of the same channel list, only what changed:

{
"mode": "channels",
"channels": ["@MrBeast", "@mkbhd"],
"includeProfileDetails": true,
"incrementalMode": true
}

Continue an interrupted large search pull:

{
"mode": "search",
"searchTerms": ["gaming"],
"maxChannelsPerSearch": 50,
"resumeFromRunId": "PASTE_PREVIOUS_RUN_OR_DATASET_ID"
}

Input parameters

ParameterTypeDefaultDescription
modestringchannelschannels for a list of handles or URLs, search for keywords.
channelsarray["@MrBeast"]Channels mode. Handles (@MrBeast, MrBeast), ViewStats URLs, or YouTube URLs (/@handle, /channel/UC...).
searchTermsarray["mrbeast"]Search mode. Keywords to resolve into channels.
maxChannelsPerSearchinteger10Search mode. Max channels resolved per keyword.
includeProfileDetailsbooleantrueAdds description, creation date, rankings, period growth, revenue ranges, averages, upload frequency, longs vs shorts, and the featured video.
includeSimilarChannelsbooleanfalseAdds related channels with counts and a similarity score.
includeStatsTimeSeriesbooleanfalseAdds the historical data points series.
statsRangestring365Time series window: 28, 90, 365, or alltime.
statsGroupBystringmonthlyTime series granularity: daily or monthly.
maxItemsinteger50Hard cap on channels written. 0 means unlimited.
proxyobjectApify proxyConnection settings. The default works on every plan.
residentialCountriesarrayUS, GB, DE, CA, FRCountries rotated through when residential proxy is used as a fallback.
maxResidentialRequestsinteger200Cap on residential requests per run, to control cost. 0 disables residential.
backupProxyUrlstring(built in)Optional last-resort proxy gateway.
resumeFromRunIdstring(empty)Paste a previous run ID or dataset ID to continue a large crawl without re-fetching (or re-charging for) channels already collected there.
incrementalModebooleanfalseTurn on for daily/recurring monitoring of the same channels/search. The actor remembers the previous run itself; later runs return only NEW/UPDATED/REAPPEARED channels.
stateKeystring(auto)Optional. Names an incremental-mode monitoring campaign, or leave empty to derive one automatically from the channel list/search and detail toggles.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill for) channels with no change since the last run, marked UNCHANGED.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill for) channels that disappeared since the last run, marked EXPIRED. Only produced after a complete, uncapped, non-resumed scan.

Resume & recurring updates (#503)

Two distinct features, both off by default:

  • Resume (resumeFromRunId) continues ONE specific interrupted run. Paste the run ID or dataset ID from a previous run and this run skips every channel it already collected, so you can pick up a large channel list or search pull without paying for duplicates.

  • Incremental mode (incrementalMode) is for scheduling this actor to run again and again (e.g. daily) against the SAME channel list or search. The actor keeps its own baseline (keyed on the mode, channel list/search terms, and detail toggles — never on maxItems/maxChannelsPerSearch, so tuning the output size alone never resets tracking) and classifies every channel:

    • NEW — never seen before for this scope.
    • UPDATED — at least one field genuinely changed value (a field flipping to/from missing/null, e.g. a transient enrichment-endpoint hiccup, does not count as a change). similarChannels is always returned when includeSimilarChannels is on, but never by itself marks a channel UPDATED — it lists other channels' own subscriber/view counts, and a neighbour's number moving isn't a change to this channel. featuredVideo is always returned with its live view/like/comment counts, but those counters alone never mark the channel UPDATED either — ViewStats refreshes a video's counters near-real-time while the channel's own totals update far more slowly, so only the channel actually featuring a different video (or an edited title/description) counts as a change.
    • UNCHANGED — nothing changed. Suppressed by default (not returned, not billed); turn on emitUnchanged to get the full snapshot every run instead.
    • REAPPEARED — was previously marked EXPIRED, now seen again.
    • EXPIRED — was tracked before but not seen this run. Only emitted (with emitExpired on) after a run that scanned the entire tracked scope — not when maxItems/maxChannelsPerSearch capped it, and not when resumeFromRunId was used.

    Incremental-mode output rows add changeType, changedFields, firstSeenAt, and lastSeenAt. These fields are absent when incrementalMode is off.

Combining both: turning on incrementalMode with resumeFromRunId set (and no existing incremental baseline yet) bootstraps the monitoring baseline from that resume dataset, so channels it already covers don't look NEW on the next scheduled run.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape — the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record — not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Output example

Sample shape, values are illustrative placeholders, not from a live channel.

{
"channelId": "UC00000000000000000000",
"handle": "samplecreator",
"displayName": "Sample Creator",
"url": "https://www.viewstats.com/@samplecreator/channelytics",
"youtubeUrl": "https://www.youtube.com/@samplecreator",
"verified": true,
"country": "US",
"subscriberCount": 1000000,
"viewCount": 500000000,
"videoCount": 250,
"globalSubscribersRanking": 1500,
"globalViewsRanking": 1800,
"countrySubscriberRanking": 300,
"categorySubscriberRanking": 120,
"viewstatsRanking": 2000,
"estimatedRevenueLowUsdMonthly": 10000,
"estimatedRevenueHighUsdMonthly": 30000,
"uploadFrequencyPerMonth": 8,
"avatarUrl": "https://yt3.ggpht.com/0000000000000000=s800-c-k-c0x00ffffff-no-rj",
"description": "Sample channel description text appears here.",
"dateCreated": "2015-01-01T00:00:00.000Z",
"growth": {
"weekly": { "views": 20000000, "subscribers": 50000, "estimatedRevenueLowUsd": 2000, "estimatedRevenueHighUsd": 6000 },
"monthly": { "views": 90000000, "subscribers": 200000, "estimatedRevenueLowUsd": 10000, "estimatedRevenueHighUsd": 30000 }
},
"averages": {
"daily": { "viewsAverage": 3000000, "subsAverage": 7000, "estimatedRevenueLowUsd": 1000, "estimatedRevenueHighUsd": 3000 },
"uploadFrequency": 8
},
"similarChannels": [
{ "channel": { "handle": "anothercreator", "displayName": "Another Creator" }, "subscriberCount": 900000, "viewCount": 400000000, "videoCount": 200, "similarity": 0.82 }
],
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Plan and proxy notes

Any Apify plan, including the free plan, can run this actor. Residential proxy is supported as an optional fallback and is bounded by the residential request budget, so you stay in control of cost. For the lowest cost, keep includeProfileDetails off when you only need the core counts, and enable the time series only when you need history.