Youtube Channel Videos Scraper
Pricing
from $2.40 / 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
from $2.40 / 1,000 channel videos
Rating
0.0
(0)
Developer

Delowar Munna
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 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
- Full enrichment — Descriptions, tags, thumbnails, and topic categories included by default
- Lightweight — No browser needed — runs on
apify/actor-node:22 - Reliable — Graceful per-channel error handling, partial result output, and detailed run summary
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) |
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) |
sortBy | string | "newest" | newest / oldest / popular (popular sorts by view count) |
dedupeAcrossChannels | boolean | true | Skip duplicate videos across channels |
Enrichment Options
| Field | Type | Default | Description |
|---|---|---|---|
includeStatistics | boolean | true | Add view count, like count, and comment count |
includeContentDetails | boolean | true | Add duration, definition (HD/SD), caption flags |
includeThumbnails | boolean | true | Add thumbnail URLs (default, medium, high, maxres) |
includeDescription | boolean | true | Include full video description |
includeTags | boolean | true | Include video tags |
Advanced Settings
| Field | Type | Default | Description |
|---|---|---|---|
youtubeApiKey | string | "" | Optional user-provided YouTube Data API v3 key |
maxConcurrency | integer | 10 | Reserved for future use (v1 processes sequentially) |
maxRetries | integer | 3 | Retries for transient API errors |
minDelayMs | integer | 0 | Delay between channels (milliseconds) |
debug | boolean | false | Enable verbose logging |
Input Examples
Example 1 — Latest 200 videos with lightweight output
Fetch the latest 200 videos from a single channel with statistics and content details, but without descriptions and tags for a smaller output size.
{"channelRefs": ["@mkbhd"],"debug": false,"dedupeAcrossChannels": true,"includeContentDetails": true,"includeDescription": false,"includeLive": false,"includeShorts": true,"includeStatistics": true,"includeTags": false,"includeThumbnails": true,"maxVideosPerChannel": 200,"sortBy": "newest","maxConcurrency": 10,"maxRetries": 3,"minDelayMs": 0}
Example 2 — Full enrichment with all fields
Fetch the latest 200 videos from a channel URL with all enrichment options enabled, including descriptions, tags, thumbnails, and live streams.
{"channelRefs": ["https://www.youtube.com/@graceleungyl"],"debug": false,"dedupeAcrossChannels": true,"includeContentDetails": true,"includeDescription": true,"includeLive": true,"includeShorts": true,"includeStatistics": true,"includeTags": true,"includeThumbnails": true,"maxVideosPerChannel": 200,"sortBy": "newest","maxConcurrency": 10,"maxRetries": 3,"minDelayMs": 0}
Output
Each video is a flat JSON record with up to 26 fields.
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 |
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 |
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 |
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

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 per-key quota usage
- Start and completion timestamps
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 - Sequential processing — Channels are processed one at a time in v1 (concurrent processing planned for v1.1)
Support & Feedback
If you encounter any issues or have feature requests, please open an issue on GitHub.