YouTube Channel Scraper – Videos, Shorts & Subscribers
Pricing
from $0.50 / 1,000 results
YouTube Channel Scraper – Videos, Shorts & Subscribers
Scrape YouTube channels by URL, @handle or ID: subscribers, total views, joined date, country, links + videos, Shorts & streams with views, dates, duration. No API key.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
ninhothedev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
20 hours ago
Last modified
Categories
Share
YouTube Channel Scraper pulls public data from supported public YouTube channels without an API key. You get the channel profile (subscribers, total views, video count, joined date, country, description, external links, avatar, banner) and the channel's videos, Shorts and live streams with views, publish dates, duration and thumbnails. You can paste channel URLs, @handles, channel IDs or playlist links, sort by newest, most popular or oldest, and export to JSON, CSV, Excel or Google Sheets. There are no Google Cloud projects, quotas or OAuth to set up.
It reads YouTube's own internal JSON (the same data the website loads) instead of fragile HTML selectors, and supports a 512 MB runtime. Availability, speed and proxy costs vary by source response and input.
What data can you extract?
Channel profile (one row per channel, type = "channel"):
| Field | Example |
|---|---|
channel | MrBeast |
channel_handle | @MrBeast |
channel_id | UCX6OQ3DkcsbYNE6H8uQQuVA |
subscribers | 521000000 |
total_views | 142830800258 |
video_count | 1006 |
joined_date | 2012-02-19 |
country | United States |
description | SUBSCRIBE FOR A COOKIE! … |
links | [{"title": "Twitter", "url": "https://twitter.com/MrBeast"}, …] |
avatar, banner | image URLs |
keywords, is_verified, rss_url | channel tags, verified badge, RSS feed |
Videos / Shorts / streams (one row per video, type = "video"):
| Field | Example |
|---|---|
video_id | plN7JMbadRg |
title | Eat Everything In A Grocery Store, Win $1,000,000 |
url | https://www.youtube.com/watch?v=plN7JMbadRg |
content_type | video / short / stream |
views | 261244854 |
likes | 4023626 |
comments | 150000 (with exact video details) |
published | 2026-10-03T16:00:01+00:00 (exact, when available) |
published_time_text | 12 days ago |
published_date | 2026-10-03 (published_date_estimated = true if computed from "x days ago") |
duration / duration_seconds | 57:59 / 3479 |
thumbnail | https://i.ytimg.com/vi/plN7JMbadRg/hq720.jpg… |
description | available description; may be missing or shortened |
channel, channel_url, channel_subscribers | channel context when available |
position, sort_by, input | rank on the channel tab, sort used, which input produced it |
How to use
- Add channels. Paste one or more channel URLs (
https://www.youtube.com/@MrBeast,/channel/UC…,/c/…,/user/…),@handles,UC…channel IDs or playlist links. A URL ending in/shortsor/streamsscrapes only that tab. - Choose what to scrape. Pick content types (Videos, Shorts, Live streams), the sort order (Newest, Popular, Oldest) and Max videos per channel (applied separately to each selected content tab). For channel inputs, set it to
0to get only profiles; playlists instead retain their default video limit. Turn on Include exact video details to request additional view, like, comment and date metadata. Missing or unavailable fields remain null; enrichment is best effort. - Run and export. Click Start, then download the dataset as JSON, CSV, Excel or HTML, or fetch it through the API.
{"channels": ["https://www.youtube.com/@MrBeast", "@veritasium", "UC_x5XG1OV2P6uZZ5FSM9Ttw"],"contentTypes": ["videos", "shorts"],"sortBy": "popular","maxVideos": 50,"includeChannelInfo": true,"includeVideoDetails": false,"maxItems": 1000}
Individual videos: set "mode": "videos" and list video IDs or URLs in videoUrls. The Actor attempts video details, then falls back to basic oEmbed metadata if needed. Counts, dates or descriptions may be missing.
Output example
Real output from a verification run on the Apify platform (descriptions shortened):
[{"type": "channel","title": "MrBeast","channel": "MrBeast","channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA","views": 142830800258,"description": "SUBSCRIBE FOR A COOKIE!\nNew MrBeast or MrBeast Gaming video every single Saturday at noon eastern time! …","url": "https://www.youtube.com/@MrBeast","content_type": "channel","channel_handle": "@MrBeast","subscribers": 521000000,"subscribers_text": "521M subscribers","video_count": 1006,"total_views": 142830800258,"joined_date": "2012-02-19","country": "United States","links": [{"title": "$1,000,000 Contest", "url": "https://www.themostdangerousgames.com/"},{"title": "Twitter", "url": "https://twitter.com/MrBeast"}],"is_verified": true},{"type": "video","video_id": "plN7JMbadRg","title": "Eat Everything In A Grocery Store, Win $1,000,000","channel": "MrBeast","channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA","author_url": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA","published": "2026-10-03T16:00:01+00:00","views": 261244854,"likes": 4023626,"description": "I trapped 4 strangers in an entire supermarket and the only way out is eating everything inside …","thumbnail": "https://i.ytimg.com/vi/plN7JMbadRg/hq720.jpg","url": "https://www.youtube.com/watch?v=plN7JMbadRg","scraped_at": "2026-10-15T18:04:15.227770+00:00","content_type": "video","published_time_text": "12 days ago","published_date": "2026-10-03","published_date_estimated": false,"duration": "57:59","duration_seconds": 3479,"views_text": "261M views","comments": 150000,"channel_url": "https://www.youtube.com/@MrBeast","channel_handle": "@MrBeast","channel_subscribers": 521000000,"position": 1,"sort_by": "newest","input": "@MrBeast"}]
Without exact video details, video-list views come from YouTube's rounded labels (for example "227M views" becomes 227000000). For newest sorting, RSS enrichment is attempted for recent uploads when a feed is available. It does not guarantee a fixed number of enriched rows.
Pricing
This Actor uses pay per result: you pay for each dataset item (each channel profile or video), plus a tiny start fee. Check the Pricing tab for the current rate. At $0.50 per 1,000 results, 1,000 videos cost about $0.50. A typical run of 20 channel profiles with 50 videos each (1,020 items) costs about $0.51. These are result-event examples, not measured costs or profit. Proxy fallback can add platform usage.
Use cases
- Influencer marketing & agency prospecting: collect subscribers, country, contact links and upload frequency for lists of creators.
- Competitor and brand monitoring: track what competitor channels publish, how fast videos gain views and which topics perform best (sort by Popular).
- Content strategy: find a channel's top videos and Shorts, best durations and title patterns.
- Lead generation: build creator databases with external links (Instagram, X/Twitter, websites) for outreach.
- Market research & media analytics: feed BI dashboards with channel growth snapshots on a schedule.
- AI & data science: build labeled datasets of titles, descriptions and engagement metrics.
Integrations
Use the scraper from the Apify API, the Apify CLI, or connect it to Make, Zapier, n8n, Google Sheets, Slack, Airbyte and webhooks. Schedule it daily or weekly to track channel growth.
Python
Install apify-client==3.2.0, set APIFY_TOKEN in your environment and save this as export_channel.py. Each execution starts a paid run capped at six rows and $0.05 in Actor events; platform charges can differ. Files are written to the current folder.
"""Requires apify-client==3.2.0 and APIFY_TOKEN in the environment."""import jsonimport osfrom datetime import timedeltafrom decimal import Decimalfrom pathlib import Pathfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('ninhothedev/youtube-channel-scraper').call(run_input={'channels': ['@veritasium'], 'contentTypes': ['videos'],'maxVideos': 5, 'maxItems': 6, 'includeChannelInfo': True,'includeVideoDetails': False},build=os.environ.get('APIFY_BUILD', 'latest'), memory_mbytes=512,run_timeout=timedelta(seconds=180), max_total_charge_usd=Decimal('0.05'))if run is None or run.status != 'SUCCEEDED':raise RuntimeError('Run failed. Inspect its log before using the results.')summary = client.key_value_store(run.default_key_value_store_id).get_record('RUN_SUMMARY')if not summary:raise RuntimeError('RUN_SUMMARY is missing.')rows = list(client.dataset(run.default_dataset_id).iterate_items())if summary['value']['items'] != len(rows):raise RuntimeError('Summary count differs from the exported dataset.')Path('youtube-channel-results.json').write_text(json.dumps(rows, indent=2), encoding='utf-8')Path('youtube-channel-summary.json').write_text(json.dumps(summary['value'], indent=2), encoding='utf-8')print(f'Run {run.id}: saved {len(rows)} rows. Review youtube-channel-summary.json for limits and issues.')
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('ninhothedev/youtube-channel-scraper').call({channels: ['https://www.youtube.com/@MrBeast'],sortBy: 'popular',maxVideos: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
FAQ
Is it legal to scrape YouTube? The scraper only collects publicly available data that anyone can see without logging in. It doesn't access private videos, emails or personal accounts. Make sure your use complies with GDPR and other regulations, and with YouTube's terms where they apply.
Do I need a YouTube API key or proxies? No. The scraper works without a key and usually without a proxy. If YouTube rate-limits a run, it automatically retries through Apify Proxy when your account has access, or you can set a proxy in Proxy configuration.
How many videos can I get per channel? Pagination attempts more results up to the configured limits; blocks, missing tabs, repeated pages or unavailable continuations can stop it early. Use Max videos per channel and Max total results to control cost.
Are dates exact? published can be an RSS timestamp or a date-only value from successful detail enrichment. Do not assume timestamp precision for every row. Otherwise published_date is estimated from YouTube's "x days ago" label, and published_date_estimated is set to true.
What happens with an invalid or deleted channel? It is skipped and logged in the RUN_SUMMARY record in the key-value store. Other channels still get scraped. A run fails only if nothing at all could be scraped because of a YouTube error.
Can I schedule it? Yes. Use Apify Schedules (for example, daily) and connect the dataset to Google Sheets or a webhook.
Support: open an issue on the Issues tab with your run ID and input, without credentials or private data.
Related Actors
- YouTube Search Scraper: find videos by keyword.
- YouTube Keyword Suggestions Scraper: YouTube autocomplete keyword ideas for SEO.
- TikTok Scraper, Instagram Scraper, Twitch Streams Scraper
Result counts and coverage
maxVideos applies per selected content tab (and per playlist), while maxItems caps all dataset rows, including channel profiles. Videos are deduplicated globally by ID; if two inputs overlap, the first saved occurrence retains its input attribution. Target items counts only newly saved rows and sums to the delivered total in a fresh run.
Read RUN_SUMMARY alongside the dataset: targets, maxItemsReached, chargeLimitReached, proxyUsed and retry counts explain several reasons for limited output. A successful run can contain partial results or basic fallback metadata. The summary is not a field-completeness guarantee: missing About, RSS or detail metadata can remain null without a failed target. Check required fields before using rows in downstream reports. On restart, existing dataset rows are loaded before source work. Their IDs prevent repeat delivery and all stored rows count toward maxItems. previousItems records restored rows; newItems and target items describe this invocation. Keep input unchanged when resurrecting a run; use a fresh run for each monitoring snapshot. Rows without legacy IDs still count toward the cap but cannot be deduplicated by ID. A crash between platform storage and billing is not an application-level transactional guarantee.