YouTube Channel & Video Scraper avatar

YouTube Channel & Video Scraper

Pricing

from $0.40 / 1,000 video scrapeds

Go to Apify Store
YouTube Channel & Video Scraper

YouTube Channel & Video Scraper

Give it a channel, playlist, video link or search keyword and get the videos with title, view count, duration, publish date, thumbnail and the channel profile. Approximate values are flagged as approximate, and recent uploads are upgraded to exact figures for free.

Pricing

from $0.40 / 1,000 video scrapeds

Rating

0.0

(0)

Developer

Mehmet

Mehmet

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Give this Actor a YouTube channel, a playlist, a video link or a search keyword, and it returns the videos with their metadata: title, view count, duration, publish date, thumbnail, and the channel's own profile. One row of output is one video.

This Actor is independent and not affiliated with, endorsed by, or sponsored by YouTube or Google LLC.

What it does

Paste channel URLs, @handles, channel IDs, playlist links or single video links into Channels, playlists or videos, or use Search keywords to find videos by topic instead. For each source the Actor reads YouTube's own listing pages and returns every video it finds, up to the limits you set.

Three tabs are supported, each with its own limit so you are never billed for something you did not ask for:

  • Videos - the channel's regular uploads. Default limit 30.
  • Shorts - a separate tab on YouTube. Default limit 0.
  • Live - past and upcoming live streams. Default limit 0.

You can also choose the reading order: Latest, Popular or Oldest. Popular and Oldest reach videos that a newest-first scrape would never get to on a large channel.

What makes the data different

Most channel scrapers hand you exactly what YouTube's listing page shows: a rounded view count (5.9M views) and a relative date string (13 days ago). That is cheap to produce, and for a lot of work it is fine. The problem starts when you feed it into a spreadsheet or a database, because "13 days ago" is not a date, and it silently becomes wrong the moment it is stored.

This Actor does three things about that.

1. It gives you a real date. Every record carries publishedAt as an ISO 8601 timestamp alongside the original date string, so both the human-readable form and the machine-readable form are there.

2. It tells you when a number is approximate. Two boolean flags, viewCountIsApproximate and publishedAtIsApproximate, say plainly whether a value was derived from a rounded or relative source. Nothing is presented as exact when it is not. If a date cannot be parsed at all, publishedAt is null rather than a guess.

3. It upgrades what it can, for free. With Exact data for recent uploads left on (the default), the Actor spends one extra request per channel on that channel's public feed, which carries the exact view count, the exact publish date and the full description for its 15 most recent videos. Those records come back with both approximation flags set to false. This costs you nothing extra.

So on a typical channel scrape you get precise data for the recent videos most people actually care about, approximate-but-labelled data for the rest, and no way to confuse the two.

Channel profile, included

With Include channel profile on (the default), every record carries an aboutChannelInfo object with the channel's name, handle, description, subscriber count, total video count, total views, join date, country, links, avatar, banner and verification status. It is not billed separately.

Full details mode

Turning on Full details makes the Actor fetch every video individually. That adds:

  • the exact view count and publish date for every video, not just recent ones
  • the full description
  • the video's tags (keywords)
  • the YouTube category
  • a duration for Shorts, which the listing page does not provide

This is one extra request per video, so runs are far slower, and each video is billed an additional video-details event on top of video-scraped. Leave it off unless you need tags or exact numbers on old videos.

Honest limitations

  • Shorts have no duration and no publish date on the listing page. YouTube does not publish them there. Those fields come back null for Shorts unless you turn on Full details. This is a limit of the source, and it is stated here rather than hidden behind an empty column.
  • Date filters are approximate for older videos. "Published after" and "Published before" work on publishedAt. For the 15 most recent uploads of a channel that value is exact. Beyond that it is derived from a relative string like 3 weeks ago, so a video near the boundary can fall on either side. The flags on every record tell you which is which.
  • A video with no known date is never filtered out. Shorts would otherwise vanish silently from a date-filtered run, and you would have no way to tell why.
  • Live streams currently airing have no view count. YouTube shows concurrent viewers instead, and that number is in concurrentViewers with liveStatus: "live".

Input

FieldDefaultWhat it does
startUrls-Channel URLs, @handles, channel IDs, playlist links, video links
searchKeywords-Search YouTube by keyword instead of pasting URLs
maxVideos30Videos tab limit per source
maxShorts0Shorts tab limit per source
maxStreams0Live tab limit per source
sortVideosBylatestlatest, popular or oldest
oldestPostDate-Skip videos published before this date
newestPostDate-Skip videos published after this date
enrichWithFeedtrueExact data for the 15 most recent uploads. Free
includeChannelAbouttrueAttach the channel profile. Free
fullDetailsfalseOne request per video: tags, exact numbers. Billed extra
incrementalfalseSkip videos delivered by earlier runs of the same task
previewOnlyfalseReport what would be scraped and billed, deliver nothing
maxPagesPerSource10Pagination hard stop, roughly 30 videos per page

A channel link gives you that channel's videos. A playlist link gives you the videos on that playlist. A single video link gives you that one video with its full details - not the whole channel it belongs to, so pasting a list of video URLs bills you for those videos and nothing more.

Output

{
"id": "wt4p2oalmRY",
"title": "Is spider web really stronger than steel?",
"duration": "26:58",
"channelName": "Veritasium",
"channelUsername": "veritasium",
"channelUrl": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA",
"date": "13 days ago",
"url": "https://www.youtube.com/watch?v=wt4p2oalmRY",
"viewCount": 5945666,
"fromYTUrl": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA",
"type": "video",
"thumbnailUrl": "https://i.ytimg.com/vi/wt4p2oalmRY/hqdefault.jpg",
"input": "https://www.youtube.com/@veritasium",
"order": 0,
"videoId": "wt4p2oalmRY",
"channelId": "UCHnyfMqiRRG1u-2MsSQLbXA",
"durationSeconds": 1618,
"publishedAt": "2026-08-02T13:21:11.000Z",
"publishedAtIsApproximate": false,
"viewCountIsApproximate": false,
"concurrentViewers": null,
"liveStatus": "none",
"description": "The full video description...",
"keywords": [],
"category": null,
"scrapedAt": "2026-08-15T18:00:00.000Z",
"contentHash": "…",
"aboutChannelInfo": {
"channelName": "Veritasium",
"channelUsername": "veritasium",
"channelId": "UCHnyfMqiRRG1u-2MsSQLbXA",
"channelUrl": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA",
"channelDescription": "An element of truth - videos about science…",
"channelDescriptionLinks": [],
"channelJoinedDate": "Jul 21, 2010",
"channelLocation": "Australia",
"channelAvatarUrl": "https://yt3.googleusercontent.com/…",
"channelBannerUrl": "https://yt3.googleusercontent.com/…",
"channelTotalVideos": 526,
"channelTotalViews": 3123456789,
"numberOfSubscribers": 21100000,
"isChannelVerified": true,
"inputChannelUrl": "https://www.youtube.com/@veritasium"
}
}

keywords and category are filled only in Full details mode.

Already using another YouTube channel scraper?

The first block of fields uses the same names and the same shapes as the most widely used channel scraper on Apify, including the nested aboutChannelInfo object. Existing integrations, spreadsheets and Make or Zapier flows keep working; the extra fields are additions, not replacements.

Billing

Two pay-per-event charges:

EventWhen
video-scrapedEvery video record delivered to the dataset
video-detailsOnly in Full details mode, once per video, on top of the above

Nothing else is billed. The channel profile, the free exact-data upgrade, pagination and search all cost you nothing beyond the videos they produce.

Incremental mode remembers which videos a task already delivered and skips them, so a scheduled run does not bill you a second time for a video you already have.

Free preview reports exactly which videos would be scraped and how many would be billed, and delivers none of them. Each preview row carries videosToCharge and, when Full details is on, detailEventsToCharge as well - so the preview never understates what a real run would cost. Listing pages are cheap for us, so this preview is free for you. One caveat, stated plainly: Apify's own platform charges an Actor start event on every run, and no Actor can suppress that. "Free preview" means no scraping charges, not a zero-cost run.

Frequently asked

Why is viewCount rounded on older videos? Because YouTube's listing page only shows 5.9M views there. The exact number needs a separate request per video, which is what Full details mode does. Rather than silently present the rounded figure as exact, the record flags it.

Can I get every video on a huge channel? Raise maxVideos and maxPagesPerSource. Each page holds about 30 videos, so 100 pages reaches roughly 3,000 videos. If a source had more videos than your limits allowed, the run status says so instead of quietly cutting the list short.

Does it need a proxy? No. Everything it does works from a plain datacenter connection, which is part of why it is cheap to run.

What happens if YouTube blocks the run? After five consecutive blocked or rate-limited sources the Actor stops on purpose and says why in the run status, rather than burning the rest of your run on requests that are not succeeding. Whatever it already delivered stays in the dataset.