YouTube Channel Scraper — Stats & Recent Videos avatar

YouTube Channel Scraper — Stats & Recent Videos

Pricing

from $1.00 / 1,000 successful lookups

Go to Apify Store
YouTube Channel Scraper — Stats & Recent Videos

YouTube Channel Scraper — Stats & Recent Videos

Look up any YouTube channel by handle, custom URL, or channel ID: subscribers, total views, video count, country, join date, avatar/banner images, every About-tab link, and recent uploads. Reads the channel's live public pages, no API key needed. Charged once per channel found.

Pricing

from $1.00 / 1,000 successful lookups

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Share

YouTube Channel Lookup: subscriber count, views & recent videos from $2/1k

You give this actor a list of YouTube channels (handles, custom URLs, /channel/ IDs, whatever you have) and for each one it returns subscriber count, total views, video count, country, join date, avatar and banner images, every link listed in the About tab, and its most recent uploads (video ID, title, view count, duration). Every field is read from the channel's own live public pages at request time, in English regardless of where the request runs from. No third-party database sits between you and the channel, and no API key is required.

Who it's for

Anyone qualifying, monitoring, or reporting on YouTube creators without opening a browser tab per channel: agencies building an influencer shortlist, marketers tracking a competitor's channel growth, and analysts who need channel stats in a spreadsheet or a Clay/n8n workflow instead of a YouTube tab. Pricing is pay-per-event and per-channel: a few tenths of a cent for a channel that was actually found, and nothing for a miss, so a list that includes a typo'd handle or a channel that got deleted costs you nothing extra. No seat license, no monthly minimum, no credit system to decode.

Why this one

  • Reads the channel's own live pages, not a stale database snapshot. Every run fetches the channel's /about page (and its /videos tab, if you want recent uploads) fresh, so a channel that gained a million subscribers an hour ago shows the new number, not a cached one.
  • English output regardless of where the request runs. The request pins hl=en&gl=US, so fields like subscriber count and join date come back in a consistent, parseable format instead of whatever language the request's network happens to geolocate to.
  • Never charged for a miss. A handle that doesn't resolve to a channel, or a channel page that fails to load, still gets a row explaining why, and costs nothing. See "Price" below for the found-row rate.
  • Recent uploads are optional and free to skip. "How many recent uploads to include" defaults to 10 but can be set to 0, which skips the extra request per channel entirely when you only need the channel-level stats.
  • No proxies to configure, no headless browser needed. This is a plain HTTP fetch; YouTube's channel pages are fully server-rendered, so no JavaScript execution is required to read them.

What you get

Every row starts with the same five fields, then the channel fields, then (if you asked for any) one set of video fields per recent upload.

FieldTypeDescription
querytextThe channel you submitted, echoed back
foundbooleantrue if the channel was found
statustextOK on a match; NOT_FOUND, BLOCKED, BAD_FORMAT, or REQUEST_FAILED on a miss
messagetextPlain-English reason for a miss, only present when found is false
scrapedAtISO 8601 datetimeWhen the page was fetched
channelIdtextThe channel's stable UC... ID
handletextThe channel's @handle, if it has one
titletextThe channel's display name
descriptiontextThe channel's About-tab description
subscriberCountnumberSubscriber count (YouTube's own rounded figure, e.g. 2,500,000 for "2.5M")
videoCountnumberTotal videos published
viewCountnumberTotal channel views, all-time
countrytextThe channel's declared country, if set
joinedDatedateWhen the channel joined YouTube (YYYY-MM-DD)
avatarUrllinkThe channel's avatar image, largest size available
bannerUrllinkThe channel's banner image, largest size available
linksarrayEvery external link in the About tab, as {"title": "...", "url": "..."} objects, with tracking redirects resolved to the real destination
recentVideosarrayThe N most recent uploads, as {"videoId", "videoTitle", "videoPublishedText", "videoViewCount", "videoDurationText"} objects (grouped-row mode)
videoIdtextOne recent video's ID (one-row-per-video mode)
videoTitletextThat video's title (one-row-per-video mode)
videoPublishedTexttextHow long ago it was published, as YouTube displays it (e.g. "3 days ago")
videoViewCountnumberThat video's view count
videoDurationTexttextThat video's duration, MM:SS or H:MM:SS

Deselect any field in the Input tab's column picker to drop it from every row: query, found, status, message, and scrapedAt always stay. Turn on "One row per video" to get one row per recent upload instead of one grouped row per channel; you're still charged once per channel either way.

Price

$2 per 1,000 channels, plus a $0.00005 start fee. Misses (found:false) are never charged.

1,000 channels through this actor: ~$2 if every one is found, less if some aren't and less again on a paid Apify plan. A channel that doesn't exist, or a request that gets blocked, is never billed; you only pay for a channel you actually got data back for.

How to use

  1. In the Apify Console. Open the actor page and click Start — the channels field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~youtube-channel-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"channels":["@MrBeast"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
  1. Open the Input tab and paste your list of channels into "YouTube channels to look up": one per line, as a handle (@MrBeast), a full URL, or a /channel/UC.../ ID.
  2. Leave "Try it first" on for your first run; it caps the run at 5 channels so you can see the output shape before spending on the full list.
  3. Set "How many recent uploads to include" to 0 if you only need channel-level stats; that skips the extra request per channel.
  4. Turn on "One row per video" if you're loading results into a table you plan to filter or sort by individual upload; leave it off to keep each channel's recent uploads grouped in one row.
  5. Turn "Try it first" off and press Start to run the full list.

Typical uses: building a shortlist of channels for an influencer campaign, tracking a competitor channel's subscriber and view growth over time with a scheduled run, or pulling a channel's recent upload cadence and view counts into a content-strategy spreadsheet.

Input

{
"channels": [
"@MrBeast"
]
}

One per line. Accepted formats: @MrBeast, https://www.youtube.com/@MrBeast, channel/UCX6OQ3DkcsbYNE6H8uQQuVA.

Sample output

By default you get one row per channel, with recent uploads grouped into a recentVideos array (turn on "One row per video" to get one row per upload instead):

queryfoundstatuschannelIdhandletitledescriptionsubscriberCountvideoCountviewCountcountryjoinedDateavatarUrlbannerUrllinksrecentVideosnewVideoCountvideoIdvideoTitlevideoPublishedTextvideoViewCountvideoDurationTextisNewfirstSeenAtscrapedAt
@MrBeasttrueOKUCX6OQ3DkcsbYNE6H8uQQuVA@MrBeastMrBeastSUBSCRIBE FOR A COOKIE!
New MrBeast or MrBeast Gaming video every single Saturday at noon eastern time!
Accomplishments:
  • Raised $20,000,000 To Plant 20,000,000 Trees
  • Removed 30,000,000 pounds of trash from the ocean
  • Helped 2,000 people walk again
  • Helped 1,000 blind people see
  • Helped 1,000 deaf people hear
  • Built wells in Africa
  • Built and gave away 100 houses
  • Adopted every dog in a shelter (twice)
  • Given millions to charity
  • Started my own snack company Feastables
  • Started my own software company Viewstats
  • Gave away a private island (twice)
  • Gave away 1 million meals
  • I counted to 100k
  • Ran a marathon in the world's largest shoes
  • Survived 50 hours in Antarctica
  • Recreated Squid Game in real life
  • Created the largest competition show with 1000 people (Beast Games)
  • Gave $5,000,000 to one person
  • Raised $40,000,000 To Bring Clean Water To Millions Of People
  • Granted 100+ Dream Wishes for Kids Fighting Cancer
  • Gave Away Another $5,000,000 On Beast Games S2 | 516000000 | 1000 | 139730525794 | United States | 2012-02-19 | https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s900-c-k-c0x00ffffff-no-rj | https://yt3.googleusercontent.com/mHMO_eEMp0dPvh0ADwXhPXNYb_GnjSVsLI8biqF1CpxT8OPl7izhNQsDPD3JHhd5y5Mg9GrP=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj | [{"title":"$1,000,000 Contest","url":"https://www.themostdangerousgames.com/"},{"title":"Follow","url":"https://www.instagram.com/mrbeast/"},{"title":"Twitter","url":"https://twitter.com/MrBeast"},{"title":"Facebook","url":"https://facebook.com/mrbeast/"}] | [{"videoId":"gTKS8SAwUzE","videoTitle":"I Survived The Most Extreme Places On Earth","videoPublishedText":"5 days ago","videoViewCount":75000000,"videoDurationText":"23:28","isNew":null,"firstSeenAt":null},{"videoId":"Qtl8lJwbd4g","videoTitle":"Escape 100 Cops, Win $500,000","videoPublishedText":"2 weeks ago","videoViewCount":99000000,"videoDurationText":"20:29","isNew":null,"firstSeenAt":null},{"videoId":"Af6i6ChAVTw","videoTitle":"Last To Leave Mansion, Keeps It","videoPublishedText":"1 month ago","videoViewCount":111000000,"videoDurationText":"57:51","isNew":null,"firstSeenAt":null},{"videoId":"lVylRtlPOIE","videoTitle":"I Granted 100 Kids Their Biggest Wish!","videoPublishedText":"1 month ago","videoViewCount":61000000,"videoDurationText":"14:35","isNew":null,"firstSeenAt":null},{"videoId":"iYlODtkyw_I","videoTitle":"Survive 30 Days Chained To A Stranger, Win $250,000","videoPublishedText":"2 months ago","videoViewCount":94000000,"videoDurationText":"35:05","isNew":null,"firstSeenAt":null},{"videoId":"__fmDj0ZJ1Q","videoTitle":"50 YouTube Legends Fight For $1,000,000","videoPublishedText":"2 months ago","videoViewCount":84000000,"videoDurationText":"32:08","isNew":null,"firstSeenAt":null},{"videoId":"GpQSUjNsNm0","videoTitle":"7 Days Stranded in The Arctic","videoPublishedText":"3 months ago","videoViewCount":126000000,"videoDurationText":"32:15","isNew":null,"firstSeenAt":null},{"videoId":"AaMdXZMvT3w","videoTitle":"Survive 30 Days On An Island With Your Ex, Win $250,000","videoPublishedText":"3 months ago","videoViewCount":106000000,"videoDurationText":"39:09","isNew":null,"firstSeenAt":null},{"videoId":"6Zy5VLcEbZc","videoTitle":"I Stranded 100 People In The Wilderness For $250,000","videoPublishedText":"4 months ago","videoViewCount":168000000,"videoDurationText":"37:00","isNew":null,"firstSeenAt":null},{"videoId":"zRtGL0-5rg4","videoTitle":"Last To Leave Grocery Store, Wins $250,000","videoPublishedText":"4 months ago","videoViewCount":192000000,"videoDurationText":"42:57","isNew":null,"firstSeenAt":null}] | |

A handle that doesn't resolve to any channel gets a row with found: false and a status/ message explaining why, and is never charged.

Monitoring: only new videos

Turn on Only return videos that are new since the last run and this actor becomes an upload alert. Each channel's recent uploads are checked against the video IDs your previous run already delivered, and anything you have seen is dropped from the list. Every channel is still looked up and billed once, as usual, and its stats row always comes back, so a quiet channel shows newVideoCount: 0 instead of vanishing. Each run logs a count like 1 new of 10 fetched.

The first run has nothing to compare against, so it returns every recent upload and remembers it. From the second run on you get only videos posted since.

To turn that into an alert:

  1. Save your channel list as a task with the checkbox on, plus "One row per video".
  2. Add a Schedule to that task, hourly or daily.
  3. Add a webhook on Run succeeded, pointing at Slack, n8n, Make or Zapier.

Memory lives in a named key-value store, youtube-channel-lookup-delta, one record per channel, holding the last 5,000 video IDs per watchlist. Leave the checkbox off but fill in Watchlist name and every upload comes back stamped with isNew and firstSeenAt.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~youtube-channel-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"channels":["@MrBeast"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~youtube-channel-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"channels":["@MrBeast"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~youtube-channel-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"channels":["{{channel}}"]}, mapping the row's channel into the channels array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "YouTube Channel Scraper API | Apify" — the agent will find and run this actor.

Tips

  • Set "How many recent uploads to include" to 0 for a pure stats run (subscribers, views, country, join date): it skips the second request per channel and returns faster.
  • A BLOCKED status means the request got a 403, 429, or 503 back; lowering "Max concurrency" sometimes helps on a large list. A channel that's genuinely gone will keep coming back NOT_FOUND regardless.
  • subscriberCount and videoViewCount are YouTube's own rounded, abbreviated figures (e.g. "2.5M" becomes 2,500,000): they're the same numbers a visitor sees on the page, not an exact live count. viewCount (total channel views) is YouTube's exact, comma-formatted figure.
  • Turn on "One row per video" when you're loading results into a table you plan to filter or sort by individual upload: it's easier to query videoViewCount > 1000000 across many rows than to parse a nested recentVideos array per channel.
  • links resolves YouTube's tracking-redirect wrapper down to the real destination URL, so you get instagram.com/mrbeast's actual link, not a youtube.com/redirect?... URL.

vs. alternatives

What it costsWhat you getTrade-off
This actor (youtube-channel-lookup)$2 per 1,000 found channels (FREE tier, less on paid tiers), nothing for a missOne row per channel: subscribers, views, country, join date, avatar/banner, About-tab links, and recent uploads, read live from the channel's own pagesNo historical trend data. This is a live snapshot each time you run it, not a time series. Run it on a schedule if you want growth over time.
streamers/youtube-channel-scraper$1.30 per 1,000 resultsChannel stats plus deeper video-list pagination optionsBroader video-history controls; this actor trades that for a simpler two-request design (stats + N recent uploads) and a lower per-channel floor when you only need the basics.
Social Blade (manual)Free for basic stats, subscription for API/historical accessHistorical subscriber/view charts, estimated earningsBuilt for trend-watching one channel at a time in a browser; this actor is built for looking up a list of channels programmatically, not for historical charting.
Doing it yourselfYour time plus parsing YouTube's internal page JSON, handling redirects and blocked responses, and re-testing as YouTube's markup changesThe same dataThis actor's parsing, miss-classification (blocked vs. not-found), and the two-request stats+videos design are the maintenance burden it absorbs.

Prices for third-party tools are their published figures as of September 2026 and are not tracked here; check the vendor before relying on the comparison.

FAQ

Why is a row empty, or why does found say false? Either the input doesn't resolve to any channel (status: NOT_FOUND), the request got blocked (status: BLOCKED, usually HTTP 403/429/503), or the request failed after retries (status: REQUEST_FAILED). Check the message column for the specific reason. None of these are billed.

Am I charged for a miss? No. Actor.charge() only fires when the channel actually resolves and its metadata is returned. A blocked request or a bad handle produces a row (unless you turn on "Hide rows with no result") and costs nothing.

Is this a live check or a stored database? Live. Every run fetches the channel's current /about page (and /videos tab, if you asked for recent uploads); there's no cached snapshot behind it. Run it on a schedule if you want to track a channel's growth over time.

Why are subscriberCount and videoViewCount rounded? Because that's what YouTube itself displays on the page ("2.5M subscribers"). This actor parses that same abbreviated figure rather than calling an internal, unpublished endpoint for an exact count. viewCount (total channel views) is YouTube's own exact, comma-formatted number, not abbreviated.

Do I need to configure proxies? No. The actor uses Apify's default proxy configuration out of the box; there's nothing to set up unless you want to supply your own proxy group.

Is this GDPR-relevant? The data returned is a channel's own public, self-published information (subscriber count, videos, links the channel owner chose to list), not private personal data about an individual.

What happens if a channel has no @handle? handle comes back null. Older channels that were never migrated to the handle system, or that only ever had a /channel/UC.../ URL, don't have one; every other field is unaffected.

Can I schedule this to track a channel's growth over time? Yes. Set up an Apify Task with a schedule (daily, weekly, whatever cadence fits) and point it at this actor with a saved input. Each run is a fresh fetch, so a scheduled task combined with your own storage is how you'd build a subscriber-growth chart.

Can an AI agent call this directly? Yes. It's registered on the Apify MCP server; an agent in Claude, Cursor, or another MCP client can find and run it by name ("YouTube Channel Scraper API | Apify"), or you can call the REST endpoint shown above from any script or workflow tool.

  • Podcast Lookup: the same show-plus-episodes pattern, for Apple Podcasts shows instead of YouTube channels.
  • Tech Stack Lookup: once you've qualified a creator's brand deals or sponsor page, check what platform their storefront runs on.