YouTube Comments Scraper: Comments, Replies, Authors
Pricing
from $0.28 / 1,000 comment or replies
YouTube Comments Scraper: Comments, Replies, Authors
YouTube comments scraper: every comment and reply of a video by URL or ID, newest or top, with author, likes, reply count, pinned and hearted flags and an optional keyword filter. $0.40 per 1,000 comments. No login, no API key.
Pricing
from $0.28 / 1,000 comment or replies
Rating
0.0
(0)
Developer
Data Gleaner
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
A YouTube comments scraper and comment extractor. Give it video links or IDs and get every comment and reply as flat JSON: text, author, channel link, likes, reply count, age, and whether the comment is pinned or hearted by the channel. Sort by top or newest, cap the number per video, and keep only comments that contain your keywords. $0.0004 per comment ($0.40 per 1,000), and comments your filter drops are never billed. Plain HTTP: no browser, no login, no YouTube API key and no daily quota.
The rows have the same fields every time, so people, spreadsheets, sentiment tools and AI agents can all use them directly. Author channel IDs are included, so the same table can feed a channel-contacts lookup.
What does the YouTube Comments Scraper do?
For each video you give it, the Actor reads the public comment section, the same data a logged-out visitor sees under the video. It pages through the comments in the order you pick until it has the number you asked for, or until the video runs out.
- Comments:
commentId,text,authorName,authorHandle,authorChannelId,authorChannelUrl,likeCount,replyCount,publishedText,publishedAt(an estimate, see below),isEdited,commentUrl. - Flags:
isPinned(pinned by the channel),isHearted(hearted by the channel),isChannelOwner(written by the video's own channel),authorVerified. - Replies: switch on
includeRepliesand each reply comes back as its own row withisReply: trueandparentIdpointing at the comment it answers. - Video context on every row:
videoId,videoUrl,videoTitle,videoCommentCount, and theinputUrlyou supplied. - Keyword filter:
keywordskeeps only comments whose text contains one of your words or phrases. Matching rows carrymatchedKeywords. The rest are not returned and not billed. - Date filter:
commentsSinceleaves out older comments. With newest-first order the Actor stops reading a video as soon as a page is older than your date.
It does not return video files, captions or transcripts, and it does not post, like or reply to anything. For the transcript of a video, see Related Actors below.
Use cases
- Sentiment and audience research: pull the comments of your own or a competitor's videos and feed them to a sentiment model or a spreadsheet.
- Product and brand feedback: filter by product names, "refund", "broken" or "price" to find what viewers complain about or ask for.
- Content ideas: read what viewers ask for in the replies and the most-liked comments of a niche's biggest videos.
- Giveaways and community checks: list every commenter of a video with their channel link.
- Moderation and monitoring: schedule a run with
sortBy: newestand comparecommentIdwith the last run to catch new comments. - Datasets for AI and analytics: thousands of comments per video without managing API quota.
- Outreach research:
authorChannelIdandauthorChannelUrlgive you the commenter's public channel, which you can pass on to a contact finder.
Input
| Field | Meaning |
|---|---|
videoUrls | Video links: watch?v=, youtu.be, Shorts or live URLs. 11-character video IDs also work. |
videoIds | 11-character video IDs. |
datasetId | Optional. A dataset from another run (for example the YouTube Search Scraper); the video is read from videoId, videoUrl, url, link or inputUrl of each item. Items that are not videos are skipped. |
maxDatasetItems | How many items to read from the dataset. Default 100. |
maxCommentsPerVideo | Rows per video, replies included. Default 100, up to 50,000. |
sortBy | top (default: pinned and most liked first) or newest. YouTube's own Sort comments menu. |
includeReplies | Also return replies. Default false. |
maxRepliesPerComment | Replies read under one comment. Default 20. |
keywords | Keep only comments that contain at least one of these (not case sensitive). |
commentsSince | Keep only comments newer than YYYY-MM-DD (approximate, see below). |
maxCommentsScanned | With a filter: how many comments to read per video while looking for matches. Default 5,000. |
country, language | What YouTube is asked for. Dates are only estimated for English. |
maxConcurrency, requestDelaySecs | Politeness controls. Defaults of 4 requests at a time and 0.25 s spacing are enough for most runs. |
proxyConfiguration | Optional. Works without a proxy. |
Example: the newest 200 comments and replies under two videos that mention price or refund.
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://youtu.be/jNQXAC9IVRw"],"sortBy": "newest","maxCommentsPerVideo": 200,"includeReplies": true,"keywords": ["price", "refund"],"maxCommentsScanned": 5000}
An empty input runs a built-in example (5 top comments of one video) so you can see the output format for a fraction of a cent. Any input that names a video runs only what you asked for.
Use it after another Actor
Give datasetId the dataset of a YouTube Search Scraper or YouTube Channel Scraper run and the Actor reads the comments of every video in it. To chain it automatically, open the source Actor's Integrations tab, add this Actor and set its input to:
{"datasetId": "{{resource.defaultDatasetId}}", "maxCommentsPerVideo": 100}
Output
Top-level comment:
{"commentId": "UgzuC3zzpRZkjc5Qzsd4AaABAg","videoId": "jNQXAC9IVRw","commentUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw&lc=UgzuC3zzpRZkjc5Qzsd4AaABAg","text": "We're so honored that the first ever YouTube video was filmed at the San Diego Zoo!","authorName": "@SanDiegoZoo","authorHandle": "@SanDiegoZoo","authorChannelId": "UCh...","authorChannelUrl": "https://www.youtube.com/channel/UCh...","authorAvatarUrl": "https://yt3.ggpht.com/...","authorVerified": false,"isChannelOwner": false,"likeCount": 4800000,"replyCount": 986,"publishedText": "6 years ago","publishedAt": "2020-10-22","publishedApprox": true,"isEdited": false,"isReply": false,"parentId": null,"isPinned": true,"isHearted": true,"inputUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw","videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw","videoTitle": "Me at the zoo","videoCommentCount": 10000000,"sortBy": "top","scrapedAt": "2026-10-21T09:12:44Z"}
A reply has isReply: true, a commentId of the form <parent>.<reply>, and parentId set to the comment it answers. With keywords, a row also has matchedKeywords.
How exact are the numbers and dates?
YouTube shows comment ages rounded (6 years ago, 3 hours ago) and likes and reply counts rounded above 1,000 (4.8M, 105K). The Actor returns what YouTube shows: publishedText is the age text, publishedAt is a date worked out from it and always flagged publishedApprox: true, and likeCount is the rounded public number as an integer. commentsSince uses that estimate, so a cut at an exact date is only as precise as the age YouTube shows.
Pricing
Pay per event, and nothing else:
| Event | Price | Per 1,000 |
|---|---|---|
| Comment or reply row | $0.0004 | $0.40 |
There is no start fee and no extra charge for compute or proxies. You pay for rows pushed to the dataset. A video that is private, removed, region-locked or has comments turned off costs nothing. Comments dropped by keywords or commentsSince cost nothing. The run stops at your maximum charge.
Worked examples:
- 1,000 comments of one video: 1,000 x $0.0004 = $0.40. The largest comment scraper on the Apify Store charged $0.0015 per comment when we checked on 2026-10-21, which is $1.50 for the same rows.
- 50 videos, top 100 comments each: 5,000 x $0.0004 = $2.00.
- A weekly brand check of 20 videos, newest 50 comments, keyword filter on: only the matching rows are billed, at most 1,000 x $0.0004 = $0.40.
- 3 videos with 1,000 rows each, replies included: 3,000 x $0.0004 = $1.20.
- The default test (prefill: one video, 20 comments) costs about $0.008.
Use it from the API
curl -X POST "https://api.apify.com/v2/acts/datagleaner~youtube-comments-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "maxCommentsPerVideo": 50, "sortBy": "newest"}'
Use with Python
pip install apify-client, set APIFY_TOKEN, run. This input returns 50 comments for $0.02.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("datagleaner/youtube-comments-scraper").call(run_input={"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"maxCommentsPerVideo": 50,"sortBy": "newest",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["likeCount"], item["authorName"], item["text"][:80])
Use with JavaScript / Node.js
npm install apify-client, set APIFY_TOKEN, run as an ES module.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('datagleaner/youtube-comments-scraper').call({videoIds: ['jNQXAC9IVRw'],maxCommentsPerVideo: 50,includeReplies: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const row of items) console.log(row.isReply ? ' reply:' : 'comment:', row.text);
Use it from n8n, Make, Zapier or an AI agent
Actor ID: datagleaner/youtube-comments-scraper
Minimal input:
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "maxCommentsPerVideo": 100}
-
n8n: add the Apify node (
@apify/n8n-nodes-apify), choose Run an Actor and get dataset, set Actor todatagleaner/youtube-comments-scraperand paste the input. -
Make: the Apify app's Run an Actor module, then Get Dataset Items. Watch Actor Runs can trigger a scenario when a run finishes.
-
Zapier: the Apify action Run Actor, then Fetch dataset items.
-
AI agents (MCP): connect to
https://mcp.apify.com?tools=datagleaner/youtube-comments-scraper. In Claude Code:claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/youtube-comments-scraper"Then ask in plain language, for example: "Get the newest 200 comments of this video and summarise what people are asking for." An agent without the Actor preloaded can find it with Apify's
search-actorstool by searching "youtube comments".
Limits
- Dates are estimates. YouTube shows only a rounded age for a comment, so
publishedAtis approximate andcommentsSinceis too. Estimates are only made for English (language: "en"). - Likes and reply counts are rounded by YouTube above 1,000.
- Replies count toward
maxCommentsPerVideo. 100 with replies on is 100 rows in total, comments and replies together, so the cost of a run is easy to predict. - Very large videos. In our tests YouTube's
toplist ended after about 1,200 comments on videos with millions of them, whilenewestkept going past 3,000. For a deep read of a huge video usesortBy: "newest". You get what the page lists. - Videos with comments turned off, private, removed, age-restricted or region-locked videos return nothing and are not billed. The status message counts them.
- Some comments come back with an empty
textwhen YouTube sends no text for them. - Only public content. No login is used, so held-for-review comments and anything behind a sign-in are not returned. There are no video files, captions or transcripts.
- Rate limits. The Actor keeps to 4 requests at a time with a short pause, and backs off when YouTube answers 429. If a very large run is slowed down, turn on
proxyConfigurationor lowermaxConcurrency. - YouTube changes its pages now and then. If a field starts coming back empty, report it and it will be fixed.
FAQ
Do I need a YouTube API key or quota? No. The Actor reads the public pages a logged-out visitor sees, so there is no key and no daily quota.
How do I get all comments of a video? Set maxCommentsPerVideo high (up to 50,000). The Actor pages through the comments until it runs out. On videos with millions of comments, YouTube's top list ends after about 1,200; newest goes much deeper.
How do I get the replies? Set includeReplies to true. Each reply is a separate row with parentId.
How do I get only the latest comments? sortBy: "newest". Add commentsSince to stop at a date.
How do I find comments about one topic? Put the words in keywords. Only matching comments are returned, and only those are billed. Raise maxCommentsScanned if the word is rare.
Can I scrape the comments of many videos from a search? Yes. Run the YouTube Search Scraper, then give this Actor its dataset ID in datasetId, or chain them from the Integrations tab.
Can I export to CSV, Excel or JSON? Yes, from the dataset of the run, in the Apify Console or by API.
Can I get commenters' emails? Not from this Actor, and comments carry none. authorChannelId points at the commenter's public channel; the YouTube channel email Actor listed below reads published emails from channels.
Do I need a proxy? No. It works without one on Apify. The option is there for very large runs.
Related Actors
- YouTube Search Scraper: find the videos first by keyword, with date, length and sort filters, then pass its dataset to this Actor.
- YouTube Shorts & Channel Scraper: every video and Short of a channel with views and dates, plus the channel About row. Take the
videoIdvalues for this Actor from its dataset. - YouTube Channel Email Scraper: published emails, websites and socials for channels. Run it on the
authorChannelUrlvalues of the commenters you care about. - YouTube Transcript Scraper: the transcript of any video, to read the video and its comments together.
Responsible use
This Actor reads public YouTube pages without logging in or bypassing any sign-in, and it paces its requests. Use the data in line with YouTube's terms and applicable law. Comments contain names, handles and opinions of real people: if you store them or combine them with other data about individuals, the data-protection obligations are yours.