YouTube Comments Scraper (replies, likes, top or newest)
Pricing
from $0.50 / 1,000 comment or replies
YouTube Comments Scraper (replies, likes, top or newest)
Scrape public YouTube comments and replies from any video or Short: text, likes, reply count, date, pinned and creator flags. Top or newest, date and likes filters, no API key. Pay per comment.
Pricing
from $0.50 / 1,000 comment or replies
Rating
0.0
(0)
Developer
ScrapeMole
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
a day ago
Last modified
Categories
Features
Share
YouTube Comments Scraper: comments, replies and likes, top or newest
Scrape public YouTube comments and replies from any video or Short. Every row has the comment text, like count, reply count, when it was posted, and pinned / hearted-by-creator / posted-by-creator flags, plus the video title, channel and total comment count. Sort by Top comments or Newest first, keep only comments newer than a date or with minimum likes, add replies if you want them, and export to JSON, CSV, Excel or Google Sheets, or call it from Python, n8n, Make, Zapier or an AI agent. No YouTube API key, no quota.
You only pay per comment delivered. Videos with comments turned off, private or deleted videos and invalid links come back as clear error rows and are never charged.
Privacy-first by design. The Actor returns what people say, not who they are: commenter names, @handles, channel IDs and avatars are never collected or returned, and e-mail addresses inside comment text are redacted. That keeps your sentiment, feedback and research datasets clear of personal data (GDPR-friendly), which is what most comment analysis needs anyway.
Why this comments scraper gets all the comments
- Reads the same JSON the YouTube website loads (no headless browser): 300 comments take about 7 seconds, 2,500 newest comments about 25 seconds.
- Goes past YouTube's "Top comments" ceiling. YouTube only lists about 1,000 comments under Top comments. Pick Newest first and the Actor pages through the full history. In our tests it pulled 2,500 of 2,500 requested on a video with millions of comments. When a Top run hits the ceiling, the log tells you.
- No duplicates, no blank rows. Comments are de-duplicated across pages, and a run never "succeeds" with zero rows silently: you get
NO_DATA("comments are turned off") orNOT_FOUNDinstead. - Retries with backoff and a fresh IP on rate limits, escalates to residential IPs only if YouTube keeps blocking, and gives rate-limited videos a slower second pass at the end.
- Finishes cleanly before the run timeout. Big jobs stop starting new work about a minute before the timeout, keep every comment already saved and end as SUCCEEDED (
stoppedNearTimeout: trueinRUN_SUMMARY) instead of TIMED-OUT. - Exact billing. One
commentevent per row in your dataset (comment or reply), charged only after the row is saved. Set Max cost per run and the Actor stops cleanly at your budget.
Live tests, 19 Oct 2026 (real YouTube, cloud server, no proxy): see Test results.
What you get
| Field | Description |
|---|---|
type | comment (top-level) or reply |
text | Comment text (e-mails redacted) |
likeCount, replyCount | Engagement numbers ("1.2K" converted to 1200) |
publishedText, publishedAtApprox, isEdited | "3 weeks ago", the approximate date (YYYY-MM-DD) and the edited flag |
isPinned, isHeartedByCreator, isByVideoCreator | Creator signals |
commentId, parentCommentId, commentUrl, position | IDs, a direct link that highlights the comment, and its order |
videoId, videoUrl, videoTitle, videoChannelName, totalCommentsOnVideo | Video context on every row |
How to scrape YouTube comments
- Paste one or more video links or IDs (watch links,
youtu.be, Shorts, live and embed URLs all work). - Set Max comments per video, pick Top or Newest first, and turn on Include replies if you need them.
- Click Start and download the comments as JSON, CSV or Excel, or read them through the API.
Input example
{"videos": ["https://www.youtube.com/watch?v=aircAruvnKk", "https://www.youtube.com/shorts/VIDEO_ID"],"maxComments": 500,"sortBy": "newest","includeReplies": true,"maxRepliesPerComment": 10}
Output example
{"status": "ok","type": "comment","videoId": "aircAruvnKk","videoUrl": "https://www.youtube.com/watch?v=aircAruvnKk","videoTitle": "But what is a neural network? | Deep learning chapter 1","videoChannelName": "3Blue1Brown","totalCommentsOnVideo": 9418,"sortBy": "top","position": 2,"parentCommentId": null,"commentUrl": "https://www.youtube.com/watch?v=aircAruvnKk&lc=Ugwedfi--9yZVC0eefl4AaABAg","commentId": "Ugwedfi--9yZVC0eefl4AaABAg","text": "I study mathematics, physics and architecture. By definition this man is an ORACLE in the strict meaning of the word...","publishedText": "7 years ago (edited)","publishedAtApprox": "2019-10-19","isEdited": true,"likeCount": 13000,"replyCount": 173,"isHeartedByCreator": false,"isByVideoCreator": false,"isPinned": false}
Videos with comments turned off
{ "status": "error", "videoId": "XXXXXXXXXXX", "errorCode": "NO_DATA", "errorMessage": "Comments are turned off or unavailable for this video." }
Not charged.
Switching from another YouTube comments Actor
Already calling another comments Actor from code, a schedule, n8n, Make or Zapier? Change the Actor ID to scrapemole/youtube-comments-scraper and keep your input JSON: the field names of the most-used comments Actors on the Store work here as-is.
| Coming from | Their input that works here unchanged |
|---|---|
| streamers/youtube-comments-scraper | startUrls, maxComments, sortCommentsBy (TOP_COMMENTS / NEWEST_FIRST), oldestCommentDate |
| apidojo/youtube-comments-scraper | startUrls (plain URL list), sort (top / latest), maxItems (cap for the whole run), includeReplies |
| supreme_coder/youtube-comment-scraper | urls, count |
| solidcode/youtube-comments-scraper | startUrls, sortBy (top / latest), maxResults, includeReplies, maxRepliesPerComment, language |
| api-ninja/youtube-comments-scraper | videoUrls, commentsPerVideo, scrapeAllComments, orderBy, geo, lang |
| lergassy/youtube-comments-scraper | videoUrls, maxCommentsPerVideo, sort, includeReplies, maxRepliesPerComment, commentsSince, minLikes |
Example: this streamers-style input runs here without edits.
{"startUrls": [{ "url": "https://www.youtube.com/watch?v=aircAruvnKk" }],"maxComments": 200,"sortCommentsBy": "NEWEST_FIRST","oldestCommentDate": "2026-01-01"}
Options that only exist in other Actors (custom map functions, output connectors, video detail add-ons) are ignored, not rejected. Channel, playlist or search inputs get a clear pointer: list the videos first with YouTube Scraper, then pass their URLs here.
What you gain by switching: Newest-first paging goes past YouTube's ~1,000-comment cap on the Top list, error rows (comments off, private, deleted) are free, there is no start fee, and on the Free plan it costs $1.00 per 1,000 comments, half the Free-plan price of streamers/youtube-comments-scraper ($2.00 per 1,000, checked 12 Nov 2026).
Pricing
Pay per comment (replies count as comments). Proxy and platform costs are included, with no start fee.
| Apify plan | Price per comment | 1,000 comments |
|---|---|---|
| Free | $0.001 | $1.00 |
| Starter (Bronze) | $0.0008 | $0.80 |
| Scale (Silver) | $0.0006 | $0.60 |
| Business (Gold) | $0.0005 | $0.50 |
Use cases
- Sentiment and audience research: what viewers love, hate and ask about a product, launch, trailer or creator.
- Product feedback mining: feature requests and complaints under review and tutorial videos.
- Content ideas and FAQs: the questions your audience keeps asking.
- AI and LLM pipelines: clean, identity-free comment text for classification, topic modelling, RAG or fine-tuning.
- Brand and campaign monitoring: track reactions on your own and competitors' videos over time (schedule the Actor with Newest first).
API, Python and AI agents
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("scrapemole/youtube-comments-scraper").call(run_input={"videos": ["https://www.youtube.com/watch?v=aircAruvnKk"], "maxComments": 200, "sortBy": "newest"})for c in client.dataset(run["defaultDatasetId"]).iterate_items():print(c.get("likeCount"), c.get("text", c.get("errorMessage"))[:120])
Works with n8n, Make, Zapier, LangChain, LlamaIndex and the Apify MCP server, so Claude, ChatGPT or Cursor agents can pull comments on their own.
Test results
Live tests on 2026-10-19 against real YouTube from a cloud server with no proxy: 8 runs over 11 videos (lectures, music videos, tutorials, news, the first YouTube video), Top and Newest, with and without replies.
| Metric | Result |
|---|---|
| Runs finished OK | 8/8 |
| Comments delivered | 2,250 top-level + 343 replies |
| Duplicate rows | 0 |
| Rows with commenter identity fields | 0 |
| Billing | Charged exactly once per row delivered (2,593 events) |
| Newest-first deep paging | 2,500/2,500 comments on a video with millions of comments |
| Edge cases | not-found and invalid links (not charged), empty input, budget cap stops at exactly 7 of 100: all pass |
| Blocks | 0 |
FAQ
Why do I get about 1,000 comments with "Top comments"? That's a YouTube limit: the Top list stops around 1,000. Choose Newest first to get everything.
Can I get commenter names or channel IDs? No, on purpose. This Actor is built for analysing what is said without collecting personal data. If you need to know who commented, this isn't the right tool.
Are replies included? Only if you turn on Include replies. Each reply is one row with type: "reply" and the parentCommentId.
Does it work for Shorts and live streams? Yes for Shorts and finished streams with comments. Live chat isn't comments, so it isn't included.
Age-restricted or members-only videos? YouTube requires sign-in for these. The Actor doesn't log in, so they return a clear error and aren't charged.
Is it legal? The Actor only reads publicly visible comments and doesn't collect commenter identities. Respect YouTube's terms and applicable law when you reuse the data.
Can I get only recent comments? Yes. Set Only comments newer than to a date (2026-01-31) or a relative time (7 days). With Newest first the Actor stops paging as soon as it reaches older comments, so it is fast and cheap. YouTube shows dates as "2 weeks ago", so the cut-off is approximate. Skipped comments are not charged.
What happens if my run hits its timeout? The Actor stops about a minute early and finishes SUCCEEDED with everything it has saved. Raise the run timeout or lower Max comments per video to get more.
Found a problem? Open an issue with the run link. Each run stores a RUN_SUMMARY (requests, retries, errors) to help debug it.
More from ScrapeMole
ScrapeMole builds focused, reliable scrapers for public data: pay per result, no start fees, clear error rows that are never charged, and a RUN_SUMMARY on every run.
- YouTube Transcript & Subtitles Scraper
- Google Trends Scraper
- YouTube Scraper
- Telegram Channel Scraper
- Amazon Product & Search Scraper
- Google Jobs Scraper
- YouTube Shorts Scraper
- YouTube Channel Scraper
- ATS Jobs & Hiring-Intent Scraper: Greenhouse, Lever, Ashby
Tutorials for this Actor
Building an AI agent with its own wallet? The YouTube and Google Trends data is also sold per call over x402 (USDC on Base, no account): see scrapemole.pages.dev or all ScrapeMole scrapers. Questions or a missing field? Open an issue on this Actor. ScrapeMole is the maker of this Actor.