YouTube Scraper — Channel, Videos, Shorts & Comments — $3.7/1k
Pricing
from $1.17 / 1,000 results
YouTube Scraper — Channel, Videos, Shorts & Comments — $3.7/1k
YouTube scraper for channels, videos, Shorts, search and comments. Channel About info, subscriber counts, likes, tags, chapters. Bulk Google Sheet input and new-item monitoring. No API key, no quota. No login or cookies. MCP-ready for AI agents. $3.7 per 1,000 records.
Pricing
from $1.17 / 1,000 results
Rating
0.0
(0)
Developer
Khrystyna Skotte
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
16 days ago
Last modified
Categories
Security
Limited permissionsShare
YouTube Scraper: Channel, Videos, Shorts & Comments
Scrape YouTube without an API key, a Google Cloud project or a daily quota. This YouTube scraper reads YouTube's own web endpoints and returns structured rows for search results, channel videos, Shorts, live streams, playlists, video details, comments and channels. Everything runs in one actor, in plain HTTP (no browser), so runs are short and cheap.
What you can pull
- Channel videos, Shorts and streams from any channel URL, @handle or
UC...id, sorted newest, popular or oldest, with an optional cut-off date. - Search results for any query, with YouTube's own filters: upload date, duration, type (video, Shorts, movie, channel, playlist), and features such as 4K, HD, live, subtitles, Creative Commons, 360, VR180, 3D, HDR, location.
- Video details: exact views, exact likes, publish timestamp, category, tags, hashtags, chapters, comment count, unlisted and family-safe flags, live start and end times.
- Comments for every video: author, channel id, text, likes, reply count, pinned, hearted, edited.
- Channel profile on every row: handle, subscriber count, total views, video count, country, join date, description, external links, keywords, avatar, banner, RSS feed URL.
- Channel search that returns creator lists (a lead list of channels in a niche, with links and country).
- Playlists (all videos of a playlist) and playlist search.
- Bulk input from a CSV or Google Sheet, and a monitor mode that returns only items you have not seen before.
Transcripts and subtitles are not included. YouTube now requires a proof-of-origin token for caption downloads, so this actor does not return captions, SRT files or AI summaries.
Why use it
| Need | How this actor handles it |
|---|---|
| No API key, no quota | Uses the same public endpoints the YouTube web site calls. No Google account, no key, no 10,000-unit daily limit. |
| One tool for channels, search and comments | Rows are tagged with recordType (video, comment, channel, playlist) so one dataset can hold all of them. |
| Cheap | One price per row for every record type. See Pricing below. |
| Repeatable | Schedule the actor and turn on onlyNew to get only new videos and new comments on every run. |
| Bulk | Paste a Google Sheet or CSV URL into listUrl: one channel, video, playlist, search URL, @handle or plain search phrase per row. |
| Safe for existing integrations | Every input name and output field from earlier versions still works. |
Quick start
Run it with no input and you get 10 videos for the search "python tutorial". That is only a sample so the actor works out of the box. To scrape your own targets, put them in YouTube URLs, handles or searches (startUrls):
{"startUrls": ["https://www.youtube.com/@LofiGirl","@veritasium","https://www.youtube.com/playlist?list=PL8F6B0753B2CCA128","lofi beats"],"maxItems": 20}
Each entry can be a channel URL, a video or Shorts URL, a playlist URL, a search-results URL, a hashtag URL, a bare @handle, a UC... channel id, or plain text. Plain text is treated as a search query.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array | sample search | Channel, video, Shorts, live, playlist, search-results and hashtag URLs, @handles, UC... ids, or plain search phrases. |
searchQueries | array | none | Search phrases (older input name, still supported). |
channelUrls | array | none | Channels (older input name). A bare name gets an @ added. |
videoUrls | array | none | Video URLs or ids. Always returned with full details. |
listUrl | string | none | CSV, TXT or Google Sheet URL. The first column of each row is the target. |
maxItems | integer | 10 | Maximum rows per search query, playlist or channel Videos tab. Alias: maxResults. |
channelTabs | array | ["videos"] | Which tabs to read on a channel: videos, shorts, streams. A URL ending in /shorts or /streams reads only that tab. |
maxShorts | integer | maxItems | Maximum Shorts per channel. A value above 0 turns the Shorts tab on. Alias: maxResultsShorts. |
maxStreams | integer | maxItems | Maximum live or past streams per channel. Alias: maxResultStreams. |
channelSortBy | string | newest | newest, popular or oldest for channel tabs. Alias: sortVideosBy (NEWEST, POPULAR, OLDEST). |
oldestPostDate | string | none | Only items newer than this. Use 2026-01-01 or a relative value such as 30 days, 6 months, 1 year. |
includeChannelInfo | boolean | true | Adds the channel About fields to every row (two extra requests per distinct channel, cached). |
includeVideoDetails | boolean | false | Fetches full details per video (two extra requests per video). Alias: fetchDetails. |
searchType | string | video | video, shorts, movie, channel or playlist. Alias: type. |
uploadDate | string | any | Search filter: hour, today, week, month, year. |
duration | string | any | Search filter: short (under 3 min), medium (3 to 20 min), long (over 20 min). |
features | array | none | Search filters: live, 4k, hd, subtitles, creative_commons, 360, vr180, 3d, hdr, location, purchased. Ignored for channel and playlist search. |
sortBy | string | relevance | Search order. view_count sorts by popularity. |
includeComments | boolean | false | Adds comment rows for each video. |
maxCommentsPerVideo | integer | 20 | Comment limit per video (about 20 comments per page request). |
commentsSort | string | top | top or newest. |
onlyNew | boolean | false | Monitor mode: return only items not seen in earlier runs with the same monitorId. |
monitorId | string | default | Name of the monitor. Different ids keep separate histories. |
proxyConfiguration | object | residential, US | Proxy settings. The default is what cloud runs were tested with. |
A note on sorting: YouTube removed "sort by upload date" and "sort by rating" from its search filters in 2025. Search can still be sorted by relevance or popularity. When you ask for upload_date or rating, the actor falls back to relevance and writes a warning to the log. Use uploadDate (hour, today, week, month, year) to narrow search to recent videos, or read a channel with channelSortBy: "newest".
Use cases
- Competitor and creator tracking. Read the latest videos of a list of channels every day and compare views, likes and comment counts over time.
- Influencer and creator lead lists. Use
searchType: "channel"with a niche keyword such as "woodworking" and get channels with subscriber count, country, join date, description and external links (Instagram, Patreon, websites). - Content research. Search a topic filtered to the last month and 4K or long videos, sorted by popularity, to see what is performing now. Read tags, hashtags and chapters of the winners.
- Comment mining and sentiment. Pull the top or newest comments of a product launch, a trailer or a competitor video for brand monitoring or NLP training data.
- Shorts analysis. Read the Shorts tab of a channel (
channelTabs: ["shorts"]) or search Shorts directly (searchType: "shorts"). - Market and media monitoring. Schedule the actor with
onlyNew: trueon a list of channels or keywords and send the new rows to a webhook, Slack, Google Sheets or your database. - Dataset building for AI and analytics. Collect titles, descriptions, categories and tags at volume.
- Playlist export. Dump every video of a playlist with metadata.
Input examples
Latest videos and Shorts of several channels
{"startUrls": ["@LofiGirl", "@MrBeast", "https://www.youtube.com/@veritasium"],"channelTabs": ["videos", "shorts"],"maxItems": 10,"maxShorts": 5,"channelSortBy": "newest","oldestPostDate": "30 days"}
Search with filters
{"searchQueries": ["nature documentary"],"searchType": "video","uploadDate": "year","duration": "long","features": ["4k"],"sortBy": "view_count","maxItems": 25}
Videos with full details and comments
{"startUrls": ["https://www.youtube.com/watch?v=PVSOJyG5WKU"],"includeVideoDetails": true,"includeComments": true,"maxCommentsPerVideo": 100,"commentsSort": "newest"}
Channel search for a creator lead list
{"searchQueries": ["woodworking", "home renovation"],"searchType": "channel","maxItems": 50}
Bulk list from a Google Sheet
{"listUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit","maxItems": 10,"includeVideoDetails": true}
Share the sheet so that anyone with the link can view it. The first column of each row is read as the target (URL, @handle, id or search phrase).
Monitor: only new videos and new comments
{"startUrls": ["@LofiGirl", "@veritasium"],"maxItems": 10,"includeComments": true,"commentsSort": "newest","maxCommentsPerVideo": 20,"onlyNew": true,"monitorId": "my-channels"}
The first run saves a baseline and returns the current items. Later runs return only new videos, plus new comments on videos that were already known. The history is kept in a named key-value store under your account, so it survives between runs and schedules.
Output
Every row has recordType and scrapedAt. recordType is one of video, comment, channel or playlist. Videos also carry contentType (video, short or stream) and source (search, channel, playlist, video). Fields that were not requested or not available are null or absent, so you can read all rows with one schema.
Video fields
| Field | Example | Notes |
|---|---|---|
videoId, url, title | PVSOJyG5WKU | |
channelName, channelId, channelUrl | Lofi Girl, UCSJ4gkVC6NrvII8umztf0Ow | |
viewCount, viewCountText | 144279, 144,279 views | Number plus the text as shown. |
likeCount | 1940 | Exact when details are on. |
commentCount, commentsTurnedOff | 216, false | With details. |
publishedText, publishedDate, publishedAt | Oct 19, 2026, 2026-10-19, 2026-10-19T10:07:14-07:00 | publishedAt needs details. |
durationText, durationSeconds | 0:39, 39 | |
description, descriptionSnippet | Full text with details, snippet on search rows. | |
keywords, hashtags, category, chapters | ["lofi","lo-fi"], Music | chapters is a list of {title, startSeconds}. |
isLive, wasLive, liveStartedAt, liveEndedAt | Live and past stream data. | |
isFamilySafe, isUnlisted, isShortsEligible | With details. | |
thumbnailUrl, badges | Badges such as 4K, CC, LIVE. | |
contentType, source, query | short, channel, the input you gave |
Channel fields (on video rows and on channel rows)
| Field | Example |
|---|---|
channelHandle | @LofiGirl |
channelSubscriberCount, channelSubscribersText | 15800000, 15.8M subscribers |
channelTotalViews, channelVideoCount | 2715142380, 474 |
channelCountry, channelJoinedDate | France, Mar 18, 2015 |
channelDescription, channelDescriptionLinks | text and a list of {text, url} |
channelKeywords, channelRssUrl | |
channelVerified, channelIsOfficialArtist, channelIsFamilySafe | true |
channelIsMonetized | true when the channel offers memberships, otherwise null (unknown) |
channelAvatarUrl, channelBannerUrl |
channelIsMonetized is a hint, not a statement from YouTube: it is true when the channel shows a Join (membership) button. null means unknown, not "no".
Comment fields
commentId, commentUrl, text, author, authorChannelId, authorChannelUrl, authorAvatarUrl, authorIsVerified, authorIsChannelOwner, likeCount, likeCountText, replyCount, publishedTime, isEdited, isPinned, isHearted, videoId, videoUrl, videoTitle.
Comment like counts are rounded by YouTube for anonymous visitors ("13K" becomes 13000). Only top-level comments are returned, not reply threads; replyCount tells you how many replies a comment has.
Playlist fields
playlistId, url, title, channelName, videoCount, updatedText, thumbnailUrl.
Example rows
These rows come from real runs. Long arrays are shortened here with "..." for readability.
Video with details and channel info
{"recordType": "video","source": "channel","query": "https://www.youtube.com/@LofiGirl","contentType": "video","videoId": "PVSOJyG5WKU","url": "https://www.youtube.com/watch?v=PVSOJyG5WKU","title": "LOFI PRO Headphones - Yours Now (Launch trailer)","channelName": "Lofi Girl","channelId": "UCSJ4gkVC6NrvII8umztf0Ow","viewCount": 144279,"viewCountText": "144,279 views","publishedText": "Oct 19, 2026","durationText": "0:39","durationSeconds": 39,"likeCount": 1940,"publishedDate": "2026-10-19","publishedAt": "2026-10-19T10:07:14-07:00","keywords": ["lofi girl", "lofigirl", "chilledcow", "..."],"category": "Music","commentCount": 216,"detailsFetched": true,"channelHandle": "@LofiGirl","channelCountry": "France","channelJoinedDate": "Mar 18, 2015","channelSubscriberCount": 15800000,"channelSubscribersText": "15.8M subscribers","channelVerified": true,"channelIsOfficialArtist": true,"channelIsMonetized": true,"scrapedAt": "2026-10-21T17:35:28.420Z"}
Channel (from searchType: "channel")
{"recordType": "channel","source": "search","query": "woodworking","channelId": "UCQ_bmgSrYsQS0LboA_tZpEw","channelName": "Bourbon Moth Woodworking","channelHandle": "@Bourbonmoth","channelUrl": "https://www.youtube.com/channel/UCQ_bmgSrYsQS0LboA_tZpEw","channelSubscribersText": "1.26M subscribers","channelSubscriberCount": 1260000,"channelVerified": true,"channelDescriptionLinks": [{ "text": "Bourbon Moth Homepage", "url": "https://bourbonmoth.com" },{ "text": "Patreon", "url": "https://patreon.com/bourbonmothwoodworking" },{ "text": "Instagram", "url": "https://instagram.com/bourbonmoth" }],"channelCountry": "United States","channelJoinedDate": "May 8, 2015","channelTotalViews": 150750897,"channelVideoCount": 294,"channelRssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCQ_bmgSrYsQS0LboA_tZpEw","scrapedAt": "2026-10-21T17:32:50.306Z"}
Comment
{"recordType": "comment","source": "comment","videoId": "PVSOJyG5WKU","videoUrl": "https://www.youtube.com/watch?v=PVSOJyG5WKU","videoTitle": "LOFI PRO Headphones - Yours Now (Launch trailer)","commentId": "UgyePLUng35WAT_FlAt4AaABAg","commentUrl": "https://www.youtube.com/watch?v=PVSOJyG5WKU&lc=UgyePLUng35WAT_FlAt4AaABAg","text": "Team eyes or no eyes ?","author": "@LofiGirl","authorChannelId": "UCSJ4gkVC6NrvII8umztf0Ow","authorIsVerified": true,"authorIsChannelOwner": true,"likeCount": 152,"replyCount": 27,"publishedTime": "2 days ago","isEdited": false,"isPinned": true,"isHearted": false,"scrapedAt": "2026-10-21T17:35:28.420Z"}
Pricing
You pay per result row plus a small fee per run start. Every record type (video, Short, stream, comment, channel, playlist) costs the same per row.
| Rate | 1,000 rows | |
|---|---|---|
| Until 2026-11-05 | $0.0037 per row, $0.005 per start | $3.70 |
| From 2026-11-05 | $0.00117 per row, $0.001 per start | $1.17 |
The start fee is charged once per run at the default 512 MB memory. A run of 200 videos with channel info therefore costs about $0.24 after 2026-11-05. Adding comments adds one row per comment: 20 comments for each of 50 videos is 1,000 comment rows, so $1.17.
Details and channel info do not cost extra rows. They cost run time (extra requests per video or channel), and a larger run takes longer but still bills only the rows you receive. Filters such as oldestPostDate, features and sorting are free.
Limits and notes
- No transcripts or captions. Subtitles, SRT and AI summaries are not part of this actor.
- Search results come from YouTube's current front end. Upload-date and rating sort orders no longer exist on YouTube, so only relevance and popularity are available for search ordering.
- Search filters (
uploadDate,duration,features,sortBy) apply to video, Shorts and movie search. They are not sent for channel and playlist search. - Shorts rows from channel tabs carry views and title; the date comes with details turned on (
includeVideoDetails). oldestPostDateis exact when details are on, otherwise it is accurate to the unit of YouTube's relative date ("3 weeks ago").- Comments: top-level only, like counts rounded by YouTube, about 20 comments per request page.
commentsTurnedOffis filled when details are on. - Not available anonymously: per-video monetization flag, age-restriction flag, video location, business email on the channel About page (sign-in is required for it).
- Large jobs: YouTube can rate-limit heavy traffic. The default residential proxy is what the cloud tests used. Failed targets are reported in the
OUTPUTrecord and the other targets continue. - Partial results are always kept. The
OUTPUTrecord in the key-value store lists, per target, how many rows were returned and any error.
FAQ
Do I need a YouTube API key? No. There is no key, no OAuth and no quota unit system.
Can it scrape a whole channel? Yes. Raise maxItems (and maxShorts / maxStreams with the matching channelTabs). The actor pages through the tab until it reaches the limit or the end.
Can I get only recent videos? Yes, set oldestPostDate to a date or something like 7 days.
How do I get the subscriber count? Leave includeChannelInfo on. Every row carries channelSubscriberCount (exact number from the About page) and channelSubscribersText.
Why is likeCount empty on some rows? Search and channel grids do not show likes. Turn on includeVideoDetails to get the exact like count.
Why is channelIsMonetized null? The old monetization flag is no longer in public pages. The actor only reports true when the channel offers memberships.
Is every earlier input still supported? Yes: searchQueries, channelUrls, videoUrls, fetchDetails, sortBy, uploadDate, duration and the legacy output fields work as before. The leader-style names maxResults, maxResultsShorts, maxResultStreams and sortVideosBy are accepted as aliases.
Integrations
- Apify API. Start a run and read the dataset from any language. Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("chimerical_quicklime/youtube-search-channel-video-scraper").call(run_input={"startUrls": ["@veritasium"],"maxItems": 20,"includeVideoDetails": True,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["title"], row["viewCount"], row["likeCount"])
- Schedules. Run hourly, daily or weekly from the Apify console. Combine with
onlyNew: trueto receive only what changed. - Webhooks. Call your endpoint when a run finishes, for alerts on new videos or comments.
- Make, Zapier, n8n. Use the Apify app or the HTTP API to send rows to Google Sheets, Slack, Airtable, a CRM or a database.
- AI agents and MCP. The actor can be called as a tool through the Apify MCP server, so an AI assistant can look up channels, videos and comments on demand.
Support
If a field is empty or a target fails, open an issue on the actor page with your input and run link.