Home › Guides › YouTube Comments Scraper
YouTube comments: every thread with replies, likes and a new-comment monitor
The YouTube Comments Scraper returns one row per comment or reply — for the videos you name, or for a channel's latest uploads — with replies, likes, pins, creator hearts, each author's channel and the video's exact comment count. "Newest first" lists every comment (YouTube's "Top comments" is a selection — 19% to 99% of them for five videos we checked); schedule it in monitoring mode and each run brings only what was written since, with a burst too large for one run carried over to the next rather than skipped. No YouTube API key, no login, no cookies.
Who it's for
- Community and brand teams watching what is written under their own or a competitor's videos, without re-reading everything each time.
- Audience researchers mining the full comment set of a topic for questions, praise and complaints.
- Product and launch teams pulling only the comments that mention a price, a feature or a problem.
- Analysts and AI builders who need comments with their thread structure — each reply keyed to its parent — as a dataset.
What you get
| Group | Fields |
|---|---|
| Comment | Comment ID (stable key) & link, text, thread position, parent comment ID (on replies), edited flag |
| Engagement | Likes (with a rounded flag), reply count, pinned flag, creator-heart flag |
| Age | publishedText ("3 weeks ago"), ageDaysMin/ageDaysMax range, and an exact date only for comments under a day old |
| Author | Name, @handle, channel ID & URL, verified flag, is-creator flag |
| Video context | Video ID, URL, title, channel, @handle, and the video's exact comment count — on every row |
A real comment row from a run on 2026-10-07 (every column, nothing shortened):
{
"type": "comment",
"videoId": "jjgJhYZXX1U",
"videoTitle": "SkyRover X1 Drone Review",
"videoChannelHandle": "@colibrifpv",
"videoCommentsCount": 87,
"commentId": "Ugyb2xCw4FPXOuTVLxV4AaABAg",
"parentCommentId": null,
"threadPosition": 34,
"text": "Wow, awesomely stunning footage and scenery. Those waterfalls... Truly amazing!!!",
"publishedText": "7 months ago",
"publishedDate": null,
"ageDaysMin": 208,
"ageDaysMax": 247,
"isEdited": true,
"likes": 1,
"likesAreRounded": false,
"replyCount": 1,
"isPinned": false,
"isHearted": true,
"authorHandle": "@MaxDelEcuador",
"authorIsCreator": false
}
How the monitor carries a burst over
Tick onlyNewComments, name the list and schedule the run. Newest first and without filters, the list follows each video: the first run reads a video's first maxCommentsPerVideo comments and delivers them oldest first; every later run reads from the newest comment down to where the delivered ones begin and delivers what is new, oldest first. When more comments are due than a run can deliver, the rest stay above the delivered ones where the next run finds them — the status message says how many wait. In a measured test on a video getting three to four comments a minute, a run nine minutes after the first found 35 new comments, delivered the 30 oldest and said 5 were waiting; the next runs delivered those 5, then 2, then 3 — 70 comments across the runs, none twice and none missing.
With a filter or in "top" order each run looks at a window — the video's first maxCommentsPerVideo comments — and delivers what the list has not; a comment that passes the filter now and did not before is delivered now. Pick a window well above what a video gets between runs, or follow without filters and filter the rows afterwards.
Replies (maxRepliesPerComment above 0) come right after their comment, oldest first — the only order YouTube gives them in — each with the ID of the comment it answers. A thread that showed 782 replies delivered 782.
Input
| Input | What it does |
|---|---|
videos | Video URLs or IDs, one per line: watch?v=…, youtu.be/…, /shorts/…, /live/… or the 11-character ID |
channels · maxVideosPerChannel · videoTypes | Channels to read the latest uploads of · how many per channel and kind (default 5) · videos / shorts / live |
maxCommentsPerVideo · maxComments | Rows per video, comments and replies together (default 100) · total rows (default 1,000) |
sort | newest (default — every comment) or top (YouTube's own selection) |
maxRepliesPerComment | Replies per comment, oldest first (default 0 — no replies) |
publishedWithinDays · minLikes · textContains | Only recent comments · above a like count · containing any of these words or phrases |
onlyNewComments · listName | Deliver only what the list has not delivered before — monitoring on a schedule |
Every comment of a video with every reply:
{ "videos": ["https://www.youtube.com/watch?v=rN4hGxTE2hg"], "maxCommentsPerVideo": 5000, "maxComments": 5000, "maxRepliesPerComment": 100 }
Watch a channel's comments — schedule it, each run brings only what is new:
{ "channels": ["@mkbhd"], "maxVideosPerChannel": 5, "maxCommentsPerVideo": 100, "onlyNewComments": true, "listName": "mkbhd-comments" }
Measured data quality
Share of rows with a value, measured on the Apify platform on 2026-10-07:
| Field | 1,000 newest | 10 videos, 945 rows | One video to its end (8,047) | With every reply (328) |
|---|---|---|---|---|
| Text | 1,000/1,000 | 945/945 | 8,047/8,047 | 328/328 |
| Author's channel ID | 1,000/1,000 | 945/945 | 8,047/8,047 | 328/328 |
| Like count | 1,000/1,000 | 945/945 | 8,047/8,047 | 328/328 |
| Age in days | 1,000/1,000 | 945/945 | 8,047/8,047 | 328/328 |
| Unique comment IDs | 1,000/1,000 | 945/945 | 8,047/8,047 | 328/328 |
Followed to its end, the 8,047 comments carried 1,501 replies between them — together the 9,548 YouTube shows for the video. The largest list we followed, 119,554 comments, came back 6 short (one comment twice) over 99 minutes while the video kept getting comments. A comment nobody liked reads likes: 0 (7,091 of 8,047), never an empty field.
Honest limits
- No exact dates for comments older than a day — YouTube shows only "3 weeks ago". The row carries that text and the day range it can mean; a date is given only for comments under a day old (and not for the ~1 in 24 whose hour holds midnight UTC).
- "Top comments" is a YouTube selection, not all comments — a fraction for large videos. Use
sort: "newest"for the complete list; the run tells you when a list ended short of YouTube's count. - Like counts from 1,000 on are rounded by YouTube ("1.2K"), flagged by
likesAreRounded. Replies come oldest first only and are one level deep. - No members-only, private or age-restricted comments, no Community-post comments, no live-chat messages — YouTube does not show them to a visitor. A video with comments off gets a status row that says so.
- A very large comment section may not fit one run — a video is paged one request after another (~100–150 comments a second at best), so several hundred thousand comments exceed the default one-hour timeout.
Speed
On the platform with the default 1 GB (2026-10-07): the prefilled 100-comment input took 2 to 5 seconds (10–15 when YouTube refused the run first and it switched to Apify Proxy); 1,000 newest comments 8 to 12 seconds; 945 comments of ten videos read side by side 4 to 5 seconds; a video's 8,047 comments to the end 55 to 76 seconds; 328 rows with every reply 7 seconds. Monitoring a busy video cost 5 to 11 requests a run. A run the platform restarts continues from the rows it already delivered, and an "only new" run reads back a killed run's rows so nothing is delivered twice.
Pricing
Pay per result: $0.0004 per delivered comment or reply, plus Apify's run-start event. Status rows, comments that were read but did not pass your filters, and comments an "only new" list had delivered before are all free. In an "only new" run what a spending limit leaves undelivered comes with the next run. Current prices are on the actor's Pricing tab on Apify.
Read the room under any video: every comment with its replies, likes, pins and author — or a monitor that delivers only what is new each run. Exportable to JSON, CSV or Excel.
Open the YouTube Comments Scraper →Related
This Actor reads the comments; to find the videos by keyword first use the YouTube Search Scraper, to list a channel's uploads with exact stats use the YouTube Channel Videos Scraper and pass the URLs here, and to map the creators in a niche use the YouTube Channel Finder.
Frequently asked questions
Do I get all comments of a video?
With sort: "newest" (the default) and high enough limits, yes: for every video we followed to its end the comments and replies added up to the number YouTube shows — exactly for the smaller ones, within one for a video of 10,251 and within 6 for one of 119,554. "Top comments" is a YouTube selection and only a fraction of a large video.
Why is there no date on a comment?
YouTube shows only "3 weeks ago", not a date. The row carries that text and the range of days it can mean (ageDaysMin, ageDaysMax); an exact date is given only for comments less than a day old. Run daily with onlyNewComments and most arrive while YouTube still shows the age in hours.
What happens when a video gets more new comments than maxCommentsPerVideo between two runs?
Newest first and without filters, the run delivers the oldest of them and its status message says how many are waiting; the following runs deliver the rest, oldest first. Nothing is skipped and nothing has to be re-read by hand. With a filter or in "top" order nothing is carried over.
Are replies included?
When you set maxRepliesPerComment. Each comment is followed by up to that many of its replies, oldest first — the only order YouTube gives them in — each carrying the ID of the comment it answers. Replies count toward maxCommentsPerVideo.
Does it need a proxy or an API key?
No API key, and nothing to set up. Requests go out directly; when YouTube refuses a run's comment requests the Actor sends them through Apify Proxy by itself. On an account that cannot use Apify Proxy, a video YouTube refuses ends as "YouTube did not answer".
YouTube Comments Scraper — every thread, replies and likes, or a new-comment monitor. Pay per row, no API key.
Get YouTube comments on Apify →