YouTube Comments Scraper – Comments & Replies
Pricing
from $0.50 / 1,000 youtube comment or replies
YouTube Comments Scraper – Comments & Replies
Scrape YouTube comments and replies from videos and Shorts. Export text, authors, likes, timestamps, pinned comments, and direct links without an API key.
Pricing
from $0.50 / 1,000 youtube comment or replies
Rating
0.0
(0)
Developer
Arjun AI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a few seconds ago
Last modified
Categories
Share
Export YouTube comments and replies
Turn public discussions from YouTube videos and Shorts into structured records. Add up to 20 URLs and receive one Dataset item per parent comment or reply, with comment text, authors, likes, timestamps, reply relationships, pinned status, creator hearts, membership badges, paid-comment indicators, and direct comment URLs.
Choose Top comments for a ranked sample, Newest first for chronological collection, or set the limit to 0 to traverse all public comment pages YouTube makes available. No YouTube Data API key is required.
Videos that cannot produce comment rows receive a visible, free videoStatus record, so an empty Dataset is not mistaken for a broken run.
This is an unofficial Actor and is not affiliated with, endorsed by, or sponsored by YouTube or Google. It collects publicly accessible comments only.
Ready-to-run examples
- Analyze top YouTube comments
- Download all public YouTube comments
- Scrape YouTube comments and replies
- Scrape YouTube Shorts comments
Common use cases
- Brand, product, and campaign monitoring
- Audience research and creator analysis
- Sentiment, topic, and keyword analysis
- Community feedback and moderation review
- Market research and competitor tracking
- NLP, LLM, and data-enrichment workflows
Supported URLs
| URL type | Example |
|---|---|
| Standard video | https://www.youtube.com/watch?v=VIDEO_ID |
| Short link | https://youtu.be/VIDEO_ID |
| Shorts | https://www.youtube.com/shorts/VIDEO_ID |
| Embedded video | https://www.youtube.com/embed/VIDEO_ID |
| Live video page | https://www.youtube.com/live/VIDEO_ID |
For live video pages, the Actor extracts the normal public comments section when available. It does not extract live-chat messages.
Quick start
This input returns up to 100 ranked parent comments:
{"startUrls": [{"url": "https://www.youtube.com/watch?v=YE7VzlLtp-4"}],"maxCommentsPerVideo": 100,"sortBy": "top","includeReplies": false,"maxRepliesPerThread": 10}
Input reference
| Field | Type | Default | Behavior |
|---|---|---|---|
startUrls | array | Required | 1–20 public video or Shorts URLs. Duplicate video IDs are processed once. |
maxCommentsPerVideo | integer | 100 | 1–5000 limits combined parent and reply records per video. 0 requests all available public comment pages. |
sortBy | string | top | top for YouTube's ranked view or newest for chronological results. Full collection always uses newest. |
includeReplies | boolean | false | Expand and return replies under each parent comment. Disable for the fastest parent-only run. |
maxRepliesPerThread | integer | 10 | 1–500 replies per parent when includeReplies is enabled. It has no effect when replies are disabled. |
Sorting and full collection
| Result limit | Requested sort | Effective sort | Result |
|---|---|---|---|
| Positive number | top | top | Fixed-size ranked sample |
| Positive number | newest | newest | Fixed-size chronological sample |
0 | top or newest | newest | All available public comment pages |
To collect all available parent comments and replies:
{"startUrls": [{"url": "https://www.youtube.com/watch?v=VIDEO_ID"}],"maxCommentsPerVideo": 0,"sortBy": "newest","includeReplies": true,"maxRepliesPerThread": 500}
maxCommentsPerVideo: 0 removes the combined result limit, but maxRepliesPerThread still limits each reply thread. “All” means all comments YouTube exposes to a public, unauthenticated session—not private, deleted, held-for-review, or otherwise unavailable comments.
Dataset output
Each parent comment and included reply is a separate recordType: "comment" item.
Real comment example
This shortened record came from a real run. Public counters and relative dates can change.
{"recordType": "comment","sourceType": "video","videoId": "YE7VzlLtp-4","videoUrl": "https://www.youtube.com/watch?v=YE7VzlLtp-4","videoTitle": "Big Buck Bunny","videoChannelName": "Blender","commentId": "UgyvM3zp3TKN8kEO4Yd4AaABAg","commentUrl": "https://www.youtube.com/watch?v=YE7VzlLtp-4&lc=UgyvM3zp3TKN8kEO4Yd4AaABAg","text": "still looks better than my renders","publishedTimeText": "3 years ago","publishedAtEstimated": "2023-08-31T06:21:28.917413Z","likeCount": 498,"likeCountText": "498","replyCount": 5,"parentCommentId": null,"replyDepth": 0,"isReply": false,"isPinned": false,"isHearted": false,"isPaid": false,"authorName": "@5MadMovieMakers","authorChannelId": "UCLkZVEXz_qObWr7hAEbS_pQ","authorChannelUrl": "https://www.youtube.com/@5MadMovieMakers","authorIsVerified": true,"authorIsVideoOwner": false,"authorIsMember": false,"authorBadges": ["Verified"],"sortBy": "top"}
Field groups
| Group | Fields |
|---|---|
| Source | recordType, sourceType, videoId, videoUrl, videoTitle, videoChannelId, videoChannelName |
| Comment | commentId, commentUrl, text, publishedTimeText, publishedAtEstimated |
| Engagement | likeCount, likeCountText, replyCount, isPinned, isHearted, isPaid, paidAmountText |
| Reply relationship | parentCommentId, replyDepth, isReply |
| Author | authorName, authorChannelId, authorChannelUrl, authorAvatarUrl, authorIsVerified, authorIsVideoOwner, authorIsMember, authorBadges |
| Run context | sortBy, scrapedAt |
publishedAtEstimated is calculated from YouTube's relative label such as 3 years ago. It is useful for sorting, but it is not an exact publication timestamp supplied by YouTube. likeCount is normalized from the displayed value; likeCountText preserves the public label.
Reply records
A reply has isReply: true, replyDepth: 1, and its parent's ID in parentCommentId. Every reply is independently written to the Dataset and counts as one successful comment result.
Videos without comment rows
When comments are empty, disabled, unavailable, partially extracted, failed, or stopped by the maximum charge, the Dataset receives a free status record:
{"recordType": "videoStatus","status": "noComments","inputValue": "https://www.youtube.com/watch?v=VIDEO_ID","sourceType": "video","videoId": "VIDEO_ID","commentCount": 0,"parentCommentCount": 0,"replyCommentCount": 0,"truncated": false,"errorCode": "NO_PUBLIC_COMMENTS","errorMessage": "No public comments were returned for this video.","suggestion": "No action is required. Verify the public comment section if comments were expected."}
Possible status values are noComments, commentsDisabled, unavailable, partial, failed, and chargeLimitReached.
Pricing
This Actor uses pay-per-event pricing:
- Actor start:
$0.00005per run. - Comment or reply result:
$0.0005each—$0.50per 1,000 results. - Video status row: free.
Example event charges before any configured discounts:
| Comment and reply records | Event charge including one start |
|---|---|
| 1 | $0.00055 |
| 100 | $0.05005 |
| 1,000 | $0.50005 |
The Actor respects the user's maximum run charge. If the budget cannot cover another comment result, collection stops and the input receives a free chargeLimitReached status. The Pricing tab is the source of truth for current prices and discounts.
Run summary
The Dataset is the primary output. The default Key-Value Store record named OUTPUT is a compact run report for automation and troubleshooting. It contains totals plus a status for every input video, including successful, empty, disabled, unavailable, partial, failed, and charge-limited sources.
Use it when a source produced no comment records and you need to distinguish “no public comments” from “request failed.”
Run through the Apify API
For small runs, the synchronous endpoint returns Dataset items directly:
curl -X POST \"https://api.apify.com/v2/acts/arjun_code~youtube-comments-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.youtube.com/watch?v=YE7VzlLtp-4"}],"maxCommentsPerVideo": 100,"sortBy": "top","includeReplies": false,"maxRepliesPerThread": 10}'
For large full-collection runs, start the Actor asynchronously and read the default Dataset after completion.
Performance guidance
- Start with 10–100 comments when evaluating a source.
- Leave replies disabled if you only need parent comments.
- Use
0only when complete public pagination is required; popular videos can contain many pages. - Up to three videos are processed concurrently. Pages for one video remain sequential because YouTube continuation tokens must be followed in order.
Troubleshooting
The Dataset contains only a status row
Read status, errorMessage, and suggestion. A video may genuinely have no comments, have comments disabled, be unavailable to a public session, or encounter a temporary request failure.
The collected total is lower than YouTube's displayed count
Displayed totals can include deleted, hidden, moderated, unavailable, or non-public comments. Replies are also capped by maxRepliesPerThread. The Actor stops when YouTube no longer provides a public continuation token.
includeReplies is false—does maxRepliesPerThread matter?
No. The setting is ignored until replies are enabled.
Related Actors
| Goal | Actor |
|---|---|
| Discover videos, Shorts, or channels by keyword | YouTube Search Scraper |
| Get metadata for known video or Shorts URLs or IDs | YouTube Video and Shorts Details Scraper |
| Enrich known channel handles, IDs, or URLs | YouTube Channel Details Scraper |
| Export a channel's videos, Shorts, and streams | YouTube Channel Content Scraper |
FAQ
Does Top comments return every comment?
No. It is YouTube's ranked view. Set maxCommentsPerVideo to 0; the Actor automatically uses Newest first for the most complete public collection.
Does this support Shorts?
Yes. Supply a /shorts/VIDEO_ID URL. The output uses sourceType: "short".
Does this require a YouTube API key?
No.
Can it scrape private comments or live chat?
No. It returns comments visible to a public, unauthenticated visitor. It does not access private data, creator dashboards, held-for-review comments, or live chat.
Support and responsible use
For unexpected results, open the Actor's Issues tab and include the run ID, public video URL, input settings, expected behavior, and relevant status or log message. Do not post API tokens or private data.
Use the Actor only for lawful processing of publicly accessible information. Follow applicable laws, privacy requirements, and YouTube's terms. Do not use the output for spam, harassment, or invasive profiling.