YouTube Scraper — Videos, Channels, Playlists, Comments
Pricing
from $1.26 / 1,000 results
YouTube Scraper — Videos, Channels, Playlists, Comments
Scrapes YouTube search results, video details, channels, playlists and comments — views, likes, descriptions, durations, subscriber counts and full comment threads. No login or API key. Does not download video or transcripts (YouTube gates those behind a browser-only token).
Pricing
from $1.26 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Pull structured YouTube data without an API key, an account, or a quota.
Five things in one actor, chosen with a mode setting:
| Mode | You give it | You get back |
|---|---|---|
| Search results | search terms | matching videos, ranked as YouTube ranks them |
| Video details | video IDs or URLs | one rich row each — views, likes, description, channel |
| Channel | channel IDs, @handles or URLs | the channel profile + its videos, shorts or live streams |
| Playlist | playlist IDs or URLs | the playlist + every video in it |
| Video comments | video IDs or URLs | comment threads with authors, likes and reply counts |
Why use this actor
- No API key and no quota. The official YouTube Data API costs you 10,000 units a day and makes you register a project; this needs neither.
- Exact numbers, not rounded ones. View counts come back as
1810223610, not"1.8B"— and like counts are read from the precise source rather than the abbreviated button label. - Handles, IDs or URLs — all fine.
@fireship,UCsBjURrPoezykLs9EqgamOA, a/c/legacy URL, ayoutu.be/short link, a/shorts/link. They all resolve. - Real pagination. Follows YouTube's own "load more" chain, with a duplicate-detecting stop condition so it ends when the data ends.
- Honest about gaps. Every run writes a summary row saying how many pages it walked and flagging anything YouTube itself doesn't provide.
What it does NOT do — please read before running
No video downloads, no stream URLs, and no transcripts or subtitles.
That is not an omission we can fix by trying harder. YouTube gates the player data behind a token that can only be produced by running Google's own anti-bot JavaScript in a real browser. Metadata is open; playable media and caption content are not. Any tool offering HTTP-only YouTube downloads is either running a browser somewhere or about to break.
The dangerous part, and the reason this is stated so plainly: a caption request returns HTTP 200 with an empty body, which looks like "this video has no subtitles" rather than "you were blocked". A tool that doesn't know this will quietly hand you empty transcripts. This actor omits the feature instead.
How it works
- You choose a mode and give it a list of queries, URLs or IDs.
- The actor reads YouTube's own internal data for each one, paging through results the same way the website does as you scroll.
- Rows land in your dataset, ready to download as JSON, CSV or Excel.
Input
{"mode": "channel","queries": ["@fireship"],"maxItems": 50,"channelTab": "videos","language": "en","country": "US"}
| Field | Type | Description |
|---|---|---|
mode | string | search, video, channel, playlist or comments. |
queries | array | One entry per thing to scrape — meaning depends on the mode. |
maxItems | integer | Videos (or comments) per query. 0 = as many as YouTube will page. Default 50. |
channelTab | string | videos, shorts or streams. Channel mode only. |
searchFilter | string | video, channel, playlist, movie, today, this_week, this_month. Search mode only. |
commentSort | string | top or newest. Comments mode only. |
includeChannelVideos | boolean | Off = fetch only the channel profile row, in one request. Default true. |
language / country | string | hl / gl codes, e.g. en / US. Affects localised text and relevance. |
maxConcurrency | integer | Requests in flight. Default 4 — keep it modest. |
minRequestInterval | number | Seconds between request starts. Default 0.25. |
Output
Rows share one envelope and are told apart by recordType:
VIDEO, CHANNEL, PLAYLIST, COMMENT, QUERY_SUMMARY, ERROR.
VIDEO — video details mode
{"_input": "dQw4w9WgXcQ","recordType": "VIDEO","queryMode": "video","videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","channelId": "UCuAXFkgsw1L7xaCfnd5JJOw","channelSubscriberText": "4.54M subscribers","viewCount": 1810223610,"viewCountText": "1,810,223,610 views","likeCount": 19365088,"publishedAt": "2009-10-24T00:00:00Z","publishedText": "Oct 24, 2009","description": "The official video for “Never Gonna Give You Up” by Rick Astley ...","thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"}
CHANNEL — channel mode
{"recordType": "CHANNEL","channelId": "UCsBjURrPoezykLs9EqgamOA","title": "Fireship","subscriberCount": 4250000,"subscriberText": "4.25M subscribers","videoCount": 835,"vanityUrl": "http://www.youtube.com/@Fireship","rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCsBjURrPoezykLs9EqgamOA","avatarUrl": "https://yt3.googleusercontent.com/...","bannerUrl": "https://yt3.googleusercontent.com/..."}
Followed by one VIDEO row per upload:
{"recordType": "VIDEO", "queryMode": "channel", "resultRank": 1,"title": "The most expensive software bug in history...","viewCount": 1000000, "durationSeconds": 319,"publishedText": "3 days ago", "publishedAtApprox": "2026-08-28T16:41:00Z"}
COMMENT — comments mode
{"recordType": "COMMENT", "resultRank": 1,"videoId": "dQw4w9WgXcQ","commentId": "Ugzge340dBgB75hWBm54AaABAg","text": "can confirm: he never gave us up","authorName": "@YouTube","authorChannelId": "UCBR8-60-B28hp2BmDPdntcQ","authorIsVerified": true,"likeCount": 309000,"replyCount": 963,"publishedText": "1 year ago","isReply": false}
| Field | Type | Description |
|---|---|---|
videoId / url / title | string | The video. |
channelName / channelId | string | Uploader. |
viewCount / likeCount | integer | Exact where YouTube exposes it, else null — never a guessed 0. |
durationSeconds / durationText | int / string | Length. Null on Shorts. |
publishedAt | string | Exact UTC date. Video-details mode only. |
publishedAtApprox | string | Derived from "3 days ago" on list surfaces. Approximate — the name says so. |
description | string | Full description in video mode; a snippet in search. |
subscriberCount / videoCount | integer | Channel rows. |
commentId / text / authorName | string | Comment rows. |
likeCount / replyCount | integer | Comment engagement. |
notes | array | Honesty flags on the summary row. |
Known limits
- No downloads, streams, or transcripts. See above — it's a hard gate, not a setting.
- Shorts have no publish date and no duration. YouTube's shorts shelf simply omits them. Those columns come back null and the summary row says why.
publishedAtApproxis approximate. List surfaces give "2 years ago"; only the video-details mode returns an exact date. Both are separate columns so you always know which one you have.- Comment replies aren't expanded. Top-level comments are returned; opening every "N replies" thread is a separate request per comment.
- Age-restricted and private videos return an error row, not a partial one.
- Rate limiting is real. YouTube answers a hot IP with an interstitial rather
than a clean error. The defaults are gentle; raise
minRequestIntervalbefore raisingmaxConcurrency.