YouTube Comments Scraper — Comments API & Export | $0.40/1k
Pricing
from $0.40 / 1,000 results
YouTube Comments Scraper — Comments API & Export | $0.40/1k
Export YouTube comments and replies without an API key: text, likes, reply count, posting time, pinned, hearted and creator flags. Privacy-safe: no commenter names, handles or profiles. Built for sentiment analysis and market research. $0.40 per 1,000 comments.
Pricing
from $0.40 / 1,000 results
Rating
0.0
(0)
Developer
Raffy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
What does YouTube Comments Scraper do?
YouTube Comments Scraper exports the comments and replies of any public YouTube video as clean JSON, CSV or Excel: comment text, like count, reply count, posting time, and whether the comment is pinned, hearted or written by the creator. It works as a YouTube comments API alternative: paste video links or IDs and get the comments back in seconds, with no YouTube API key, no Google account, no quota and no browser.
It is privacy-safe by design: rows never contain commenter names, @handles, channel IDs, avatars or profile links, and @mentions inside the text are masked. You get what you need for sentiment analysis and market research, without collecting personal profiles.
Use it to:
- run sentiment analysis on the comments under your own videos, a competitor's launch video or a product review;
- do market research and product feedback mining: what viewers praise, complain about and ask for, in their own words;
- build training and evaluation data for text classifiers, topic models and LLM pipelines from real audience language;
- monitor new comments on chosen videos (sort by newest) for community management or brand monitoring.
Why use YouTube Comments Scraper?
- No API key, no quota. YouTube's own Data API needs a Google Cloud project and caps you at a daily quota; this Actor needs neither.
- Privacy-safe output. No commenter identity in any row, so the dataset is easier to store, share and process under GDPR-style rules.
- Creator signals included.
isPinned,isHeartedandisCreatorshow which comments the creator promoted or answered. - Replies on demand. Switch on
includeRepliesto get each thread's replies, linked to their parent withparentCommentId. - Honest rows. A video with comments turned off returns one free
not_foundrow that says so; the run does not fail and you are not charged for it. - Fast and light. Plain HTTP requests to the same JSON endpoint youtube.com uses; about 20 comments per request. The default run finishes in well under a minute.
What data can YouTube Comments Scraper extract?
| Field | Type | Description |
|---|---|---|
commentId | string | YouTube's comment id. A reply's id is <parent id>.<reply id>. |
text | string | The comment text. @mentions of other users are replaced with @user. Empty for the rare sticker-only comment. |
likeCount | integer | Likes on the comment. YouTube rounds large numbers (291K becomes 291000). |
replyCount | integer | Replies under the comment (top-level comments only). |
publishedTimeText | string | Posting time as YouTube shows it, e.g. 3 weeks ago. |
publishedAt | string | Estimated ISO 8601 time computed from publishedTimeText (YouTube shows only relative times, so "6 years ago" is accurate to the year). |
isEdited | boolean | The comment was edited. |
isCreator | boolean | Written by the video's own channel. |
isPinned | boolean | Pinned by the creator. |
isHearted | boolean | Hearted by the creator. |
isReply | boolean | The row is a reply to another comment. |
parentCommentId | string | For replies: the commentId of the comment it answers. |
position | integer | 1-based position in the chosen sort order (for replies: within the thread). |
videoId | string | The video's id. |
videoUrl | string | The video's URL. |
videoTitle | string | The video's title. |
channelName | string | The name of the channel that published the video (never a commenter). |
videoCommentCount | integer | The comment total YouTube shows for the video (rounded like on the page). |
sortBy | string | top or newest, as requested. |
inputUrl | string | The input entry the row came from. |
url | string | Direct link to the comment (watch?v=<video>&lc=<comment id>). |
Not included, on purpose: commenter display names, @handles, channel IDs, avatar images and profile links.
Result status (tri-state output)
status | Meaning | Billed? |
|---|---|---|
ok | One comment or reply. | Yes |
not_found | The video has comments turned off (for example videos made for kids), has no comments yet, is a live stream with chat only, or is unavailable. error says which. | No |
error | YouTube could not be read after retries, or the input was not a video link. error says why. | No |
How to scrape YouTube comments with YouTube Comments Scraper
- Open the Actor in Apify Console and go to the Input tab.
- Paste one or more YouTube video URLs or IDs (watch links, youtu.be links, Shorts, live links or bare 11-character IDs).
- Set Max comments per video, choose Top comments or Newest first, and switch on Include replies if you need them.
- Click Start. The default input finishes in about 10 to 30 seconds.
- Download the comments as JSON, CSV, Excel or HTML, or read them through the API.
Need comments for every video of a channel or a search? List the videos first with YouTube Scraper and pass their URLs here.
How much does it cost to scrape YouTube comments?
The Actor uses pay-per-event pricing: you pay for the comments you get, Apify platform usage is included.
| Event | Price |
|---|---|
| Actor start | $0.005 per run |
Result (status: ok row: one comment or reply) | $0.0004 per comment ($0.40 per 1,000) |
Example: 1,000 comments cost about $0.41 ($0.40 plus the $0.005 start fee). Rows with status not_found or error are never billed. The free Apify plan includes enough credit to try the Actor on a several thousand comments. You can cap spending per run with Maximum results and in the run's Max total charge option.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings | one sample video | Video URLs or IDs, one per line. Channel and playlist links are not accepted. |
maxComments | integer | 50 | Top-level comments per video. Replies come on top of this number. |
sortBy | string | top | top (YouTube's "Top comments") or newest ("Newest first"). |
includeReplies | boolean | false | Also save the replies of each saved comment. |
maxRepliesPerComment | integer | 10 | Replies per comment when includeReplies is on. |
maxItems | integer | 1000 | Total rows across all videos; each ok row is one billable result. |
proxyConfiguration | object | Apify Proxy (datacenter) | Spreads requests over datacenter IPs so large runs stay clean. Residential proxies are not needed. |
Example input (the prefill):
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"maxComments": 20,"sortBy": "top","includeReplies": false,"maxItems": 20}
Newest comments and replies of two videos:
{"startUrls": ["https://youtu.be/plN7JMbadRg", "jNQXAC9IVRw"],"maxComments": 100,"sortBy": "newest","includeReplies": true,"maxRepliesPerComment": 5,"maxItems": 1000}
Output
Two real rows from the default run (text shortened):
[{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=UgzKYksqeQ5gA3t0g0F4AaABAg","status": "ok","scrapedAt": "2026-10-16T12:51:29.783Z","commentId": "UgzKYksqeQ5gA3t0g0F4AaABAg","text": "I Rick rolled my entire French class because we had to study a city in France and make a quiz about it ...","publishedTimeText": "6 years ago","publishedAt": "2020-10-16T00:51:29.782Z","isEdited": true,"likeCount": 104000,"replyCount": 604,"isCreator": false,"isPinned": false,"isHearted": false,"isReply": false,"position": 1,"videoId": "dQw4w9WgXcQ","videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoTitle": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","videoCommentCount": 2400000,"sortBy": "top","inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"},{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugxzbv_ZeZXNRcfwsSF4AaABAg","status": "ok","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?","publishedTimeText": "6 years ago","likeCount": 291000,"replyCount": 678,"isCreator": false,"isPinned": false,"isHearted": false,"isReply": false,"position": 2,"videoId": "dQw4w9WgXcQ"}]
A video with comments turned off:
{"url": "https://www.youtube.com/watch?v=IimtbuqYIE8","status": "not_found","error": "Comments are turned off for this video (free row, not charged).","videoId": "IimtbuqYIE8","videoTitle": "LIVE: NHK WORLD-JAPAN News","channelName": "NHK WORLD-JAPAN"}
Tips
- Sentiment over time: use
sortBy: "newest"and a fixedmaxComments, schedule the run daily, and compare the batches. - Most influential opinions: the default
toporder puts the most liked and discussed comments first;likeCountandreplyCountlet you weight them. - Creator engagement: filter
isHeartedorisCreatorto see which comments the creator promoted or answered. - Whole channels: get the video list from YouTube Scraper, then feed the URLs here.
Limitations
- YouTube publishes only relative times ("3 weeks ago"), so
publishedAtis an estimate: precise to the minute for fresh comments, to the month or year for old ones. - Like counts above 1,000 are rounded the way YouTube shows them (1.2K, 291K).
- With Include replies on, replies are fetched as soon as their comment is found, so a low Maximum results can fill up with replies before later top-level comments arrive. Set
maxItemsto at leastmaxComments x (1 + maxRepliesPerComment)per video when you need both in full. - Live streams that are on air have live chat, not comments; they return a free
not_foundrow. Live chat is not scraped. - Results reflect what YouTube shows a logged-out visitor in the US at the time of the run; if YouTube changes its page data, rows come back as
errorand the Actor is updated quickly (report it in the Issues tab).
FAQ
Do I need a YouTube API key or a Google account?
No. The Actor reads the same public data the youtube.com watch page shows a logged-out visitor. There is no API key, no quota and nothing to sign in to.
Does it collect commenter names or profiles?
No. Rows never include display names, @handles, channel IDs, avatars or profile links, and @mentions in the text are masked as @user. Only the video's own channel name (channelName) is included, because it describes the video, not a commenter.
How many comments can I get per video?
As many as YouTube shows, set with Max comments per video. YouTube serves about 20 comments per request, so 1,000 comments take about 50 requests and roughly a minute.
What happens when comments are turned off?
The video gets one free not_found row saying "Comments are turned off for this video". The run still succeeds and other videos are scraped normally.
Is it legal to scrape YouTube comments?
Scraping publicly available data is generally legal, but you are responsible for how you use the output. Comments are written by people; this Actor leaves out their identities, but the text itself can still mention personal details. Read the legal notice below and YouTube's terms of service.
Can I use this Actor from an AI agent or MCP client?
Yes. Call it through the Apify API or the Apify MCP server with a list of video URLs; every row has a fixed set of fields and a status, so an agent can tell "no comments" from "could not read".
Why did I get fewer rows than maxItems?
maxItems is a ceiling. You get fewer rows when the videos have fewer comments than Max comments per video, when comments are turned off, or when maxComments x the number of videos is below maxItems.
What if a field is missing?
Optional fields are omitted when YouTube does not show them (for example replyCount on replies, or videoTitle when YouTube leaves it out). If a field that should always be present is missing, open an issue in the Issues tab with the run ID.
Related Actors
- YouTube Scraper - list a channel's videos, a playlist or search results with views, likes and comment counts, then scrape their comments here.
- Google Trends Scraper - check whether the topic people are discussing is rising or fading.
- Keyword Suggestions API - turn the themes you find in comments into the searches people actually type.
- Substack Scraper - compare a creator's video audience with their newsletter readers.
- Telegram Channel Scraper - follow the same community's discussion on public Telegram channels.
Legal and data-protection notice
This Actor extracts only data that YouTube publishes publicly to logged-out visitors; it does not extract private user data such as e-mail addresses, phone numbers, gender or precise location, it deliberately leaves out commenter names, handles, channel IDs, avatars and profile links, and it does not log in or get around access controls. Comment texts are written by people and could still contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with YouTube's terms of service and applicable law when using the extracted data.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by YouTube or Google. All trademarks belong to their respective owners.