YouTube Comments Scraper — Replies, Likes, Authors, Dates avatar

YouTube Comments Scraper — Replies, Likes, Authors, Dates

Pricing

$0.25 / 1,000 per comment returneds

Go to Apify Store
YouTube Comments Scraper — Replies, Likes, Authors, Dates

YouTube Comments Scraper — Replies, Likes, Authors, Dates

Scrape every comment on any YouTube video: full text, author handle + channel ID, numeric like and reply counts, pinned / hearted-by-creator flags, approximate date and the comment permalink. Threaded replies included. Sort by top or newest. No API key, no quota, no login.

Pricing

$0.25 / 1,000 per comment returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

💬 YouTube Comments Scraper

Export every comment on any YouTube video — text, author, likes, replies, dates — as CSV, JSON or Excel. No API key, no quota, no login.

The official YouTube Data API gives you 10,000 quota units a day, which is about 100 videos' worth of comments before it shuts you off for 24 hours. This Actor doesn't use it. It reads the same public data the video page itself loads, so there is no quota, no OAuth screen and no Google Cloud project to set up.

You paste video URLs. You get a clean, flat table — one row per comment, one row per reply, with the video's own context (title, channel, view count, total comment count) carried on every row so a spreadsheet is instantly pivotable.


⚡ What does YouTube Comments Scraper do?

  • 💬 Every comment, paged as deep as you want — 20 per request, no ceiling from YouTube's side
  • 🧵 Threaded replies as their own rows, linked to their parent by parentCommentId
  • 👤 Real author identity@handle, channel ID and a working channel URL, avatar, verified badge
  • ❤️ Engagement that's actually a numberlikeCount: 310000, not the string "310K"
  • 📌 Pinned + hearted-by-creator flags — the two signals that tell you what the channel owner endorsed
  • 🔗 A permalink per comment (…&lc=<commentId>) that opens that exact comment in a browser
  • 🗓️ publishedAtApprox — YouTube's relative age resolved to an ISO timestamp you can sort and filter
  • 🔀 Top or Newest ordering, using YouTube's own sort tokens — and position preserves that ranking
  • ⏱️ newerThanDays — stop paging the moment the feed goes stale (the cheap way to monitor a video)
  • 🎬 Accepts watch URLs, youtu.be links, /shorts/, /live/ and bare video IDs

📊 Output — 39 fields per row

Measured on 50 real records (two comment pages + one reply page from dQw4w9WgXcQ, captured 2026‑09‑02). The fill percentages below are counted, not estimated. The five conditional fields (replyCountText, pinnedByText, parentCommentId, and the three video fields at 44%) are conditional by definition — a reply has no reply count, an unpinned comment has no pin label — so their share moves with what you ask for. Everything marked 100% was 100% here and again on the 150-row platform run below.

FieldFillWhat it is
commentId100%YouTube's own comment ID
commentUrl100%Permalink that opens this comment on the video
text100%The full comment body
publishedTimeText100%YouTube's own wording — "3 days ago", "6 years ago (edited)"
publishedAtApprox100%That age resolved to an ISO timestamp (see the caveat below)
isEdited100%True when YouTube marks the comment (edited)
likeCount100%Numeric. "310K"310000
likeCountText100%YouTube's abbreviated original, kept for auditing
replyCount100%Numeric reply count on the thread
replyCountText74%Original text; absent on replies and on threads with zero replies
isPinned100%Pinned by the channel
pinnedByText2%"Pinned by @RickAstleyYT" — only on the pinned comment
isHeartedByCreator100%The creator's ❤ on the comment
isReply / replyLevel100%Top-level (0) vs reply (1)
parentCommentId20%Set on reply rows — joins a reply back to its parent
authorName100%@handle
authorChannelId / authorChannelUrl100%The commenter's channel, and a URL that opens it
authorAvatarUrl100%Profile image
authorIsVerified / authorIsChannelOwner / authorIsArtist100%Badges
position100%1..n in the order YouTube served them, so sortBy: top stays ranked
videoId / videoUrl100%The source video
videoTitle / videoChannelName / videoChannelId / videoChannelUrl100%Video + uploader context on every row
videoViewCount / videoPublishedAt100%Numeric views, ISO publish date
videoLengthSeconds / videoCategory / videoIsLive44%Present unless YouTube serves the stripped watch page (see Limits)
videoTotalComments / videoTotalCommentsText100%The video's whole comment count, e.g. 2456556
sortedBy / scrapedAt100%Which ordering produced the row, and when

Sample row

{
"commentId": "UgwxEqSh_78DU_MOKpt4AaABAg",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=UgwxEqSh_78DU_MOKpt4AaABAg",
"text": "Never thought the video was taken down, not even for a second. I just wanted to hear my boy Rick Astley again.",
"publishedTimeText": "1 month ago",
"publishedAtApprox": "2026-08-02T17:47:56.261Z",
"isEdited": false,
"likeCount": 6700,
"likeCountText": "6.7K",
"replyCount": 46,
"isPinned": false,
"isHeartedByCreator": false,
"isReply": false,
"replyLevel": 0,
"parentCommentId": null,
"authorName": "@Hushoo",
"authorChannelId": "UCTfgDEMJhUnGz24yinDMenQ",
"authorChannelUrl": "https://www.youtube.com/channel/UCTfgDEMJhUnGz24yinDMenQ",
"authorIsVerified": false,
"position": 2,
"videoId": "dQw4w9WgXcQ",
"videoTitle": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"videoChannelName": "Rick Astley",
"videoViewCount": 1810785988,
"videoTotalComments": 2456556,
"sortedBy": "top",
"scrapedAt": "2026-09-02T04:17:56.261Z"
}

💵 Pricing

$0.00025 per comment — pay-per-event, one event, nothing else. No monthly rental, no charge for starting a run, no separate fee for replies.

You scrapeYou pay
100 comments$0.025
1,000 comments$0.25
10,000 comments$2.50
100,000 comments$25.00

Billing is budget-aware: rows are delivered and charged in the same atomic call, so if you set a spend cap the run stops at it. You are never billed for a row you didn't receive, and you never receive rows you weren't billed for.

Two caps keep a run inside the budget you meant: maxComments (per video) and maxItems (whole run). Both are on by default — 100 and 1,000.


🚀 How to use it

  1. Paste one or more video URLs into 📺 YouTube videos.
  2. Pick Top (YouTube's ranking) or Newest (chronological).
  3. Set Max comments per video and, if you want the threads, switch on Include threaded replies.
  4. Run. Export as CSV, JSON, Excel, or pull it from the API.

Input example

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/9bZkp7q19f0"
],
"sortBy": "newest",
"includeReplies": true,
"maxRepliesPerComment": 3,
"maxComments": 25,
"maxItems": 45
}

Monitoring a video for new comments? Use sortBy: "newest" with newerThanDays: 7 — the run stops paging the moment the feed goes older than a week, so a daily check costs almost nothing.


🧪 What has actually been verified

Everything below was measured on 2026‑09‑02, not assumed.

  • The data path — watch page → InnerTube /next → continuation. All three hops returned HTTP 200 on the first try, from a home IP (1,390,091 / 513,200 / 264,297 bytes) and through an Apify datacenter proxy (1,303,721 / 431,832 / 263,605 bytes). Residential proxies are not required.
  • Pagination — page 1 and page 2 each returned 20 comments with 0 overlapping comment IDs.
  • Replies — a reply thread returned 10 replies, all with replyLevel: 1 and all linked to the right parent.
  • The parser76 assertions run offline against the captured bytes: field values, counts, ordering, ID uniqueness, like-count conversion, date resolution, URL parsing. All pass.
  • On the Apify platform, not just locally — a 3-video run with replies on returned 150 rows in 15.9 seconds, 3 of 3 videos, 150 unique comment IDs, 39 fields on every row, exit code 0.
  • Billing integrity — a 200-row run reported chargedEventCounts: {"comment-scraped": 200} against a dataset holding exactly 200 items. Delivered equals billed, to the row.
  • Caps are exact — a run capped at 25 per video and 45 for the whole run returned exactly 25, 20 and 45. Peak memory on a 200-row run was 73 MB against the 1 GB the Actor asks for.

⚠️ Honest limits

  • There is no exact comment timestamp on YouTube. Anywhere. YouTube publishes only a relative age ("3 days ago"). publishedTimeText is that string verbatim; publishedAtApprox is it resolved against the scrape time, so it is precise to YouTube's own granularity — hours, days, weeks, months, years — and no better. It is called Approx on purpose. Any scraper claiming an exact posting time for a YouTube comment is computing the same estimate and not telling you.
  • Like counts are abbreviated at the source. YouTube renders "310K", so likeCount: 310000 is exact to three significant figures, not to the unit. likeCountText keeps the original so you can see what was rounded.
  • Some videos serve a stripped watch page. When YouTube decides an exit IP needs a sign-in to play a video (playabilityStatus: LOGIN_REQUIRED), it removes the player metadata block. The comments still come back in full — this was measured returning 25 comments under exactly that status — and title, channel, views and publish date are recovered from the page's other data block. videoLengthSeconds, videoCategory and videoIsLive only live in the removed block, so those three come back null for those videos. They are the 44% column in the table above.
  • Comments turned off is reported as a per-video note in the run status, never as an empty result. Same for a members-only or age-gated video.
  • A refused exit IP is never reported as "no comments." Refused requests are counted by status code and named in the run's status message. If YouTube starts refusing your IPs on a very large job, lower Videos in parallel or switch the proxy to residential.
  • Sorting by Newest includes spam. That is YouTube's own warning on the sort menu, not ours — newest is unfiltered chronological order, top is YouTube's curated ranking.

❓ FAQ

Do I need a YouTube API key or a Google account? No. No key, no OAuth, no Google Cloud project. This reads the same public data your browser loads on the video page.

How is this different from the official YouTube Data API? The official API costs quota — 10,000 units/day, roughly 100 videos of comments, then you wait 24 hours. This has no quota and no daily reset. It also returns fields the API doesn't expose in one call, such as the creator's ❤, the pinned flag, and the author's channel URL.

Can I get replies, not just top-level comments? Yes — switch on Include threaded replies. Each reply is its own row with isReply: true, replyLevel: 1 and parentCommentId pointing at the comment it answers. Cap them per thread with Max replies per comment.

Can I scrape many videos in one run? Yes. Paste as many as you like; they're worked on in parallel (default 3 at a time). maxItems caps the whole run so a long list can't surprise your bill.

Does it work on YouTube Shorts? Yes. /shorts/ URLs are accepted, and Shorts comments come back through the same path.

What about live streams? Comments on a finished live stream work like any other video. Live chat during a broadcast is a different system and is not covered here.

Can I only get recent comments? Set sortBy: "newest" and newerThanDays. The run stops paging as soon as the feed goes older than your cutoff, so you pay for the new comments and nothing else.

How many comments can I get from one video? As many as the video has. Set maxComments: 0 to lift the per-video cap (maxItems still guards the run). Deep pulls take longer — every 20 comments is one request — so raise the run timeout for six-figure jobs.

Are comments returned in YouTube's order? Yes. Items are read in the order YouTube serves them and position records it, so sortBy: "top" gives you a genuine ranking rather than a shuffled bag.

Why do some rows have null for video length or category? See Honest limits — those three fields live in a block YouTube strips from the watch page on some exit IPs. Everything else, including title, channel and view count, is recovered from elsewhere on the page.

Do I need residential proxies? No. The whole chain was verified returning 200 through Apify's standard datacenter proxies. Residential is there if you push very large volumes.

Which export formats are supported? CSV, JSON, JSONL, Excel, XML and HTML table, plus the Apify API and integrations (Make, Zapier, Google Sheets, webhooks).

Can I schedule it? Yes — Apify Schedules. A daily sortBy: newest + newerThanDays: 1 run is a cheap brand-mention monitor.


This Actor reads publicly visible YouTube comments — the same data any signed-out visitor sees on the video page. It does not log in, does not bypass a paywall or an age gate, and collects no private or hidden content.

Comment text and author handles are personal data in the EU/UK. If you process them you are the data controller: have a lawful basis under GDPR (or your local equivalent), keep only what you need, and honour deletion requests. Respect YouTube's Terms of Service and use the output responsibly — public-opinion research, brand and sentiment monitoring, creator analytics, moderation review.

You are responsible for how you use what you collect.