ViewStats Scraper – YouTube Channel Analytics & Growth Data
Pricing
from $1.00 / 1,000 channel results
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
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
6
Monthly active users
5 days ago
Last modified
Categories
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.
| Field | Example |
|---|---|
| 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 |
| bannerUrl | https://yt3.googleusercontent.com/00000000000000000000 |
| description | Sample channel description text appears here. |
| dateCreated | 2015-01-01T00:00:00.000Z |
| growth | period stats object (week / month / quarter / year / all time) |
| averages | daily / weekly / monthly / yearly averages object |
| longsAndShorts | longs vs shorts split per period |
| featuredVideo | featured video object (title, views, likes, duration) |
| similarChannels | array of related channels with counts and similarity score |
| statsTimeSeries | array of dated data points (subscribers, views, revenue, upload events) |
| scrapedAt | 2026-01-01T00:00:00.000Z |
| changeType | NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED — incremental mode only |
| changedFields | ["subscriberCount", "viewCount"] — incremental mode only, present when changeType is UPDATED |
| firstSeenAt | 2026-01-01T00:00:00.000Z — incremental mode only |
| lastSeenAt | 2026-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
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | channels | channels for a list of handles or URLs, search for keywords. |
| channels | array | ["@MrBeast"] | Channels mode. Handles (@MrBeast, MrBeast), ViewStats URLs, or YouTube URLs (/@handle, /channel/UC...). |
| searchTerms | array | ["mrbeast"] | Search mode. Keywords to resolve into channels. |
| maxChannelsPerSearch | integer | 10 | Search mode. Max channels resolved per keyword. |
| includeProfileDetails | boolean | true | Adds description, creation date, rankings, period growth, revenue ranges, averages, upload frequency, longs vs shorts, and the featured video. |
| includeSimilarChannels | boolean | false | Adds related channels with counts and a similarity score. |
| includeStatsTimeSeries | boolean | false | Adds the historical data points series. |
| statsRange | string | 365 | Time series window: 28, 90, 365, or alltime. |
| statsGroupBy | string | monthly | Time series granularity: daily or monthly. |
| maxItems | integer | 50 | Hard cap on channels written. 0 means unlimited. |
| proxy | object | Apify proxy | Connection settings. The default works on every plan. |
| residentialCountries | array | US, GB, DE, CA, FR | Countries rotated through when residential proxy is used as a fallback. |
| maxResidentialRequests | integer | 200 | Cap on residential requests per run, to control cost. 0 disables residential. |
| backupProxyUrl | string | (built in) | Optional last-resort proxy gateway. |
| resumeFromRunId | string | (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. |
| incrementalMode | boolean | false | Turn 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. |
| stateKey | string | (auto) | Optional. Names an incremental-mode monitoring campaign, or leave empty to derive one automatically from the channel list/search and detail toggles. |
| emitUnchanged | boolean | false | Incremental mode only. Also return (and bill for) channels with no change since the last run, marked UNCHANGED. |
| emitExpired | boolean | false | Incremental 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 onmaxItems/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).similarChannelsis always returned whenincludeSimilarChannelsis on, but never by itself marks a channelUPDATED— it lists other channels' own subscriber/view counts, and a neighbour's number moving isn't a change to this channel.featuredVideois always returned with its live view/like/comment counts, but those counters alone never mark the channelUPDATEDeither — 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 onemitUnchangedto get the full snapshot every run instead.REAPPEARED— was previously markedEXPIRED, now seen again.EXPIRED— was tracked before but not seen this run. Only emitted (withemitExpiredon) after a run that scanned the entire tracked scope — not whenmaxItems/maxChannelsPerSearchcapped it, and not whenresumeFromRunIdwas used.
Incremental-mode output rows add
changeType,changedFields,firstSeenAt, andlastSeenAt. These fields are absent whenincrementalModeis 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.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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.