Youtube Channel Videos Scraper
Pricing
$0.75 / 1,000 channel videos
Youtube Channel Videos Scraper
YouTube Channel Videos Scraper is an Apify actor that extracts a channel's videos at scale — latest uploads, popular videos, and filtered ranges — and returns a clean dataset of per-video records suitable for analytics, monitoring, and downstream enrichment.
Pricing
$0.75 / 1,000 channel videos
Rating
5.0
(1)
Developer
Delowar Munna
Maintained by CommunityActor stats
0
Bookmarked
32
Total users
3
Monthly active users
17 days ago
Last modified
Categories
Share
Extract a channel's videos at scale — latest uploads, popular videos, filtered ranges. Uses YouTube Data API v3 for fast, reliable extraction with pagination up to thousands of videos per channel. No browser or proxy required.

Key Features
- Channel resolution — Accepts
@handle, channel URL,/channel/UC...,/c/custom,/user/legacy - Deep pagination — Extract up to 5,000 videos per channel via uploads playlist
- Statistics enrichment — Views, likes, comments via batched
videos.listAPI calls - Content details — Duration, HD/SD, caption flags, licensed content, topic categories
- Shorts & Live detection — Automatic classification based on duration and broadcast content
- Date filtering — Filter by publish date range (
startDate/endDate) - Sorting — Newest, oldest, or most popular (by view count)
- Multi-channel — Process multiple channels in a single run with cross-channel deduplication
- Channel profile — Subscriber count, total views/videos, description, country, joined date, avatar & banner per record (no extra API quota)
- Full enrichment — Descriptions, tags, thumbnails, topic categories, extracted description links, and hashtags always included — nothing to configure
- Lightweight — No browser needed — runs on
apify/actor-node:22 - Reliable — Graceful per-channel error handling, partial result output, and detailed run summary
Why Choose This Actor?
- Official API, not scraping — built on the official YouTube Data API v3. No residential proxies, no unofficial endpoints, no browser automation to break when YouTube changes its HTML. That means fewer failed runs and no dependency on a paid proxy plan.
- Clean, flat, spreadsheet-ready output — a single flat record per video imports straight into Google Sheets, Excel, or a BI tool. No nested unwrapping required.
- Deep by default — up to 5,000 videos per channel, multiple channels per run, with cross-channel deduplication.
- Rich per-video metadata — statistics, duration, Shorts/Live flags, tags, topic categories, caption/definition/licensed flags, thumbnails, channel profile, description links, and hashtags — full enrichment on every record, no setup required.
- Cost control built in —
maxVideosPerChannelandmaxTotalResultscap how many records a run produces (and bills), even across many channels. - Transparent & auditable — every record carries
source,runId,sourceChannelRef, andretrievedAt, and each run writes aRUN_SUMMARY.json.
How It Works
- Resolve channel — Convert
@handle, URL, or channelId to a canonical channelId viachannels.list - Get uploads playlist — Fetch the channel's uploads playlist ID via
contentDetails - Paginate playlist — Extract video IDs via
playlistItems.list(50 per page, up to 5,000) - Enrich videos — Batch enrich with
videos.list(50 per call) for stats, duration, descriptions, tags, and topics - Filter & sort — Apply date range, Shorts/Live toggles, and sort order
- Output — Push clean per-video records to dataset + write
RUN_SUMMARY.json
Input
Channel Settings
| Field | Type | Default | Description |
|---|---|---|---|
channelRefs | string[] | required | Channel references: @handle, channel URL, /channel/UC..., /c/customURL |
maxVideosPerChannel | integer | 200 | Max videos per channel (1–5,000) |
maxTotalResults | integer | 0 | Global cap on total videos across all channels (0 = no limit) |
includeShorts | boolean | true | Include YouTube Shorts (videos ≤60 seconds) |
includeLive | boolean | false | Include live streams and premieres |
Filtering & Sorting
| Field | Type | Default | Description |
|---|---|---|---|
startDate | string | "" | Include videos published on/after this date (YYYY-MM-DD) |
endDate | string | "" | Include videos published on/before this date (YYYY-MM-DD) |
publishedWithinDays | integer | 0 | Only include videos from the last N days (0 = disabled; applied on top of start/end date) |
sortBy | string | "newest" | newest / oldest / popular (popular sorts by view count) |
dedupeAcrossChannels | boolean | true | Skip duplicate videos across channels |
Enrichment — always on
Every run returns the complete record. Channel profile (subscribers, total views/videos, description, country, joined date, avatar, banner), statistics, content details, thumbnails, full description, description links, hashtags, tags, and topic categories are all included automatically — there are no enrichment toggles to set.
Input Examples
Example 1 — Latest 200 videos from a single channel
Fetch the 200 most recent videos from one channel, newest first. Every record comes fully enriched.
{"channelRefs": ["@mkbhd"],"maxVideosPerChannel": 200,"includeShorts": true,"includeLive": false,"sortBy": "newest","dedupeAcrossChannels": true}
Example 2 — Popular videos from the last 90 days, across channels, with a global cap
Pull each channel's most-viewed uploads from the last 90 days across three channels, capped at 1,000 total billed records.
{"channelRefs": ["@mkbhd","https://www.youtube.com/@veritasium","UC_x5XG1OV2P6uZZ5FSM9Ttw"],"maxVideosPerChannel": 500,"maxTotalResults": 1000,"publishedWithinDays": 90,"includeShorts": true,"includeLive": true,"sortBy": "popular","dedupeAcrossChannels": true}
Output
Each video is a flat JSON record with up to 39 fields — full channel and video enrichment is included on every record.
Output Fields
| Field | Type | Description |
|---|---|---|
retrievedAt | string | Fetch timestamp (ISO 8601) |
channelId | string | Channel ID |
channelTitle | string | Channel name |
channelHandle | string | @handle |
channelUrl | string | Canonical channel URL |
sourceChannelRef | string | The original input reference that produced this record |
channelSubscriberCount | integer | Channel subscribers (null if hidden) |
channelVideoCount | integer | Total public videos on the channel |
channelViewCount | integer | Total channel views |
channelCountry | string | Channel country code |
channelPublishedAt | string | Channel creation/joined date (ISO 8601) |
channelDescription | string | Channel "About" text |
channelAvatarUrl | string | Channel avatar image URL |
channelBannerUrl | string | Channel banner image URL |
videoId | string | Video ID |
videoUrl | string | Watch URL or /shorts/ URL |
title | string | Video title |
publishedAt | string | Publish timestamp (ISO 8601) |
publishDate | string | YYYY-MM-DD |
order | integer | 1-based result position within the channel (after sort) |
videoType | string | Normalized type: regular / short / live |
duration | string | ISO 8601 duration (e.g., PT12M36S) |
durationSeconds | integer | Duration in seconds |
isShorts | boolean | Shorts flag (duration ≤60s) |
isLive | boolean | Live/premiere indicator |
viewCount | integer | Views |
likeCount | integer | Likes (may be hidden) |
commentCount | integer | Comments (may be disabled) |
thumbnails | object | Thumbnail URLs (default/medium/high/standard/maxres) |
description | string | Full video description |
descriptionLinks | object[] | Links extracted from the description ({ url, text }) |
hashtags | string[] | Hashtags extracted from the title + description |
tags | string[] | Video tags |
definition | string | hd / sd |
caption | string | true / false |
licensedContent | boolean | Licensing flag |
topicCategories | string[] | Wikipedia topic category URLs |
source | string | api or api_partial |
runId | string | Apify run ID |
Output Example

Export Formats
Results are stored in an Apify dataset and can be exported in one click to JSON, CSV, Excel, XML, or HTML, or pulled programmatically via the Apify API and the Python / JavaScript clients. The flat record structure maps cleanly to spreadsheet columns.
Pricing
This Actor uses pay-per-event billing — you are charged per video record emitted. Failed channels emit an error item and are not charged.
Example costs at $0.75 / 1,000 videos (see the Actor's Pricing tab on Apify for the current rate):
| Scenario | Videos | Est. cost |
|---|---|---|
| 1 channel × 200 videos | 200 | ~$0.15 |
| 5 channels × 200 videos | 1,000 | ~$0.75 |
| 1 channel × 1,000 videos | 1,000 | ~$0.75 |
| 10 channels × 500 videos | 5,000 | ~$3.75 |
Use
maxTotalResultsto hard-cap the number of billed records on large multi-channel runs.
Performance
| Scenario | Typical Time |
|---|---|
| 1 channel x 200 videos | ~30–90 seconds |
| 10 channels x 200 videos | ~5–15 minutes |
| 1 channel x 5,000 videos | ~10–40 minutes |
Run Summary
Each run saves RUN_SUMMARY.json to the Key-Value Store with:
- Total channels processed / failed
- Total videos emitted
- Per-channel video counts
- Errors by channel
- API call count and quota usage
- Start and completion timestamps
Error Items
If a channel can't be resolved or processed, the Actor pushes a distinct error item to the dataset instead of failing the whole run (and does not charge for it):
{"isError": true,"sourceChannelRef": "@this-channel-does-not-exist","error": "Could not resolve channel: \"@this-channel-does-not-exist\"","retrievedAt": "2026-07-09T05:00:00.000Z","runId": "JxebN0GRa9nkLuhDa"}
Filter these out with isError (or keep them to audit which inputs failed).
Use Cases
- Competitor analysis — Export and compare video catalogs across channels
- Content audits — Analyze upload frequency, Shorts vs long-form ratio, and engagement
- Dataset generation — Build research datasets of niche channels
- Marketing research — Identify trending topics and high-performing content
- Monitoring & alerts — Track new uploads from partner/influencer channels
- Watchlist building — Create video lists for further scraping (comments, transcripts, etc.)
Limitations
- Uploads playlist only — Private and unlisted videos are excluded (YouTube API limitation)
- Shorts detection — Based on duration heuristic (≤60s); may not catch all edge cases
- Live detection — Only detects currently live or upcoming; past live streams show as
false - Hidden stats — Like count and comment count may be
nullif the creator has hidden them;channelSubscriberCountisnullwhen the channel hides its subscriber count - No verification flag — The official YouTube Data API does not expose a channel "verified" status, so it is not included
- Sequential processing — Channels are processed one at a time (concurrent processing planned for a future release)
FAQ
Is this legal? The Actor reads only publicly available channel and video data through the official YouTube Data API v3. It does not access private, deleted, or unlisted videos, and it collects no private personal data.
Do I need a proxy? No. Because it uses the official API, there is no proxy or residential-IP requirement and no proxy plan to pay for.
Do I need my own API key? No. The Actor is ready to run out of the box — you don't need to provide, configure, or manage anything.
Is there a limit on how many videos I can pull? Up to 5,000 per channel per run, across as many channels as you like. Very large runs may be subject to YouTube's daily API limits; if a job reaches that ceiling it can be continued the next day.
Why is likeCount or commentCount sometimes empty? The creator has hidden likes, or disabled comments — YouTube then returns no value.
How do I control cost? Use maxVideosPerChannel and maxTotalResults to cap how many videos (and therefore billed records) a run produces.
Which export formats are supported? JSON, CSV, Excel, XML, and HTML — plus the Apify API and Python/JS clients.
Support & Feedback
If you encounter any issues or have feature requests, please open an issue on GitHub.