YouTube Channel Scraper - All Videos, Views & Subscribers avatar

YouTube Channel Scraper - All Videos, Views & Subscribers

Pricing

from $1.20 / 1,000 scraped videos

Go to Apify Store
YouTube Channel Scraper - All Videos, Views & Subscribers

YouTube Channel Scraper - All Videos, Views & Subscribers

Scrape any YouTube channel by @handle, URL or UC id: subscriber count, description, keywords, avatar and RSS, plus every uploaded video with title, URL, duration, views and publish age. No API key, no proxy. $0.0015 per video; channel row free.

Pricing

from $1.20 / 1,000 scraped videos

Rating

0.0

(0)

Developer

Broke to Built

Broke to Built

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

YouTube Channel Scraper — All Videos, Views & Subscribers

Scrape any YouTube channel without an API key. Give it an @handle, a channel URL or a UC channel id and get back the channel's profile — subscriber count, total video count, description, keywords, avatar, channel id and RSS feed — plus every uploaded video, newest first, with title, watch URL, duration in seconds, view count and publish age. One row per video, with the channel's id, handle and subscriber count repeated on every row so a CSV export needs no join.

No YouTube Data API quota, no Google Cloud project, no login, no browser.

Use it for influencer research, competitor channel tracking, building a video list to feed a transcript or comments scraper, content audits, and finding which of a creator's uploads took off.

Input

{
"channels": ["@mkbhd", "https://www.youtube.com/@3blue1brown", "UCYO_jab_esuFRV4b17AJtAw"],
"maxVideosPerChannel": 50,
"maxChannels": 20
}
FieldWhat it does
channels@handles, channel URLs (/@name, /channel/UC…, /c/…, /user/…) or bare UC… ids. A bare name without @ is treated as a handle. Duplicates removed.
maxVideosPerChannelNewest-first cap per channel (default 50, up to 2,000). This is also your cost cap: each video row is one charged result.
maxChannelsSafety cap per run (default 20, up to 100).

Run it with no input at all and it scrapes the 50 newest videos from @3blue1brown, so you can see the output shape before you spend anything meaningful.

Output

One free channel row per channel:

{
"type": "channel",
"channelId": "UCBJycsmduvYEL83R_U4JriQ",
"channelTitle": "Marques Brownlee",
"channelHandle": "@mkbhd",
"channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
"subscriberCountText": "21.3M subscribers",
"subscriberCount": 21300000,
"videoCountText": "1.8K videos",
"videoCount": 1800,
"description": "MKBHD: Quality Tech Videos | YouTuber | Geek | ...",
"keywords": "...",
"avatarUrl": "https://yt3.googleusercontent.com/...",
"rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCBJycsmduvYEL83R_U4JriQ",
"videosReturned": 50,
"moreVideosAvailable": true
}

One charged row per video:

{
"type": "video",
"position": 1,
"videoId": "pOX1l1edBME",
"title": "The Apple Watch Has a Problem",
"url": "https://www.youtube.com/watch?v=pOX1l1edBME",
"durationText": "15:06",
"durationSeconds": 906,
"viewCountText": "3.8M views",
"viewCount": 3800000,
"publishedText": "2 days ago",
"isLive": false,
"thumbnail": "https://i.ytimg.com/vi/pOX1l1edBME/hqdefault.jpg",
"channelId": "UCBJycsmduvYEL83R_U4JriQ",
"channelTitle": "Marques Brownlee",
"channelHandle": "@mkbhd",
"channelSubscriberCount": 21300000
}

A channel that cannot be read (wrong handle, terminated channel) comes back as a type: "error" row with a plain-English reason and is not charged.

Pricing

$0.0015 per video row (pay per event, video-scraped). 1,000 videos = $1.50.

  • The channel profile row is free.
  • Channels that fail, do not exist, or have no public long-form videos are free.
  • The run stops cleanly at your spending limit rather than billing past it.

Limits

  • Long-form uploads only. This reads the channel's Videos tab. Shorts and past livestreams live on other tabs and are not included, which is why videoCount (YouTube's all-tabs total) can be larger than the rows you get.
  • View counts and subscriber counts are YouTube's rounded display values ("2.1M" → 2,100,000), not exact figures. Publish dates are relative ("6d ago") as YouTube shows them on the channel page.
  • No likes, comments or full descriptions per video — pipe the URLs into our YouTube Comments Scraper or YouTube Transcript actor for that.
  • Uses YouTube's public web pages, so a layout change on YouTube's side can break it until we ship a fix. Every row says ok: true or carries an error — never a silent empty list.

FAQ

How do I get all videos from a YouTube channel without the API? Put the channel's @handle or URL in channels and raise maxVideosPerChannel to cover the channel. The channel row tells you moreVideosAvailable: true if you stopped short.

How do I get a YouTube channel's subscriber count in bulk? List the channels, set maxVideosPerChannel to 1, and read the free channel rows — each channel then costs one video row ($0.0015).

Does it work with old /user/ and /c/ URLs? Yes, along with /@handle and /channel/UC….

Can I find a channel's id from its handle? Yes — channelId on the channel row is the UC… id, and rssUrl is its public RSS feed.

Do I need proxies? No. It runs on plain Apify datacenter IPs with no proxy cost.

Use from code or an AI agent

curl -s "https://api.apify.com/v2/acts/EliAI~youtube-channel-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-X POST -H 'Content-Type: application/json' \
-d '{"channels": ["@mkbhd"], "maxVideosPerChannel": 20}'

Agents: connect Apify MCP and call EliAI/youtube-channel-scraper.

  • Capability: list a YouTube channel's profile and uploaded videos without an API key
  • Required input: channels (array of handles, URLs or UC ids)
  • Returns: one channel row (free) and one video row per upload (charged)
  • Bounded: maxVideosPerChannel ≤ 2,000, maxChannels ≤ 100
  • Side effects: none — read-only

Changelog

  • 2026-09-24 — First release: channel profile + newest-first uploads, handle/URL/UC-id input, both of YouTube's view-count display formats parsed.