YouTube Channel Scraper | Videos, Shorts and Views avatar

YouTube Channel Scraper | Videos, Shorts and Views

Pricing

from $0.68 / 1,000 videos

Go to Apify Store
YouTube Channel Scraper | Videos, Shorts and Views

YouTube Channel Scraper | Videos, Shorts and Views

Extract every video, Short and live stream from any YouTube channel: exact publish date, views, likes, duration, description, tags and category, plus subscribers, total views, country and social links for the channel. No API key, no login. Filter by date for daily monitoring of new uploads.

Pricing

from $0.68 / 1,000 videos

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

2

Monthly active users

17 hours ago

Last modified

Share

Youtube Channel Scraper

Turn any YouTube channel into a table: every video, short and live stream with its exact publish date, views and likes, and the channel's own numbers on each row. 50 videos with full details in 4 seconds.

How it works

How it works

  1. You paste one or more channels. A channel address, an @handle or a channel id all work, in the same field.
  2. The channel is read tab by tab. Videos, Shorts and Live streams, in the order you choose: latest, most popular or oldest. A date floor keeps only what was published after the day you pick.
  3. One row comes back per video. 33 fields: the video with its exact numbers, and the channel it belongs to with subscribers, total views, country and links. Ready for a spreadsheet, a database or an AI pipeline.

โœจ Why teams choose this over other YouTube channel scrapers

Copying view counts from a channel page into a spreadsheet, one video at a time? Getting dates back as "3 weeks ago" and wondering how to sort them? Running one tool for the videos and another for the channel stats, then joining the two by hand?

  • ๐Ÿ“… Dates you can sort and filter. Every row carries the exact publish date and time in RFC 3339 (2026-09-16T12:01:27Z), not a label like "6 days ago". Filter a quarter, chart a cadence, join on a calendar, no cleaning needed.
  • ๐ŸŽฏ Exact numbers, not rounded ones. A channel page shows "8M views". The row says 8009051 views and 124170 likes, the values YouTube publishes for the video itself.
  • ๐Ÿ“บ The video and its channel in the same row. 21 video fields and 12 channel fields together: subscribers, total videos, total views, country, joined date, verified badge and the links of the About panel. One dataset answers both "how did this video do" and "how big is this creator".
  • ๐ŸŽฌ Videos, Shorts and Live streams in one run. Pick one, two or all three types. Each type gets its own cap, so Shorts never crowd out long videos.
  • โฑ๏ธ Built for daily monitoring. Set publishedAfter to 1 day on a schedule and each run returns only the new uploads. With the latest sort the run stops at the first older video, so watching 100 channels stays quick.
  • ๐Ÿงน A clean dataset, every time. One row is one real video. A channel that does not exist or a tab a channel does not have produces no row and a clear message on the run. Unknown values are null, never an empty string, and no video appears twice.
  • ๐Ÿ”‘ No API key, no login. Nothing to create in a cloud console, no daily quota to watch, no account to connect. Paste a channel and press Start.

๐ŸŽฏ What you can do with YouTube channel data

TeamWhat they build
Influencer marketingA vetting sheet per creator before a deal: median views of the last 30 videos, likes per view, upload cadence, country and contact links
Competitive researchA weekly digest of everything rival channels published, with the videos that beat the channel's average
Content and SEOA ranked list of a niche's most viewed videos by channel, with titles, descriptions and tags to find the topics that work
Social listeningA daily feed of new uploads from a watchlist of 200 channels, pushed to Slack or a database
Data and AIA full catalogue of a channel (titles, descriptions, durations, dates) as the index for transcripts, search or RAG
Media and sponsorship salesA report of a partner channel's Shorts and long videos with exact views 7 and 30 days after release
Lead generationA list of channels in a vertical with subscribers, country and the website and social links from the About panel

๐Ÿ“ฅ Input parameters

Essentials

FieldTypeDescription
channelUrlsarray, requiredChannels to read, one per line. Accepts a channel address (https://www.youtube.com/@mkbhd, with or without /videos), a handle (@mkbhd) or a channel id (UCBJycsmduvYEL83R_U4JriQ). Older /c/name and /user/name addresses work too.
maxItemsinteger, default 50Maximum rows per channel, for each selected video type. 50 with Videos and Shorts selected returns up to 100 rows per channel.

๐Ÿ” Filters

FieldTypeDescription
videoTypesarray, default ["videos"]Tabs to read: videos, shorts, streams. A channel without one of these tabs returns nothing for it.
sortBystring, default latestlatest (newest first), popular (most viewed of all time) or oldest (first uploads of the channel). The order decides what the cap keeps.
publishedAfterstringKeep only videos published after a date (2026-01-31) or within an age (7 days, 2 weeks, 3 months, 1 year).

๐Ÿ“„ Output

FieldTypeDescription
includeDetailsboolean, default trueOn: exact date and time, exact views, likes, description, tags, hashtags, category. Off: a faster listing with title, rounded views, duration and an estimated date.

โš™๏ธ Advanced

FieldTypeDescription
debugModeboolean, default falseAdds detailed lines to the run log. Leave it off for normal runs.

๐Ÿ“Š Output data

Each row is one video. With details on (the default), a regular video looks like this:

{
"id": "ohqxP8EEumo",
"url": "https://www.youtube.com/watch?v=ohqxP8EEumo",
"title": "iPhone 18 Pro Review: All About that Chip",
"type": "video",
"description": "iPhone 18 Pro is basically an S year upgrade. And one part of it is really impressive.\n\n0:00 Intro\n1:21 This Camera\n6:47 The Chip\n10:20 Battery Boost\n13:04 The Little Things\n14:22 Conclusion",
"category": "Science & Technology",
"tags": null,
"hashtags": null,
"duration": "00:16:35",
"durationSeconds": 995,
"isLive": false,
"isMembersOnly": false,
"channelId": "UCBJycsmduvYEL83R_U4JriQ",
"channelName": "Marques Brownlee",
"channelUsername": "@mkbhd",
"channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
"channelDescription": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!",
"channelLocation": "United States",
"channelJoinedDate": "2008-03-21T00:00:00Z",
"numberOfSubscribers": 21200000,
"channelTotalVideos": 1851,
"channelTotalViews": 5658099674,
"isChannelVerified": true,
"channelLinks": [
{ "text": "Twitter", "url": "http://twitter.com/MKBHD" },
{ "text": "Instagram", "url": "http://instagram.com/MKBHD" },
{ "text": "Discord", "url": "http://discord.gg/MKBHD" }
],
"viewCount": 8009051,
"likes": 124170,
"date": "2026-09-16T12:01:27Z",
"thumbnailUrl": "https://i.ytimg.com/vi/ohqxP8EEumo/maxresdefault.jpg",
"channelAvatarUrl": "https://yt3.googleusercontent.com/qu4TmIaYUlS41-dJ9gZ7DUR3nilvmB5_11i6OKSdvNnBNiyOusZP1bMN6ICnuxtjFBb6ioKgRQ=s900-c-k-c0x00ffffff-no-rj",
"channelBannerUrl": "https://yt3.googleusercontent.com/zi_48HwHU4s0Hnb6tZuvRzTfCPHrLEnrtIMDLzMauDEyDmURh9JZ4wrNd3lKr7m9uVnT4YjYKw=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
"order": 0,
"input": "https://www.youtube.com/@mkbhd",
"scrapedAt": "2026-09-17T13:17:10Z"
}

With details off, a Short from the listing keeps the same 33 columns. What the listing does not show reads null (channel block shortened here):

{
"id": "tI704AA0B2I",
"url": "https://www.youtube.com/shorts/tI704AA0B2I",
"title": "Web scraping: which websites can't you scrape? #apify #webscraping #coding",
"type": "short",
"description": null,
"duration": null,
"viewCount": 725,
"likes": null,
"date": null,
"channelName": "Apify",
"numberOfSubscribers": 26000,
"thumbnailUrl": "https://i.ytimg.com/vi/tI704AA0B2I/frame0.jpg",
"order": 0,
"input": "@Apify",
"scrapedAt": "2026-09-17T13:17:21Z"
}

๐Ÿ—‚๏ธ Data fields

33 fields per row: 4 identity, 8 content, 12 channel, 2 measures, 1 date, 3 media, 3 meta. channelLinks is the only nested field, a list of { text, url } pairs.

GroupFields
Identityid, url, title, type (video, short or stream)
Contentdescription, category, tags, hashtags, duration (HH:MM:SS), durationSeconds, isLive, isMembersOnly
ChannelchannelId, channelName, channelUsername, channelUrl, channelDescription, channelLocation, channelJoinedDate, numberOfSubscribers, channelTotalVideos, channelTotalViews, isChannelVerified, channelLinks
MeasuresviewCount, likes
Timedate (RFC 3339, UTC)
MediathumbnailUrl, channelAvatarUrl, channelBannerUrl
Metaorder (position in the channel listing, per type), input (the channel as you typed it), scrapedAt (RFC 3339, UTC)

Good to know when you store the data:

  • id is YouTube's permanent video id and channelId the permanent channel id. Both survive a title change or a handle change. url and channelUrl are built from them and are permanent.
  • date is the release date of a video and the start of the broadcast for a live stream.
  • thumbnailUrl, channelAvatarUrl and channelBannerUrl are image links served by YouTube. They stay valid as long as the creator keeps the image.
  • tags and hashtags are filled when the creator publishes them. Many channels publish none, and the fields then read null.
  • numberOfSubscribers is rounded by YouTube itself (21200000 for "21.2M"). Total views and total videos are exact.
  • A stream that is live right now has isLive: true and no duration yet.
  • A video reserved for the paying members of a channel is listed with isMembersOnly: true. YouTube publishes its title, date, duration and likes, and no view count, so viewCount reads null. Filter on this flag before computing averages.

๐Ÿš€ Examples

Get the 50 latest videos of a channel

{
"channelUrls": ["https://www.youtube.com/@mkbhd"]
}

Find the 100 most viewed videos of two competitors

{
"channelUrls": ["@LinusTechTips", "@mkbhd"],
"sortBy": "popular",
"maxItems": 100
}

Pull only what a watchlist published since yesterday

Put this on a daily schedule. Each run returns the new uploads and nothing else.

{
"channelUrls": ["@mkbhd", "@LinusTechTips", "@veritasium", "@TED"],
"publishedAfter": "1 day",
"maxItems": 20
}

Export a channel's Shorts and long videos together

{
"channelUrls": ["https://www.youtube.com/@MrBeast"],
"videoTypes": ["videos", "shorts"],
"maxItems": 200
}

List a channel's live streams, past and current, as fast as possible

{
"channelUrls": ["@LofiGirl"],
"videoTypes": ["streams"],
"includeDetails": false,
"maxItems": 100
}

Rebuild the first year of a channel from its very first upload

{
"channelUrls": ["UCBJycsmduvYEL83R_U4JriQ"],
"sortBy": "oldest",
"maxItems": 150
}

๐Ÿค– Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the Youtube Channel Scraper on Apify: silentflow/youtube-channel-scraper
Input schema:
- channelUrls (required, array of strings): channel addresses, @handles or channel ids (UC...)
- maxItems (integer, default 50): max rows per channel, for each selected video type
- videoTypes (array, default ["videos"]): any of "videos", "shorts", "streams"
- sortBy (string, default "latest"): "latest", "popular" or "oldest"
- publishedAfter (string, optional): "2026-01-31" or an age like "7 days", "2 weeks", "3 months", "1 year"
- includeDetails (boolean, default true): exact date, exact views, likes, description, tags, hashtags, category
- debugMode (boolean, default false)
Output, one row per video (33 fields, null when unknown):
- id (string), url (string), title (string), type ("video" | "short" | "stream")
- description (string), category (string), tags (string[]), hashtags (string[])
- duration ("HH:MM:SS"), durationSeconds (integer), isLive (boolean), isMembersOnly (boolean)
- channelId, channelName, channelUsername, channelUrl, channelDescription, channelLocation (strings)
- channelJoinedDate (RFC 3339), numberOfSubscribers, channelTotalVideos, channelTotalViews (integers)
- isChannelVerified (boolean), channelLinks ({text, url}[])
- viewCount (integer), likes (integer)
- date (RFC 3339 UTC)
- thumbnailUrl, channelAvatarUrl, channelBannerUrl (strings)
- order (integer), input (string), scrapedAt (RFC 3339 UTC)
No API key and no login needed. Use apify-client for Python or JavaScript.

๐Ÿ’ป Integrations

Score a creator before a sponsorship deal (Python)

from statistics import median
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/youtube-channel-scraper").call(run_input={
"channelUrls": ["@mkbhd"],
"maxItems": 30,
})
videos = list(client.dataset(run["defaultDatasetId"]).iterate_items())
public = [v for v in videos if not v["isMembersOnly"] and v["viewCount"]]
views = [v["viewCount"] for v in public]
likes = [v["likes"] or 0 for v in public]
channel = videos[0]
print(channel["channelName"], channel["numberOfSubscribers"], "subscribers,", channel["channelLocation"])
print("Median views, last 30 videos:", median(views))
print("Likes per 1,000 views:", round(1000 * sum(likes) / sum(views), 1))

Post new uploads from a watchlist to Slack (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('silentflow/youtube-channel-scraper').call({
channelUrls: ['@LinusTechTips', '@mkbhd', '@veritasium'],
publishedAfter: '1 day',
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const video of items) {
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: 'POST',
body: JSON.stringify({ text: `${video.channelName} published "${video.title}" ${video.url}` }),
});
}

Find the videos that beat a channel's average (Python, CSV export)

import csv
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/youtube-channel-scraper").call(run_input={
"channelUrls": ["@veritasium"],
"maxItems": 200,
})
videos = list(client.dataset(run["defaultDatasetId"]).iterate_items())
average = sum(v["viewCount"] or 0 for v in videos) / len(videos)
winners = sorted((v for v in videos if (v["viewCount"] or 0) > 2 * average), key=lambda v: -v["viewCount"])
with open("winners.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["title", "date", "viewCount", "likes", "url"])
for v in winners:
writer.writerow([v["title"], v["date"], v["viewCount"], v["likes"], v["url"]])

๐Ÿ“ˆ Performance

Measured on 17 September 2026 on real channels.

RunRowsTime
1 channel, 50 latest videos, details on (the default input)504 seconds
2 channels, 200 videos each, details on40038 seconds
2 channels, Shorts and Live streams by popularity, details off602 seconds
2 channels, videos of the last 30 days, details on273 seconds
1 channel, its whole catalogue of long videos, details off1,71947 seconds
MetricValue
Fields per row33
Videos per listing pageabout 30
Columns filled on the default runall, except tags and hashtags when the creator sets none
Limit per runno fixed limit: the cap is per channel and per type, and you choose it

๐Ÿ’พ Data export

Every run stores its rows in a dataset you can download as JSON, CSV, Excel, XML or HTML from the Storage tab, or pull from the API:

https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN

The dataset has two ready-made table views: Videos (title, channel, type, views, likes, published, duration, URL) and Channel stats (channel, handle, subscribers, videos, total views, country, joined, URL). Schedules, webhooks and the Apify integrations (Google Sheets, Slack, Zapier, Make, n8n) work on top of the same dataset.

๐Ÿ’ก Tips for best results

  1. Monitoring? Combine publishedAfter with the latest sort. "publishedAfter": "1 day" on a daily schedule reads only the top of each channel and returns only new uploads.
  2. Keep details on when dates matter. Exact dates, exact views and likes come with details. Turn details off only for a fast inventory of titles and rounded views.
  3. Use channel ids for long-lived pipelines. A creator can change an @handle. The UC... id never changes, and every row gives it to you in channelId.
  4. Size maxItems per type. With Videos and Shorts both selected, maxItems: 100 means up to 100 of each per channel.
  5. Use popular to benchmark, oldest to study a launch. The most viewed videos show what a channel is known for. The first uploads show how it started.
  6. Group rows by channelId for channel-level reports. The channel block is identical on every row of a channel, so the first row of each group is the channel's profile.

โ“ FAQ

What does this scraper extract? Every public video, Short and live stream of the channels you list, one row each, with 33 fields: the video (title, exact date, views, likes, duration, description, tags, hashtags, category, thumbnail) and its channel (name, handle, subscribers, total videos, total views, country, joined date, verified badge, links, avatar, banner).

What can I type in the channel field? A channel address in any form (https://www.youtube.com/@name, with or without a tab like /videos, /channel/UC..., /c/name, /user/name), a handle (@name) or a channel id (UC...). Anything else is skipped and named in the run log.

Do I need a YouTube account or an API key? No. The scraper reads public channel pages. There is no login, no key and no quota to manage.

How fresh is the data? Live. Every run reads YouTube at run time, nothing is served from a cache. scrapedAt tells you when each row was read.

Is there a limit on the number of videos? No fixed limit. maxItems is per channel and per type, and a run walks a channel page by page until that cap or the end of the channel. A whole catalogue of 1,719 long videos was exported in 47 seconds with details off.

Can I scrape many channels in one run? Yes. List as many channels as you need. A channel named twice, for instance once by handle and once by id, is read once, and no video is ever delivered twice in a run.

How do the filters combine? They stack. videoTypes: ["shorts"] with sortBy: "popular" and maxItems: 25 returns the 25 most viewed Shorts of each channel. Adding publishedAfter: "3 months" keeps only those released in the last three months.

Why are tags or hashtags null on some rows? Because the creator set none, or keeps them private. Hashtags are read from the description, tags are the public keywords of the video. Many large channels publish neither.

What happens with details off? You get the listing as the channel page shows it: title, rounded views (8000000 for "8M views"), duration and a date estimated from the age label ("11 days ago"). Shorts show neither age nor duration in the listing, so those two fields read null. If you set publishedAfter, the date of each Short is still read exactly, so the filter stays correct.

What if a channel does not exist or has no Shorts tab? No row is written for it. The run log names the channel, and a run that ends with no rows at all says why on the run itself. Your dataset never contains error rows.

Are the URLs permanent? url and channelUrl are permanent. Image links (thumbnailUrl, avatar, banner) stay valid as long as the creator keeps the image.

Does it get comments, transcripts or the video file? No. This scraper is about channel catalogues and performance. For transcripts, see the related scrapers below.

This Actor extracts publicly available data from YouTube. It does not bypass any login, paywall or CAPTCHA, and it does not download video files. Users are responsible for complying with YouTube's terms of service and with applicable data protection laws (GDPR, CCPA, and PIPL where relevant). The output contains creator information that creators publish themselves (channel name, description, country, links); when you process it as personal data, handle it accordingly. The data returned is informational; verify accuracy for regulated use cases.

๐Ÿ“ฌ Support

Need something this scraper does not do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing details live on the Monetization tab of the actor page

Response time: usually under 24 hours.

Check out our other scrapers: silentflow on Apify