Youtube Channel Scraper
Pricing
$19.99/month + usage
Youtube Channel Scraper
YouTube Channel Scraper extracts channel data at scale. Collect video titles, descriptions, views, likes, upload dates, and channel metadata. Ideal for market research, competitor analysis, content audits, and automation workflows using clean structured outputs.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
YouTube Channel Scraper — Videos, Shorts, Streams & Subscribers
YouTube Channel Scraper extracts a channel's profile, long-form videos, Shorts, live and past streams, and community posts in a single run — with exact view and like counts pulled from each video's own page instead of YouTube's rounded on-page text. Every result lands as clean, typed JSON, ready to load without any HTML parsing. Point it at a channel URL, @handle, or channel ID and start scraping below.
📺 What is YouTube Channel Scraper?
YouTube Channel Scraper is an Apify Actor that turns one or more YouTube channels into structured dataset rows: one row per channel profile, per long-form video, per Short, per live/past stream, and per community post. It runs against YouTube's own public pages — no YouTube account, sign-in, or Google API key is required. It's built for marketers and researchers tracking creators, data teams building channel-analytics pipelines, and AI engineers who need consistent JSON to feed into an agent or a training set.
🔓 What YouTube channel data is publicly available to scrape?
Everything a visitor sees on a channel's public tabs — Home, Videos, Shorts, Live, Community and About — is available without signing in; YouTube gates only what the creator has chosen to hide or restrict to members.
| Data Category | Publicly Available | Restricted (creator setting) |
|---|---|---|
| Channel name, handle, avatar, banner | Yes | — |
| About-tab description, join date, country | Yes | — |
| Subscriber count | Yes, as YouTube's own display text | Exact number hidden by many creators — YouTube then shows no count at all |
| Long-form videos (Videos tab) | Yes | Unlisted/private videos never appear on the tab |
| Shorts | Yes, if the channel has a Shorts tab | Channels with no Shorts tab expose none |
| Live & past streams | Yes, if the channel has a Live tab | Channels with no Live tab expose none |
| Community posts | Yes, if the channel has a Community tab | Membership-only posts are not visible without that membership |
| Exact per-video view/like counts | Yes, from the video's own page | — |
YouTube Channel Scraper only returns publicly visible data — what any visitor sees. Nothing behind a login wall.
🗂️ What data can I extract with YouTube Channel Scraper?
YouTube Channel Scraper returns channel identity fields on every row, channel-profile fields on the channel row, and content-specific fields on video, Short, livestream and post rows.
Fields on every row
| Field Name | Description |
|---|---|
rowType | Which kind of item the row represents: channel, video, short, livestream, or post. |
channelId | YouTube's internal channel ID (UC…). |
channelName | The channel's display name. |
channelUsername | The channel's @handle, when YouTube exposes one. |
channelUrl | Canonical channel URL. |
numberOfSubscribers | Subscriber count exactly as YouTube displays it (text, not a parsed number — many creators hide the exact figure). |
inputUrl | The exact value you supplied in startUrls for this channel. |
scrapedAt | UTC timestamp (ISO 8601) for the run. |
order | 1-based position of the item within its section (the channel row is always 1). |
title | Channel name (channel row), video/Short/stream title, or post text. |
url | Direct link to the item on YouTube. |
Channel profile fields (rowType: "channel")
| Field Name | Description |
|---|---|
channelDescription | The About-tab description text. |
channelJoinedDate | Date the channel joined YouTube, as shown on the About tab. |
channelLocation | The channel's declared country, if published. |
channelAvatarUrl | Highest-resolution avatar image URL available. |
channelBannerUrl | Channel banner image URL. |
channelDescriptionLinks | Array of {text, url} objects for the About tab's external links. |
channelTotalVideos | Exact video count as an integer; null if YouTube's own text is abbreviated (e.g. "1.2K videos"). |
channelTotalVideosText | Video count exactly as YouTube displays it. |
channelTotalViews | Exact lifetime channel view count as an integer; null if the text is abbreviated. |
viewCountText | On channel rows, the lifetime view count as shown. |
isChannelVerified | true if the channel carries YouTube's verification badge. |
availableTabs | Array of tab names YouTube served for this channel — reflects exactly what it exposes. |
Video, Short, livestream & post fields
| Field Name | Description |
|---|---|
videoId | YouTube's 11-character video ID (video, short, livestream rows). |
duration | Length as H:MM:SS/M:SS; on short rows this is only filled when recovered from the video's own page. |
thumbnailUrl | Thumbnail image URL. |
viewCount | Exact view count as an integer, pulled via an extra per-item request; null if the lookup was blocked or YouTube published no exact count. |
viewCountText | View count exactly as shown on the channel grid (e.g. "1.2M views"). |
likesCount | Exact like count as an integer from the same per-item lookup; null when not recovered. |
publishedTimeText | Relative publish text as shown on the grid (e.g. "3 days ago") — omitted entirely on short rows, since YouTube's Shorts grid publishes no upload-time string at all. |
publishedAt | Exact publish date (YYYY-MM-DD), recovered from the video's own page; null if not recovered. |
isLive | true if the stream is currently live (livestream rows). |
isUpcoming | true if the stream is scheduled but not yet started (livestream rows). |
concurrentViewersText | "X watching" text while live; null otherwise (livestream rows). |
postId | YouTube's post ID (post rows). |
postType | text, image, poll, video, playlist, or shared (post rows). |
textContent | The post's text body — also copied into title (post rows). |
imageUrls | Array of image URLs attached to the post; empty if none (post rows). |
pollOptions | Array of poll choice strings; empty if the post isn't a poll (post rows). |
pollTotalVotesText | Total votes text for a poll post; null otherwise (post rows). |
attachedVideoId | Video ID attached to a video-type post (post rows). |
likesCountText | Like/vote count exactly as shown (post rows). |
commentsCountText | Comment-button text exactly as shown (post rows). |
🆚 How does YouTube Channel Scraper differ from the official YouTube API?
The YouTube Data API v3 requires a Google Cloud project and a quota-limited key before you can read a single channel, and its default allocation is 10,000 quota units per day combined for most read/write endpoints, plus separate allowances of 100 calls each for search.list and videos.insert (as published on Google's YouTube Data API v3 getting-started documentation, checked 2026-08-04). YouTube Channel Scraper needs none of that setup.
| Feature | YouTube Data API v3 | YouTube Channel Scraper |
|---|---|---|
| Setup before first request | Google Cloud project + API key/OAuth | None — paste a channel URL and run |
| Default daily quota | 10,000 units/day (shared across most endpoints), as published 2026-08-04 | No API quota; capped by maxResults (up to 1,000 items per section per channel) |
| Community-tab posts | ✅ No resource exists for community posts, as observed 2026-08-04 | ✅ Returns text, image, poll, video and shared post rows |
| Shorts as a distinct type | ❌ Shorts are returned as ordinary video resources, no Shorts flag, as observed 2026-08-04 | ✅ Dedicated short rowType, detected via the channel's own Shorts tab |
| Exact per-video view/like counts | ✅ Returned directly by videos.list | ✅ Recovered via one added request per video-type item |
| Access to any public channel, not just your own | ✅ Subject to the same shared quota | ✅ No ownership or OAuth required — only public tabs are read |
Use the official API when you already have Google Cloud infrastructure and only need what its resources expose (no Community posts, no Shorts distinction). Use YouTube Channel Scraper when you need those extra surfaces, or want to skip the quota and OAuth setup entirely.
▶️ How to use YouTube Channel Scraper
Run YouTube Channel Scraper directly from its Apify Store listing — no separate signup or credentials beyond an Apify account.
- Open YouTube Channel Scraper on the Apify Store and click Try for free (or Run, if already added to your account).
- Provide the required input:
startUrls— one or more channel URLs,@handles, or bareUC…channel IDs, one per line. - Optionally set
maxResults,sortOrderVideos, and toggle which sections to scrape (scrapeChannelInfo,scrapeVideos,scrapeShorts,scrapeLiveStreams,scrapePosts). - Click Start and watch the run log — it reports which tabs each channel exposed and how many rows each section produced.
- Download results as JSON, CSV, Excel or the other formats Apify's dataset export supports, or stream them via the API.
How to scale to bulk channel extraction
startUrls is an array, so pasting dozens of channel URLs, @handles or IDs into one run scrapes all of them in a single execution — no loop or repeated runs needed. Each channel is processed independently with its own maxResults ceiling per section, so a run of 50 channels with maxResults: 20 and all five sections enabled can push up to 50 × 5 × 20 = 5,000 rows, one channel at a time.
💡 What can you do with YouTube channel data?
- 📊 Content analysts tracking a creator's output use
publishedAtandviewCountacrossvideorows to chart upload cadence against exact view growth over time. - 🎯 Marketers vetting creators for sponsorship use
numberOfSubscribers,channelTotalViewsandisChannelVerifiedto shortlist channels before reaching out. - 🔬 Researchers studying platform migration to Shorts compare
rowType: "short"counts againstrowType: "video"counts per channel over repeated runs. - 🏢 Community managers monitoring audience sentiment pull
textContent,likesCountandcommentsCountTextfrompostrows to see which community posts land. - 🤖 AI engineers feed
channelDescription,titleandtextContentinto a RAG index or an agent's context window, usingchannelIdandvideoId/postIdas stable keys for deduplication and citation.
🛡️ How does YouTube Channel Scraper handle rate limits and blocking?
Every request — page loads, InnerTube /browse continuations, and InnerTube /player lookups — goes out through the Apify Proxy configuration you set, defaulting to residential IPs. HTML page requests retry up to 3 times with a growing delay if the first attempt errors, and InnerTube calls retry up to 2–3 times the same way. If a channel page returns a consent/bot interstitial and zero rows have been pushed yet, the whole channel is retried once more on a freshly rotated proxy session. ⚠️ The per-video exact-count lookup (/player) is the piece most likely to get bot-walled; when that happens mid-run, the blocked items are retried once on a new proxy session, and any item still blocked keeps viewCount/likesCount as null rather than guessing. The Actor does not solve CAPTCHAs — a persistently blocked proxy pool will still fail.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | Channel URLs (https://www.youtube.com/@Handle or .../channel/UC…), bare @handles, or bare UC… channel IDs. One per line. Keyword search is not supported — every entry must resolve to a channel. Default: ["https://www.youtube.com/@MrBeast"]. | ["https://www.youtube.com/@mkbhd", "@NASA"] |
maxResults | No | integer | Upper limit for each enabled section (videos, Shorts, live streams, posts) on each channel. Every video-type item costs one extra request for its exact view/like count, so keep this small for quick runs. Min 1, max 1000, default 10. | 25 |
sortOrderVideos | No | string | Which of YouTube's own Videos-tab sort chips to use: date (Latest — newest uploads first), viewCount (Popular — most viewed first), oldest (Oldest — first uploads first). Channels that don't offer Popular/Oldest chips fall back to newest-first, and the run log says so. Default date. | viewCount |
scrapeChannelInfo | No | boolean | Emit one channel row per channel: description, join date, country, subscriber text, lifetime view count, video count, avatar, banner, external links and verification badge. Default true. | true |
scrapeVideos | No | boolean | Emit one video row per upload from the Videos tab. Default true. | true |
scrapeShorts | No | boolean | Emit one short row per Short. Channels without a Shorts tab return no Shorts rows. Default true. | true |
scrapeLiveStreams | No | boolean | Emit one livestream row per item on the Live tab. Channels without a Live tab return no livestream rows — YouTube silently serves the Home tab there, and this Actor detects that instead of mislabelling home videos as streams. Default true. | false |
scrapePosts | No | boolean | Emit one post row per community post, including image, poll and video attachments. Default true. | true |
proxyConfiguration | No | object | Apify Proxy is attached to every request the Actor makes. US residential is the most reliable option for YouTube; datacenter IPs are more likely to hit consent or bot interstitials. Default: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}. | see example input below |
Example input
{"startUrls": ["https://www.youtube.com/@MrBeast","@NASA","UC-lHJZR3Gqxm24_Vd_AJ5Yw"],"maxResults": 25,"sortOrderVideos": "date","scrapeChannelInfo": true,"scrapeVideos": true,"scrapeShorts": true,"scrapeLiveStreams": true,"scrapePosts": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
⬆️ Output
YouTube Channel Scraper writes one typed JSON row per item to the run's dataset, with a consistent schema across runs. Export it as JSON, CSV, Excel, XML, RSS or HTML directly from the Apify Console, or pull it with the API/apify_client in the same formats.
Example output
[{"rowType": "channel","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","channelName": "MrBeast","channelUsername": "@MrBeast","channelUrl": "https://www.youtube.com/@MrBeast","numberOfSubscribers": "394M subscribers","inputUrl": "https://www.youtube.com/@MrBeast","scrapedAt": "2026-08-04T09:12:03+00:00","order": 1,"title": "MrBeast","url": "https://www.youtube.com/@MrBeast","viewCount": null,"viewCountText": "68,481,203,552 views","publishedTimeText": null,"channelDescription": "SUBSCRIBE FOR A COOKIE!","channelJoinedDate": "Feb 20, 2012","channelLocation": "United States","channelAvatarUrl": "https://yt3.googleusercontent.com/abc123=s800-c-k-c0x00ffffff-no-rj","channelBannerUrl": "https://yt3.googleusercontent.com/def456=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj","channelDescriptionLinks": [{ "text": "Instagram", "url": "https://instagram.com/mrbeast" }],"channelTotalVideos": 850,"channelTotalVideosText": "850 videos","channelTotalViews": 68481203552,"isChannelVerified": true,"availableTabs": ["Home", "Videos", "Shorts", "Live", "Community", "About"]},{"rowType": "video","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","channelName": "MrBeast","channelUsername": "@MrBeast","channelUrl": "https://www.youtube.com/@MrBeast","numberOfSubscribers": "394M subscribers","inputUrl": "https://www.youtube.com/@MrBeast","scrapedAt": "2026-08-04T09:12:03+00:00","order": 1,"videoId": "a1B2c3D4e5F","title": "I Gave My Friends $1,000,000 To Complete A Challenge","url": "https://www.youtube.com/watch?v=a1B2c3D4e5F","duration": "18:42","thumbnailUrl": "https://i.ytimg.com/vi/a1B2c3D4e5F/maxresdefault.jpg","viewCount": 135191980,"viewCountText": "135M views","likesCount": 4820113,"publishedTimeText": "2 weeks ago","publishedAt": "2026-07-21"}]
⚙️ How does it work?
YouTube Channel Scraper requests each channel's public tabs (Videos, Shorts, Live, Posts, About) directly from youtube.com, then paginates further results through YouTube's own InnerTube /browse continuation endpoint — the same one the site's own front end calls when you scroll. Every request goes out through your configured Apify Proxy, and a consent cookie is attached so European/datacenter exits don't land on the consent interstitial. For each video-type item, one extra InnerTube /player request recovers the exact view/like count and upload date that the grid itself only shows as rounded text. Only what a signed-out visitor can already see is returned, and the output schema stays the same regardless of how YouTube reshuffles its front-end components.
🔌 Integrations
YouTube Channel Scraper runs like any other Apify Actor, so it works with whatever you already use to call Apify.
Calling YouTube Channel Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("your-username/youtube-channel-scraper").call(run_input={"startUrls": ["https://www.youtube.com/@MrBeast"],"maxResults": 25,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["rowType"], item["title"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, add an HTTP Request node authenticated with your Apify API token, pointed at the Actor's run endpoint, then parse the returned dataset items. In Make, use the HTTP module the same way to trigger a run and fetch results. Since the output is plain JSON with stable field names, it drops straight into any workflow step that consumes an HTTP response — no custom parsing node required.
⚖️ Is it legal to scrape YouTube channels?
Scraping publicly available YouTube channel data is generally lawful, since a channel's Videos, Shorts, Live, Community and About tabs are visible to any signed-out visitor. YouTube Channel Scraper returns only that publicly visible data — nothing from behind a login, membership or account wall. Because a channel is tied to an identifiable creator (name, handle, avatar, and community-post activity), storing or reusing this data can still fall under GDPR or CCPA if it counts as personal data about that individual, so you need a lawful basis for how you store and use it. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What YouTube channel fields does YouTube Channel Scraper return?
The top fields are channelName, channelUsername, numberOfSubscribers, title and viewCount — full field-by-field detail is in What data can I extract above, split by channel, video/Short/livestream and post rows.
Does YouTube Channel Scraper require a YouTube account or login?
No. The Actor reads only public channel pages and InnerTube endpoints with a consent cookie — no Google account, OAuth token, or YouTube Data API key is used anywhere in the request path.
How many channels and items can I extract in one run?
startUrls accepts as many channel entries as you paste in, and each enabled section (videos, Shorts, live streams, posts) is capped independently per channel by maxResults, from 1 up to 1,000 items.
What happens if a channel has no Shorts, Live or Community tab?
That section returns zero rows for that channel, and the run log states which tab YouTube actually served instead (for example, channels with no Live tab get redirected to Home, which the Actor detects rather than mislabelling home videos as streams).
Can I scrape multiple YouTube channels at once?
Yes — startUrls is an array; list channel URLs, @handles or channel IDs one per line and they're all processed in the same run.
Does YouTube Channel Scraper work with Claude, ChatGPT and other AI agent tools?
It has no dedicated MCP server, but any agent framework that can call an HTTP endpoint can trigger a run and read back the typed JSON dataset through the Apify API.
How does YouTube Channel Scraper compare to other YouTube channel scrapers?
The verifiable difference documented here is scope: this Actor covers a channel's profile, long-form videos, Shorts, live/past streams and community posts in one run, with an exact per-video view/like count lookup layered on top of the on-page text. Other tools' feature sets weren't independently verified for this README, so no dated comparison is made.
Does YouTube Channel Scraper return data in a format LLMs can use directly?
Yes. Every row is typed, normalized JSON with consistent field names across runs — no HTML parsing or selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when YouTube changes its layout or anti-bot system?
The Actor is maintained and the output schema is designed to stay stable across YouTube front-end changes; no specific update turnaround time is published.
Can I use YouTube Channel Scraper without managing proxies or browser infrastructure?
Yes. Apify Proxy is attached automatically to every request based on your proxyConfiguration input — there's no separate browser pool or proxy list to manage yourself.
Which YouTube channel fields work best for AI training data and RAG indexing?
For RAG, index the free-text fields — channelDescription, title and textContent — since they carry the most information per token. For training data, the most consistently structured fields across records are numberOfSubscribers, viewCount and likesCount, which always return as the same typed primitive (string or integer) even when the underlying value is null.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| LinkedIn Profile & Post Scraper | LinkedIn profile details and posts |
| TikTok Data Scraper | TikTok creator and video data |
| Facebook Group Posts And Details Scraper | Facebook group posts, comments and engagement analytics |
| Threads Search Post Scraper | Threads posts, quotes and replies from search |
💬 Your feedback
Found a bug or missing a field? Let us know through the Actor's Issues tab on its Apify Console page, or via the support contact listed on the store listing — reports like this keep the Actor maintained as YouTube's own front end keeps changing.