YouTube Video & Shorts Comments Scraper with Replies avatar

YouTube Video & Shorts Comments Scraper with Replies

Pricing

from $0.18 / 1,000 comments

Go to Apify Store
YouTube Video & Shorts Comments Scraper with Replies

YouTube Video & Shorts Comments Scraper with Replies

Scrape comments and replies from YouTube videos and Shorts: text, author, likes, reply count, posted time, pinned and hearted flags. Top or newest order, only-new mode for scheduled runs. $0.25 per 1,000 comments, failures are free. Final test: all 68 videos with comments returned them.

Pricing

from $0.18 / 1,000 comments

Rating

0.0

(0)

Developer

Gautham Krishna

Gautham Krishna

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 hours ago

Last modified

Share

Get the comments and replies from any YouTube video or Short as clean rows, for sentiment analysis, audience research and brand monitoring.

Use cases, each with a ready-to-run example:

Paste video URLs or IDs, pick top or newest, and get one row per comment with the text, author, likes, reply count and posted time. Or give a channel, a playlist or a search, and get the comments of its latest or top videos in one run.

You pay $0.25 per 1,000 comments ($0.00025 each), and less on Apify Store discount tiers (Bronze, Silver, Gold), down to $0.175 per 1,000 on Gold. Replies count as comments. Videos with comments turned off, deleted videos and failed fetches are never charged.

At a glance

TopicDetails
InputYouTube video or Shorts URLs or IDs, and optionally channels, playlists and searches, each giving its latest or top videos
OutputOne JSON row per comment or reply: text, author, likes, reply count, posted time, pinned and hearted flags, and the parent ID for replies
Price$0.00025 per comment, replies included ($0.25 per 1,000), or $0.225 per 1,000 on Bronze, $0.20 on Silver and $0.175 on Gold. No start fee. Videos with no comments and failed fetches are free
TestedFinal test run on 80 videos, 17 of them Shorts: all 68 videos that had comments returned them, 4,366 rows in 4.5 minutes. A run on 57 channels, playlists and searches returned 14,127 rows from 161 videos in 2.5 minutes, and every listed video with comments returned them
LimitsmaxComments is 100 per video by default, 0 takes every comment. Replies are off until you turn on includeReplies. YouTube rounds like counts of 1,000 and up

What you get per comment

FieldWhat it holds
videoIdThe video the comment belongs to
commentIdYouTube's comment ID. Replies look like <parentId>.<replyId>
textThe full comment text, with emoji and line breaks kept
authorName, authorChannelIdThe commenter's handle and channel ID
authorIsVerified, authorIsChannelOwnerVerified badge, and whether the video's own channel wrote it
likeCountLikes. YouTube rounds counts of 1,000 and up, so 325K comes back as 325000
replyCountReplies to this comment, as YouTube shows it
publishedTimeTextPosted time as YouTube shows it, such as 2 days ago
publishedAtApproxThat time turned into a UTC timestamp at run time. Approximate: 2 days ago can be up to a day earlier
isEditedtrue when YouTube marks the comment as edited
isReply, parentIdtrue and the parent comment ID for replies. Replies come right after their parent
isPinned, isHeartedPinned by the creator, and hearted by the creator
commentUrlA direct link that opens the video at this comment

With includeVideoInfo on, every row also carries three video fields right after videoId.

FieldWhat it holds
videoTitleThe video's title
videoViewCountThe exact view count
videoCommentCountThe exact comment count YouTube shows, which includes replies

Rows that come from a channel, playlist or search start with five more fields.

FieldWhat it holds
inputThe channel, playlist or search you gave
sourceTypechannel, playlist or search
sourceIdThe channel's UC... ID, the playlist ID or the search text
sourceTitleThe channel name, playlist title or search text
positionThe video's place in the listing, 1 for the newest upload or the top search result

A video that returns no comments gets one row with a status and a message instead. That row is free.

statusMeaning
no_commentsComments are turned off, or nobody has commented yet. The message says which
unavailableThe video is deleted, private or the ID is wrong
partialSome comments came back, but YouTube failed on a later page or on some reply threads. You pay only for the comments you got
errorYouTube kept failing for this video after 5 tries on fresh IPs
invalid_inputThe input is not a YouTube link or video ID, or a channel field entry is not a channel or playlist link
not_foundThe channel or playlist does not exist
no_videosThe channel, playlist or search has no public videos

Input

{
"videos": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://www.youtube.com/shorts/4z8Hi_uQOkE"
],
"maxComments": 50,
"sort": "top",
"includeReplies": true,
"maxRepliesPerComment": 10
}
OptionDefaultWhat it does
videosWatch, youtu.be, Shorts, embed and live links, or bare 11-character IDs. A video listed twice is scraped once
channelsAndPlaylistsemptySee Channels, playlists and search below
searchQueriesemptySee Channels, playlists and search below
maxVideosPerSource10Videos per channel, playlist or search
includeShortsfalseChannels only. Adds Shorts to the channel's videos
maxComments100Rows per video, replies included. 0 means every comment
sorttoptop is YouTube's default order. newest puts the latest comments first. Runs with onlyNewSinceLastRun on always read newest first
includeRepliesfalseAdds replies after each parent comment
maxRepliesPerComment10Reply cap per thread. 0 means all replies
includeVideoInfofalseAdds videoTitle, videoViewCount and videoCommentCount to every row, at no extra cost
onlyNewSinceLastRunfalseSee Monitoring below
publishedAfteremptySee Monitoring below

Besides videos, two optional inputs take comments from many videos at once.

InputWhat it takes
channelsAndPlaylistsChannel links in any form (@handle, /channel/UC..., /c/name, /user/name), playlist links with list=..., and bare @handles, UC... channel IDs or PL... playlist IDs. A channel gives its latest videos, a playlist its first ones
searchQueriesYouTube searches, each giving its top videos in YouTube's order
maxVideosPerSourceHow many videos to take from each channel, playlist or search. Default 10, 0 means all, up to 20,000
includeShortsChannels only. Off: regular videos and past live streams. On: every upload, Shorts included

maxComments still applies to each video, so 10 videos at the default 100 comments give up to 1,000 rows per channel. Listing a channel, a playlist or a search is free, and you pay only for comments. A video met twice in one run, through videos or another source, is scraped and charged once. A channel or playlist that does not exist comes back as one free not_found row, and a video with comments off as a free no_comments row with its source fields.

{
"channelsAndPlaylists": ["@3blue1brown", "https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"],
"searchQueries": ["receta de paella"],
"maxVideosPerSource": 3,
"maxComments": 100,
"includeVideoInfo": true
}

Monitoring: only new comments and a date cutoff

Two optional inputs turn a scheduled run into a feed of new comments. Both are off by default, and a run without them works exactly as before.

OptionWhat it does
onlyNewSinceLastRunReturns only comments this scraper has not returned to you before for the same video and filters, and nothing older than the newest one it returned last time. The first run returns the newest comments up to maxComments and remembers them
publishedAfterOnly comments published on or after a date: 2026-10-01, 2026-10-01T12:00:00Z (UTC), or a relative value such as 7 days

With onlyNewSinceLastRun on, the run reads comments newest first whatever sort says. It stops at the first page that holds nothing new, so a daily run reads only the pages it needs. A publishedAfter cutoff on its own stops early only with sort: "newest", and in top order it reads further to find newer comments. You pay only for the comments returned. YouTube shows only relative times such as 3 days ago, so publishedAfter works on an approximate time, given on every row as publishedAtApprox. The real time can be up to one unit earlier, up to a day for 3 days ago. When the run stops early, new replies on older comment threads are not picked up. The memory is a key-value store named youtube-comments-scraper-monitor in your own Apify account, one record per video and replies setting. Delete that store to start over. A video with nothing new comes back as a free no_comments row. The memory belongs to the video, not to the way you reached it, so a video you monitored through videos keeps its memory when it comes from a channel, a playlist or a search instead. A scheduled run on a channel lists its latest videos each time, and a newly uploaded video returns its newest comments up to maxComments on its first run.

Run it on a schedule

A daily run with onlyNewSinceLastRun: true gives you the new comments on the videos or channels you watch. We ran the same 60 videos on 15 Oct and again on 20 Oct. The 20 Oct run returned 925 comments and replies, and a script found none that the 15 Oct runs had returned. 25 videos with nothing new came back as free no_comments rows.

  1. Set your input with onlyNewSinceLastRun: true and click Save as a new task.
  2. On the task page, click Actions, then Schedule, and pick how often it runs. Apify's schedules guide covers cron times and time zones.
  3. On the task's Integrations tab, choose where each run's results go.
IntegrationWhat it does
SlackPosts a message to your channel when a run finishes
Google DriveSaves each run's results as a file in your Drive
WebhookSends the finished run, with its dataset ID, to your own URL
Make, Zapier, n8nAdds each new row to a Google Sheet, a CRM or a database

Each comment has a stable commentId, so a sheet or database can skip rows it already holds.

Output example

This is real output for the input above, from a run on 15 Oct 2026. It shows the first comment on the first video and its first reply.

[
{
"videoId": "dQw4w9WgXcQ",
"commentId": "Ugxzbv_ZeZXNRcfwsSF4AaABAg",
"text": "Is everyone going to ignore the fact that Rick Astley looks like a twelve year old boy but has a uniquely deep voice?",
"authorName": "@candycake9531",
"authorChannelId": "UCNLgzvqrGzFi5SEAbVkFchg",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"likeCount": 291000,
"replyCount": 675,
"publishedTimeText": "6 years ago",
"publishedAtApprox": "2020-10-15T06:16:44Z",
"isEdited": false,
"isReply": false,
"parentId": null,
"isPinned": false,
"isHearted": false,
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugxzbv_ZeZXNRcfwsSF4AaABAg"
},
{
"videoId": "dQw4w9WgXcQ",
"commentId": "Ugxzbv_ZeZXNRcfwsSF4AaABAg.91_2FL04Xww97FrL-edZw3",
"text": "@Sam The Gamer?",
"authorName": "@candycake9531",
"authorChannelId": "UCNLgzvqrGzFi5SEAbVkFchg",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"likeCount": 4300,
"replyCount": 0,
"publishedTimeText": "6 years ago",
"publishedAtApprox": "2020-10-15T06:16:45Z",
"isEdited": true,
"isReply": true,
"parentId": "Ugxzbv_ZeZXNRcfwsSF4AaABAg",
"isPinned": false,
"isHearted": false,
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugxzbv_ZeZXNRcfwsSF4AaABAg.91_2FL04Xww97FrL-edZw3"
}
]

This row comes from the final test run on 17 Oct 2026, with @3blue1brown in channelsAndPlaylists, maxVideosPerSource: 3 and includeVideoInfo: true.

{
"input": "@3blue1brown",
"sourceType": "channel",
"sourceId": "UCYO_jab_esuFRV4b17AJtAw",
"sourceTitle": "3Blue1Brown",
"position": 1,
"videoId": "LKrwhjOI8Nc",
"videoTitle": "There's never been a better time to go into math",
"videoViewCount": 852735,
"videoCommentCount": 2543,
"commentId": "UgwyDGkk9dXgW3_c-UV4AaABAg",
"text": "Final year of my math degree this is what happens. Incredible comedic timing can't even be mad",
"authorName": "@blazednewt413",
"authorChannelId": "UCObAuvVyGm0VE33DT8G57zA",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"likeCount": 452,
"replyCount": 32,
"publishedTimeText": "10 hours ago",
"publishedAtApprox": "2026-10-16T17:18:58Z",
"isEdited": false,
"isReply": false,
"parentId": null,
"isPinned": false,
"isHearted": false,
"commentUrl": "https://www.youtube.com/watch?v=LKrwhjOI8Nc&lc=UgwyDGkk9dXgW3_c-UV4AaABAg"
}

A channel that does not exist returns this free row:

{
"input": "https://www.youtube.com/@thisHandleDoesNotExist_zq81x",
"status": "not_found",
"message": "YouTube says this channel or playlist does not exist"
}

A video with comments turned off returns this free row:

{
"input": "https://youtu.be/XqZsoesa55w",
"videoId": "XqZsoesa55w",
"status": "no_comments",
"message": "Comments are turned off for this video",
"commentsReturned": 0
}

How well it works

We tested the final build on 80 different videos in one run: music videos, podcasts, news in Tamil and Hindi, live stream replays, sports highlights, small channels and 17 Shorts.

  • All 68 videos that had comments returned them, 4,366 comments and replies in total.
  • 8 videos had comments turned off and 3 had no comments yet. Each got a free no_comments row.
  • 1 made-up video ID got a free unavailable row.
  • The run took 4.5 minutes with 100 comments per video and up to 5 replies per thread.

A second run on 17 Oct 2026 took 3 videos from each of 30 channels, 12 playlists and 15 searches, in English, Spanish, French and Hindi, with includeVideoInfo on.

  • 56 of the 57 sources returned comments, 14,127 rows from 161 videos, in 2.5 minutes.
  • The other source is NASA, whose 3 latest videos all have comments turned off.
  • 7 videos had comments turned off and 2 had no comments yet, each with a free no_comments row.
  • Every one of the 161 videos came back with its title, view count and comment count.
  • A made-up handle got a free not_found row, and a video link in the channel field a free invalid_input row.

In a separate check with no limits, 20 of these videos with fewer than 100 comments returned within 3 rows of the comment count YouTube shows. The small gap comes from comments YouTube still counts but no longer shows, such as held or deleted ones.

Use it from AI agents

The scraper works as a tool through the Apify MCP server in Claude, Cursor, VS Code and other MCP clients. An agent can pass a video link and get back the comments as text it can summarise or classify.

You can also call it through the Apify API or the Python and JavaScript clients, and schedule it or connect it to Make, Zapier and n8n.

Pricing

Prices are per 1,000 comments.

EventNo discountBronzeSilverGold
Comment or reply returned$0.25$0.225$0.20$0.175
Comments off, no comments, unavailable video, invalid input or failed fetchFreeFreeFreeFree

Bronze, Silver and Gold are Apify Store discount tiers, and Apify's Pricing tab shows them as Starter, Scale and Business. Apify decides which tier an account is on.

Set a maximum cost per run in the run options. The scraper stops once that limit is reached.

More from heyitsgautham

Other actors from the same account.

FAQ

Why did I get fewer comments than the video shows? The count on YouTube includes replies, and replies are off by default. Turn on includeReplies and set maxRepliesPerComment to 0 to get all of them.

Why is the first comment in newest order an old one? YouTube always puts the pinned comment first, in both orders.

Why do some Top results look like Newest? On some videos YouTube now limits Top to a few comments the creator featured. When that happens the scraper switches that video to newest order so you still get every comment.

Does it work for Shorts and live streams? Yes. Shorts and finished live streams have the same comments as normal videos. Live chat messages are not comments and are not included.

Are the dates exact? No. YouTube only shows relative times such as 3 weeks ago, and the scraper returns them as shown.

Does it use the official YouTube API? No. It reads the same public comment data the YouTube website shows to logged-out visitors, with no login and no API key. It does not collect emails or phone numbers.

Limitations

  • Like counts of 1,000 and up are rounded by YouTube, so 1.2K becomes 1200.
  • replyCount can be a little higher than the replies you get, because YouTube counts held and deleted replies.
  • Rows from several videos can interleave in the dataset. Group by videoId if you need them apart.
  • A channel or playlist link put in videos comes back as a free invalid_input row whose message points to channelsAndPlaylists.
  • Mixes (list=RD...) cannot be listed.