YouTube Channel Video Scraper avatar

YouTube Channel Video Scraper

Pricing

from $1.00 / 1,000 videos

Go to Apify Store
YouTube Channel Video Scraper

YouTube Channel Video Scraper

Scrape videos or Shorts from YouTube channels with full channel info on every row: views, likes, comments, duration, exact publish time, description, links, subscribers, country and more. Sort by latest, popular or oldest. No API key needed.

Pricing

from $1.00 / 1,000 videos

Rating

0.0

(0)

Developer

Mr T

Mr T

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

an hour ago

Last modified

Share

YouTube Channel Video Scraper

Get a channel's videos or Shorts, with the full channel profile attached to every row: exact views, likes, comment count, duration, exact publish time, description, links, tags, plus the channel's subscribers, total views, country, join date, About links and verified badge. Sort by latest, popular or oldest, just like the buttons on the channel page. No API key, no quota, no Google account.

You only pay per video returned. Channels that don't exist or have no videos still appear in the results so you know what happened, but they are free.

What you get for each video

  • Title, URL, thumbnail, full description, links found in the description, hashtags and tags
  • Exact view count, like count and comment count
  • Exact publish time (UTC, to the second) and duration (HH:MM:SS and seconds)
  • Category and a members-only flag
  • Channel: name, ID, handle, URL, full description, subscribers, total views, total videos, country (ISO code), join date, avatar, banner, verified badge and the links from its About panel

How to use it

  1. Add channels to Channel URLs, handles or IDs. All of these work: https://www.youtube.com/@MrBeast, @MrBeast, UCX6OQ3DkcsbYNE6H8uQQuVA, /channel/UC…, /c/name and /user/name links.
  2. Set Max videos per channel (up to 1,000).
  3. Choose Long-form videos or Shorts, and the sort order.
  4. Click Start, then download the results as JSON, CSV, Excel or HTML.

Example input

{
"channelUrls": ["https://www.youtube.com/@MrBeast", "@PewDiePie"],
"maxResults": 30,
"videoType": "long",
"sortOrder": "latest"
}

channelHandle and channelId are also accepted for a single channel.

Example output

{
"title": "Lose 150 Lbs Together, Win $250,000",
"type": "video",
"id": "RE3_PGwDwhw",
"url": "https://www.youtube.com/watch?v=RE3_PGwDwhw",
"thumbnailUrl": "https://i.ytimg.com/vi/RE3_PGwDwhw/maxresdefault.jpg",
"viewCount": 142698007,
"date": "2026-10-17T16:00:18Z",
"likes": 1940843,
"commentsCount": 68193,
"duration": "00:43:16",
"durationSeconds": 2596,
"description": "…",
"descriptionLinks": [{ "url": "https://fstbls.com/5mj6dv", "text": "https://fstbls.com/5mj6dv", "type": "url" }],
"hashtags": [],
"tags": [],
"category": "Entertainment",
"defaultAudioLanguage": "en",
"defaultLanguage": null,
"isMembersOnly": false,
"channelName": "MrBeast",
"channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelUsername": "@mrbeast",
"channelDescription": "SUBSCRIBE FOR A COOKIE!…",
"channelJoinedDate": "2012-02-19T00:00:00Z",
"channelLocation": "US",
"channelAvatarUrl": "https://yt3.googleusercontent.com/…",
"channelBannerUrl": "https://yt3.googleusercontent.com/…",
"channelTotalVideos": 1009,
"channelTotalViews": 144353642443,
"numberOfSubscribers": 523000000,
"isChannelVerified": true,
"channelExternalLinks": [{ "title": "Follow", "url": "https://www.instagram.com/mrbeast/" }],
"order": 0,
"scrapeVideoType": "long",
"scrapeSortOrder": "latest"
}

When a channel can't be scraped, you get one item like this instead (not charged):

{
"url": "https://www.youtube.com/@invalidchannel",
"input": "@invalidchannel",
"error": "CHANNEL_DOES_NOT_EXIST",
"note": "Channel does not exist"
}
errorMeaning
CHANNEL_DOES_NOT_EXISTNo channel at that URL, or the channel was terminated.
NO_VIDEOSThe channel has no public videos (or no Shorts, when scraping Shorts).
INVALID_INPUTThe value isn't a YouTube channel URL, handle or ID.
NO_VALID_START_URLSNone of the inputs could be parsed.
BLOCKED, RATE_LIMITED, TIMEOUT, NETWORK_ERROR, SERVER_ERROR, HTTP_ERROR, UNEXPECTED_RESPONSEYouTube refused or failed on every retry. Running again usually works.

Good to know

  • Subscriber counts are rounded by YouTube to 3 significant figures (523M becomes 523000000), the same as in the official API. Hidden counts are null.
  • Hidden likes are null, never 0. commentsCount is null when comments are turned off.
  • Members-only videos are included and flagged with isMembersOnly: true. YouTube hides their view and comment counts from non-members, so those are null.
  • Join date is the day only (T00:00:00Z) unless you supply an API key.
  • Live streams aren't included. They live in a separate tab on YouTube; this actor reads the Videos or Shorts tab.
  • Two inputs that point to the same channel are scraped once.

Optional: your own YouTube Data API key

Not needed. Spoken language (defaultAudioLanguage) is the original audio track, not an auto-dub and not the viewer's default captions. A player response that comes back without that track is retried; if it never arrives, defaultAudioLanguageStatus is unreadable instead of a silent blank. If you add a key under Advanced, video and channel details come from the official API, which adds the exact join time and defaultLanguage. The video list is still read from the channel page so all three sort orders work. It uses about 1 quota unit per 50 videos plus 1 per channel, far under the free 10,000 units a day. If the key is invalid or out of quota, the run carries on by scraping.

Proxies

The default Apify datacenter proxy works well for channel pages. If YouTube starts blocking it during a run, the scraper switches to Apify Residential on its own. You can also pick Residential up front.

Using it from code

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('adaptable_wheelhouse/youtube-channel-video-scraper').call({
channelUrls: ['https://www.youtube.com/@MrBeast'],
maxResults: 30,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

This actor reads only public pages that anyone can see on youtube.com without logging in. Channel descriptions can contain personal data such as business email addresses, which is protected by laws such as GDPR. Only collect it if you have a legitimate reason, and check with a lawyer if you are unsure.