YouTube Channel Scraper — All Videos, Views & Subscribers
Pricing
from $3.00 / 1,000 video scrapeds
YouTube Channel Scraper — All Videos, Views & Subscribers
Scrape every video from any YouTube channel: title, views, duration, publish date, plus channel subscribers and video count. No API key, no quota.
Pricing
from $3.00 / 1,000 video scrapeds
Rating
0.0
(0)
Developer
Mohanad Alshaka
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape every video from any YouTube channel without an API key, a quota or a login. Give it an @handle, a channel URL or a UC… ID.
Each row carries the video and the channel: title, views, duration, publish date, plus subscriber count, total video count, handle, description and avatar.
Output
{"channelName": "Marques Brownlee","channelId": "UCBJycsmduvYEL83R_U4JriQ","channelHandle": "@MKBHD","subscriberCount": 21300000,"videoCount": 1800,"videoId": "6D__H_DO2Xk","url": "https://www.youtube.com/watch?v=6D__H_DO2Xk","title": "iPhone Duo: What We Missed!","viewCount": 8200000,"viewCountText": "8.2M views","lengthText": "10:37","lengthSeconds": 637,"publishedText": "1 day ago","publishedApprox": "2026-09-13T...","isShort": false}
Why this one does not quietly return zero
YouTube is midway through changing how channel grids are built. The old shape was videoRenderer; channels now serve lockupViewModel, where the video ID sits in contentId and the view count and age are unlabelled strings.
Measured on a live channel page on 14 September 2026: 30 lockupViewModel, zero videoRenderer. Any scraper that only knows the old shape returns an empty dataset and reports success.
This Actor reads the new shape first and falls back to the old one, so it works on both sides of the rollout. A test asserts each path independently, so a future fallback removal fails loudly rather than silently.
Views and ages are classified by their format rather than their label, because in the new shape the labels move between layouts and the value formats do not.
Blocked pages are never charged
YouTube refuses some datacenter IPs with "Sign in to confirm you're not a bot" — returned as a normal 200 page with no data. Billing for that would charge you for this Actor's IP being refused, so those rows are written with blocked: true and error: "blocked_by_youtube" and no event fires.
To avoid it entirely, set proxyConfiguration to Apify Proxy with RESIDENTIAL groups.
Input
| Field | What it does |
|---|---|
channels | @handles, channel URLs, or UC… IDs. All three work and can be mixed. |
maxVideosPerChannel | Cap on videos per channel, and therefore on cost. One page carries about 30. |
includeChannelInfo | Attach channel name, subscribers, video count and avatar to every row. |
language / country | Two-letter codes affecting titles and regional availability. |
Example
{"channels": ["@MKBHD", "UCBJycsmduvYEL83R_U4JriQ"],"maxVideosPerChannel": 60}
Notes and limits
- Public channel data only. No login, no cookies, no Google account.
- View counts on channel grids are the abbreviated values YouTube displays ("8.2M views"), so they are rounded at source. Both the number and the original string are returned. For exact counts, run the video scraper on the IDs.
- Publish dates are relative on this surface ("1 day ago"), so
publishedApproxis derived and approximate by definition. The original text is kept inpublishedText. - One request per channel returns roughly 30 videos. Deeper paging is not performed.
Development
npm installnpm testnode src/main.js