YouTube Channel Scraper
Pricing
from $0.99 / 1,000 results
YouTube Channel Scraper
Get YouTube channel metadata: subscriber count, video count, banner, avatar, description, tags, verified status. HTTP-only, no login.
Pricing
from $0.99 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Extract public channel metadata from any YouTube channel in bulk — title, description, subscriber count, video count, banner, avatar, owner URLs, keywords, RSS feed, and canonical channel URL — in a clean structured JSON output.
Why use this actor
- No account / no login required — just give it a YouTube handle, channel ID, or channel URL.
- No API key needed — no YouTube Data API quota; this actor returns the same data the YouTube site shows.
- Flexible identifier — handles (
@veritasium), channel IDs (UCHnyfMqiRRG1u-2MsSQLbXA), full URLs (https://www.youtube.com/@veritasium), and legacy/c///user/paths all resolved automatically. - Rich detail — title, description, avatar, banner, owner URLs, channel keywords, family-safe flag, country availability, vanity URL, and the RSS feed link in one clean record.
- Bulk input — pass hundreds of channels in one run; one dataset row per channel.
- Automatic retries — transient failures retry with exponential backoff; channels that genuinely don't exist surface as
_error: "not_found"so you can triage failures. - Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries
_input,_source,_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of YouTube channels — handles, channel IDs, or URLs.
- The actor resolves each input to its canonical channel and fetches the channel record the same way YouTube's web app does, then assembles a flat JSON record.
- Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.
Input
{"channels": ["@veritasium","@mkbhd"],"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
channels | array | List of YouTube channels to scrape. Accepts handles (@veritasium), channel IDs (UCHnyfMqiRRG1u-2MsSQLbXA), full URLs, and legacy /c/ / /user/ paths. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy works for most cases. |
Output
Input: @veritasium
{"_input": "@veritasium","_source": "S1-primary","_scrapedAt": "2026-05-18T10:43:06.849335+00:00","channelId": "UCHnyfMqiRRG1u-2MsSQLbXA","title": "Veritasium","description": "An element of truth - videos about science, education, and anything else we find interesting.","vanityChannelUrl": "http://www.youtube.com/@veritasium","isFamilySafe": true,"availableCountryCodes": ["IQ", "TV", "ES", "PM", "CK", "MZ", "CL", "WF", "IL", "MP", "... 240 more"],"avatar": "https://yt3.googleusercontent.com/7vCbvtCqtjQ3YLgsJt7Y952MQV1sBvhllSCSxHP8_sVZdcPCBrITfhkN2RdyCuwPnsByq-1GoA=s900-c-k-c0x00ffffff-no-rj","banner": null,"subscriberCountText": "","videoCountText": "","tags": "\"science videos\" science \"science education\" \"science literacy\" veritasium misconceptions physics education astronomy chemistry biology teaching learning math","ownerUrls": ["http://www.youtube.com/@veritasium"],"rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCHnyfMqiRRG1u-2MsSQLbXA","url": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA","isVerified": false}
| Field | Type | Description |
|---|---|---|
_input | string | The channel identifier exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-primary means the fastest, richest path; values starting with S2- indicate a fallback was used. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
channelId | string | YouTube's canonical channel ID (UC...). Stable across handle and rename changes. |
title | string | Channel display name (e.g. "Veritasium"). |
description | string | Channel "About" text. Empty string if not set. |
vanityChannelUrl | string | Public vanity URL (e.g. http://www.youtube.com/@veritasium). |
isFamilySafe | boolean | true if the channel is marked family-safe by YouTube. |
availableCountryCodes | array | ISO country codes where the channel is viewable. |
avatar | string | URL of the channel profile picture (highest-res variant). |
banner | string | URL of the channel banner image. null if no banner is set. The URL is resolution-suffixed; swap the =w... segment to request a different size. |
subscriberCountText | string | Human-readable subscriber count (e.g. "3.2M subscribers"). Empty string when YouTube hides the count. |
videoCountText | string | Human-readable video count (e.g. "426 videos"). Empty when not exposed. |
tags | string | Channel keywords as a single string, as set by the channel owner. |
ownerUrls | array | URLs the channel owner has linked from their page (vanity URL, external links). |
rssUrl | string | RSS feed URL for the channel's uploads. |
url | string | Canonical channel URL on youtube.com. |
isVerified | boolean | true if YouTube displays the verified badge for this channel. |
Error envelope
Channels that don't exist or fail to fetch return a structured error instead of crashing the run:
{"_input": "@this-channel-does-not-exist-xyz","_error": "not_found","_errorDetail": "channel not found","_source": "S1-primary","_scrapedAt": "2026-05-18T10:43:09.012345+00:00"}
_error value | Meaning |
|---|---|
not_found | Channel was deactivated, terminated, or never existed. |
handle_resolve_failed | A @handle could not be resolved to a channel ID. |
invalid_input | The input string did not look like a handle, channel ID, or YouTube URL. |
fetch_failed | Transient fetch failure after retries; safe to re-run that input. |
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $3.50 per 1,000 channels. Each successful channel = 1 result. Errors (not-found, terminated) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| YouTube | YouTube Video Detail Scraper | Full metadata for any video URL or ID |
| YouTube | YouTube Playlist Scraper | Items + metadata for any playlist |
| Twitch | Twitch Channel Scraper | Streamer profile, follower count, status |
| Instagram Account Scraper | Bio, followers, post count | |
| X / Twitter | X Account Scraper | Profile + tweet counts for any handle |
| Bluesky | Bluesky Account Scraper | atproto profile + counters |
| Threads | Threads Account Scraper | Profile data for a Threads handle |
Browse the full catalog at apify.com/xtracto.
Notes
subscriberCountTextis a rounded human-readable string (e.g."3.2M subscribers") — YouTube hides exact counts publicly. Parse the prefix if you need a numeric value. Channels under 1,000 subscribers, and channels that have opted to hide their counter, return an empty string.videoCountTextis similarly text-based and may be empty for channels that hide their uploads tab.- Banner URLs are resolution-suffixed; replace the
=w1060-...segment to get the size you want. Channels with no banner returnbanner: null. - The
channelId(UC...) is the most reliable identifier — handles and vanity URLs can change, butchannelIddoes not. - Deactivated, terminated, or never-existed channels return
{"_error": "not_found", "_input": "..."}. Handle changes are usually reflected within minutes. - For large jobs (>500 channels), Apify Proxy is recommended to keep throughput stable.