Youtube Channel Scraper avatar

Youtube Channel Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Youtube Channel Scraper

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

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

5

Total users

0

Monthly active users

6 days ago

Last modified

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 CategoryPublicly AvailableRestricted (creator setting)
Channel name, handle, avatar, bannerYes
About-tab description, join date, countryYes
Subscriber countYes, as YouTube's own display textExact number hidden by many creators — YouTube then shows no count at all
Long-form videos (Videos tab)YesUnlisted/private videos never appear on the tab
ShortsYes, if the channel has a Shorts tabChannels with no Shorts tab expose none
Live & past streamsYes, if the channel has a Live tabChannels with no Live tab expose none
Community postsYes, if the channel has a Community tabMembership-only posts are not visible without that membership
Exact per-video view/like countsYes, 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 NameDescription
rowTypeWhich kind of item the row represents: channel, video, short, livestream, or post.
channelIdYouTube's internal channel ID (UC…).
channelNameThe channel's display name.
channelUsernameThe channel's @handle, when YouTube exposes one.
channelUrlCanonical channel URL.
numberOfSubscribersSubscriber count exactly as YouTube displays it (text, not a parsed number — many creators hide the exact figure).
inputUrlThe exact value you supplied in startUrls for this channel.
scrapedAtUTC timestamp (ISO 8601) for the run.
order1-based position of the item within its section (the channel row is always 1).
titleChannel name (channel row), video/Short/stream title, or post text.
urlDirect link to the item on YouTube.

Channel profile fields (rowType: "channel")

Field NameDescription
channelDescriptionThe About-tab description text.
channelJoinedDateDate the channel joined YouTube, as shown on the About tab.
channelLocationThe channel's declared country, if published.
channelAvatarUrlHighest-resolution avatar image URL available.
channelBannerUrlChannel banner image URL.
channelDescriptionLinksArray of {text, url} objects for the About tab's external links.
channelTotalVideosExact video count as an integer; null if YouTube's own text is abbreviated (e.g. "1.2K videos").
channelTotalVideosTextVideo count exactly as YouTube displays it.
channelTotalViewsExact lifetime channel view count as an integer; null if the text is abbreviated.
viewCountTextOn channel rows, the lifetime view count as shown.
isChannelVerifiedtrue if the channel carries YouTube's verification badge.
availableTabsArray of tab names YouTube served for this channel — reflects exactly what it exposes.

Video, Short, livestream & post fields

Field NameDescription
videoIdYouTube's 11-character video ID (video, short, livestream rows).
durationLength as H:MM:SS/M:SS; on short rows this is only filled when recovered from the video's own page.
thumbnailUrlThumbnail image URL.
viewCountExact view count as an integer, pulled via an extra per-item request; null if the lookup was blocked or YouTube published no exact count.
viewCountTextView count exactly as shown on the channel grid (e.g. "1.2M views").
likesCountExact like count as an integer from the same per-item lookup; null when not recovered.
publishedTimeTextRelative 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.
publishedAtExact publish date (YYYY-MM-DD), recovered from the video's own page; null if not recovered.
isLivetrue if the stream is currently live (livestream rows).
isUpcomingtrue if the stream is scheduled but not yet started (livestream rows).
concurrentViewersText"X watching" text while live; null otherwise (livestream rows).
postIdYouTube's post ID (post rows).
postTypetext, image, poll, video, playlist, or shared (post rows).
textContentThe post's text body — also copied into title (post rows).
imageUrlsArray of image URLs attached to the post; empty if none (post rows).
pollOptionsArray of poll choice strings; empty if the post isn't a poll (post rows).
pollTotalVotesTextTotal votes text for a poll post; null otherwise (post rows).
attachedVideoIdVideo ID attached to a video-type post (post rows).
likesCountTextLike/vote count exactly as shown (post rows).
commentsCountTextComment-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.

FeatureYouTube Data API v3YouTube Channel Scraper
Setup before first requestGoogle Cloud project + API key/OAuthNone — paste a channel URL and run
Default daily quota10,000 units/day (shared across most endpoints), as published 2026-08-04No 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.

  1. Open YouTube Channel Scraper on the Apify Store and click Try for free (or Run, if already added to your account).
  2. Provide the required input: startUrls — one or more channel URLs, @handles, or bare UC… channel IDs, one per line.
  3. Optionally set maxResults, sortOrderVideos, and toggle which sections to scrape (scrapeChannelInfo, scrapeVideos, scrapeShorts, scrapeLiveStreams, scrapePosts).
  4. Click Start and watch the run log — it reports which tabs each channel exposed and how many rows each section produced.
  5. 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 publishedAt and viewCount across video rows to chart upload cadence against exact view growth over time.
  • 🎯 Marketers vetting creators for sponsorship use numberOfSubscribers, channelTotalViews and isChannelVerified to shortlist channels before reaching out.
  • 🔬 Researchers studying platform migration to Shorts compare rowType: "short" counts against rowType: "video" counts per channel over repeated runs.
  • 🏢 Community managers monitoring audience sentiment pull textContent, likesCount and commentsCountText from post rows to see which community posts land.
  • 🤖 AI engineers feed channelDescription, title and textContent into a RAG index or an agent's context window, using channelId and videoId/postId as 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

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayChannel 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"]
maxResultsNointegerUpper 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
sortOrderVideosNostringWhich 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
scrapeChannelInfoNobooleanEmit 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
scrapeVideosNobooleanEmit one video row per upload from the Videos tab. Default true.true
scrapeShortsNobooleanEmit one short row per Short. Channels without a Shorts tab return no Shorts rows. Default true.true
scrapeLiveStreamsNobooleanEmit 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
scrapePostsNobooleanEmit one post row per community post, including image, poll and video attachments. Default true.true
proxyConfigurationNoobjectApify 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 ApifyClient
client = 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.

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.

ScraperWhat it extracts
LinkedIn Profile & Post ScraperLinkedIn profile details and posts
TikTok Data ScraperTikTok creator and video data
Facebook Group Posts And Details ScraperFacebook group posts, comments and engagement analytics
Threads Search Post ScraperThreads 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.