YouTube Comments Scraper
Pricing
from $0.25 / 1,000 results
YouTube Comments Scraper
[π° $0.25 / 1K] Extract comments and reply threads from public YouTube videos and Shorts. Returns comment text, author name and channel, like counts, reply structure, pinned and hearted flags and creator-reply detection. Pay only for the comments you get no compute fees, no subscription.
Pricing
from $0.25 / 1,000 results
Rating
5.0
(1)
Developer
SolidCode
Actor stats
0
Bookmarked
4
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Share
Extract complete comment threads from any public YouTube video or Short β top-level comments, reply chains, like counts, author profiles, pinned and hearted flags, and creator replies β in clean structured rows. Built for sentiment analysis, brand monitoring, influencer vetting, and audience research, with no login required and pay-per-result pricing.
Why This Scraper?
- Top-level comments and full reply threads β fetch any depth of conversation, with each reply linked back to its parent comment via
parentCommentIdfor easy thread reconstruction. - Rich author and engagement signals β every row carries the author's display name, channel ID, profile URL, avatar, like count, edited flag, pinned flag, hearted-by-creator flag, and an
isCreatorReplyindicator for instantly spotting channel-owner responses. - Top or Latest sort β surface the most-engaged comments first, or switch to newest-first for live event monitoring and shifting sentiment.
- Built-in reply cap β
maxRepliesPerCommentkeeps a single viral mega-thread from monopolizing your run, so you stay in control of cost and dataset shape. - Optional video metadata row β flip on
includeVideoInfoto also receive the video's title, channel, view count, upload date, and description per input video β perfect for joining comments back to context in a single dataset. - Shorts and watch URLs in one input β paste any mix of
youtube.com/watch?v=...,youtu.be/..., andyoutube.com/shorts/...β Shorts URLs are auto-normalized. - 19 interface languages β choose the language for the optional video metadata row to match your audience.
- Pay only for results β flat rate per 1,000 dataset items, no compute-time charges.
Use Cases
Sentiment Analysis
- Measure positive, negative, and neutral reactions to a product launch, ad campaign, or news event
- Track sentiment shifts over time by re-running on the same video
- Build labeled training sets for downstream sentiment models
Brand Monitoring
- Watch comment threads on competitor and partner channels for mentions of your brand
- Detect emerging complaints, support questions, or PR risks early
- Quantify share of voice in conversations under industry-relevant videos
Market Research
- Mine the audience reaction to a new feature, price change, or market entrant
- Compare audience demographics and preferences across creators in the same niche
- Surface frequently asked questions, common objections, and unmet needs in your space
Influencer Vetting
- Audit engagement quality before sponsoring a creator β look for real conversations, not bot spam
- Spot suspicious comment patterns (repeated phrases, off-topic plugs, low-effort replies)
- Quantify creator-fan interaction by counting
isCreatorReplyrows andisHeartedengagement
NLP Training Data
- Collect large, diverse comment corpora for sentiment, toxicity, intent, or topic classifiers
- Pull multilingual comment data β comment text is user-generated, never machine-translated
- Pair comments with
videoInforows to provide topical context for context-aware models
Trend Detection
- Switch to
latestsort to monitor a live event or fresh upload as reactions roll in - Catch breakout opinions and viral replies as they emerge under trending videos
- Track reaction velocity by re-running on the same video at fixed intervals
Getting Started
Simple Run
The fastest way to start β paste a video URL and use the defaults (Top sort, 100 comments).
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}
Multiple Videos with Replies
Pull comments and reply threads from a batch of videos, capped at 50 replies per top-level comment.
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/9bZkp7q19f0","https://www.youtube.com/shorts/s3DrGkDvgNw"],"includeReplies": true,"maxResults": 500,"maxRepliesPerComment": 50}
Latest-First Monitoring with Video Context
Watch a fresh upload, get the newest comments first, and join them back to the video's metadata in the same dataset.
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"sortBy": "latest","maxResults": 1000,"includeVideoInfo": true,"language": "en"}
Full Run β Every Toggle Set
Top-engagement comments, full reply threads, video context, Spanish video metadata, capped per thread.
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/watch?v=9bZkp7q19f0"],"sortBy": "top","includeReplies": true,"maxResults": 2000,"maxRepliesPerComment": 25,"includeVideoInfo": true,"language": "es"}
Input Reference
What to Scrape
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | string[] | ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] | Paste one or more YouTube video or Shorts URLs. Accepts youtube.com/watch?v=..., youtu.be/..., and youtube.com/shorts/... β mix any of these in one list. The actor fetches the public comments stream for each video. |
Filters
| Parameter | Type | Default | Description |
|---|---|---|---|
sortBy | string | "top" | Order comments are returned in. "Top" surfaces the most-liked, most-engaged comments first (matches the default YouTube view). "Latest" returns newest-first β best for sentiment shifts or live-event monitoring. |
includeReplies | boolean | false | Also fetch reply threads under each top-level comment. Replies count toward your Maximum Results cap and are charged as separate dataset items. Leave off if you only need top-level engagement. |
Results
| Parameter | Type | Default | Description |
|---|---|---|---|
maxResults | integer | 100 | Total comments + replies to fetch per video. Set to 0 to fetch as many as YouTube serves. YouTube itself caps the public comments stream on most videos β even on viral videos with millions of comments, only a few thousand are typically reachable through the public continuation tokens. The actor delivers everything reachable up to your limit, and stops requesting new pages once this number is reached (it may return a few extra rows from the final page). |
maxRepliesPerComment | integer | 50 | Cap on replies fetched per top-level comment. Useful for viral videos where a single megathread can have thousands of replies β this prevents one thread from monopolizing the run. Ignored when Include Reply Threads is off. Set to 0 to disable the per-thread cap (replies are still bounded by Maximum Comments per Video). Note: YouTube itself sometimes caps how deep a single reply thread can be walked through the public continuation tokens; the actor delivers everything reachable up to your limit. |
Enrichment
| Parameter | Type | Default | Description |
|---|---|---|---|
includeVideoInfo | boolean | false | Emit one extra row per input video with the video's title, channel, view count, upload date, and description. Handy for sentiment analysis when you need to join comments back to the video. Adds 1 dataset item per video. |
Localization
| Parameter | Type | Default | Description |
|---|---|---|---|
language | string | "en" | Interface language for video metadata (titles, descriptions). Comment text itself is user-generated and is never translated by YouTube β this setting only affects the optional Video Metadata Row. Supports English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Turkish, Russian, Japanese, Korean, Chinese (Simplified), Chinese (Traditional), Arabic, Hebrew, Thai, Vietnamese, Indonesian. |
Output
Every row carries a recordType field so you can tell top-level comments, replies, and video metadata rows apart at a glance. Below is one example per type.
Comment (top-level)
{"recordType": "comment","videoId": "dQw4w9WgXcQ","commentId": "UgxKREWxIgDrw8w2e_Z4AaABAg","parentCommentId": null,"text": "Still here in 2026, this never gets old.","author": "Jane Listener","authorChannelId": "UCBJycsmduvYEL83R_U4JriQ","authorProfileUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ","authorThumbnail": "https://yt3.ggpht.com/ytc/jane_listener_avatar.jpg","publishedAt": "2026-04-23T17:46:41+00:00","publishedAtRaw": "2 days ago","isEdited": false,"likeCount": 1842,"replyCount": 37,"isPinned": true,"isHearted": true,"isCreatorReply": false,"sourceInput": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","scrapedAt": "2026-04-25T17:46:41+00:00"}
Reply
{"recordType": "reply","videoId": "dQw4w9WgXcQ","commentId": "UgxKREWxIgDrw8w2e_Z4AaABAg.2x9aR4Q1bQc","parentCommentId": "UgxKREWxIgDrw8w2e_Z4AaABAg","text": "Same β first time I heard it on the radio in 1987!","author": "Mark T.","authorChannelId": "UCXuqSBlHAE6Xw-yeJA0Tunw","authorProfileUrl": "https://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw","authorThumbnail": "https://yt3.ggpht.com/ytc/mark_t_avatar.jpg","publishedAt": "2026-04-24T11:12:03+00:00","publishedAtRaw": "1 day ago (edited)","isEdited": true,"likeCount": 24,"replyCount": null,"isPinned": false,"isHearted": false,"isCreatorReply": false,"sourceInput": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","scrapedAt": "2026-04-25T17:46:41+00:00"}
Video Info
Emitted only when includeVideoInfo is set to true β one row per input video.
{"recordType": "videoInfo","videoId": "dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channel": "Rick Astley","channelId": "UCuAXFkgsw1L7xaCfnd5JJOw","viewCount": 1632400000,"likeCount": null,"publishedAt": "2009-10-25","lengthSeconds": 212,"description": "The official 4K remastered video for Rick Astley's 'Never Gonna Give You Up'...","isShort": false,"sourceInput": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","scrapedAt": "2026-04-25T17:46:41+00:00"}
Fields by Record Type
Common fields (every row)
| Field | Type | Description |
|---|---|---|
recordType | string | One of comment, reply, or videoInfo. Use this to filter and route rows downstream. |
videoId | string | The 11-character YouTube video ID this row belongs to. |
sourceInput | string | The original URL the user provided, useful for grouping results in batches. |
scrapedAt | string | ISO 8601 timestamp of when the row was captured. |
Comment & Reply fields (recordType: "comment" or "reply")
| Field | Type | Description |
|---|---|---|
commentId | string | Stable YouTube comment ID. Reply IDs use the form <parentId>.<replyId>. |
parentCommentId | string | null | The top-level comment's ID for replies; null for top-level comments. |
text | string | Full comment text (links collapsed back to URLs). |
author | string | Author display name. |
authorChannelId | string | null | Author's YouTube channel ID (UC...). |
authorProfileUrl | string | null | Canonical channel URL https://www.youtube.com/channel/<UC...>. |
authorThumbnail | string | null | URL to the author's avatar (largest variant available). |
publishedAt | string | null | ISO 8601 best-effort timestamp resolved from the relative label. Populated for English-locale runs; null for other languages. |
publishedAtRaw | string | null | The original "2 days ago (edited)" label exactly as YouTube renders it. |
isEdited | boolean | true if the comment was edited (parsed from the "(edited)" marker). |
likeCount | integer | Like count (parsed from labels like "1.2K" or "3.4M" into an integer). |
replyCount | integer | null | Number of replies on a top-level comment; null on reply rows. |
isPinned | boolean | true if the comment is pinned by the channel owner. |
isHearted | boolean | true if the comment is hearted by the channel owner. |
isCreatorReply | boolean | true if the author is the channel that uploaded the video. |
Video Info fields (recordType: "videoInfo")
| Field | Type | Description |
|---|---|---|
title | string | null | Video title in the requested language. |
channel | string | null | Uploader channel display name. |
channelId | string | null | Uploader channel ID (UC...). |
viewCount | integer | Total views at fetch time. |
likeCount | integer | null | Always null in this version β see Good to Know below. |
publishedAt | string | null | Upload date (ISO 8601 format). |
lengthSeconds | integer | null | Video duration in seconds; null for active live streams. |
description | string | null | Video description (full text). |
isShort | boolean | true if the input URL was a youtube.com/shorts/... URL. |
Tips for Best Results
- Set
maxRepliesPerCommentfor viral videos. A single mega-thread on a popular Short can have tens of thousands of replies β leaving the default cap of 50 in place keeps your dataset balanced and your bill predictable. - Use
latestfor live-event and fresh-upload monitoring. Switch the sort tolatestwhen you need to track reactions as they happen β perfect for product launches, news events, or just-uploaded videos. - Turn on
includeVideoInfofor sentiment analysis. The single extra row per video lets you join comments back to the video's title, channel, and view count in one dataset β no second actor call needed. - Mix watch URLs, short links, and Shorts URLs freely. One run can blend
youtube.com/watch?v=...,youtu.be/..., andyoutube.com/shorts/...β Shorts URLs are auto-normalized to the corresponding watch URL behind the scenes. - Use
sourceInputto batch results downstream. Every row keeps the original URL you supplied, so you can group results by input video in your pipeline without extra bookkeeping. - Set
maxResults: 0only when you genuinely want everything. YouTube has an undocumented natural ceiling on the public comments stream;0will fetch everything reachable, but viral videos with millions of comments will still cap out at a few thousand rows.
Pricing
No compute charges β you only pay per result returned.
$0.25 per 1,000 results.
| Results | Cost |
|---|---|
| 100 | $0.025 |
| 1,000 | $0.25 |
| 10,000 | $2.50 |
Every row in your dataset counts as one result, regardless of whether it's a comment, a reply, or a video metadata row.
Integrations
Connect your extracted data to the rest of your stack:
- API β Pull results programmatically via the Apify API
- Webhooks β Trigger downstream workflows the moment a run completes
- Google Sheets β One-click export straight into a spreadsheet
- Zapier / Make / n8n β Automate with 1,000+ app connectors
- Datasets β Download as JSON, CSV, Excel, XML, or RSS
Good to Know
- Comments-disabled videos return zero rows. When a creator has turned off comments (or the video is private, age-gated, or removed), the actor logs an explanatory line, emits no rows for that video, and finishes the run normally β no traceback, no broken dataset.
publishedAtISO dates are populated for English-locale runs. Non-English runs (Spanish, French, etc.) still return the human-readablepublishedAtRaw(e.g."hace 1 aΓ±o") but leavepublishedAtasnull. If you need ISO timestamps for non-English videos, parsepublishedAtRawdownstream.- YouTube caps how many comments are reachable on some videos. Even with
maxResults: 0, the public comments stream has an undocumented ceiling β you receive everything reachable, which on viral videos may be a small fraction of the stated comment count. This is a YouTube limitation, not an actor limitation. - Shorts URLs are auto-normalized to their underlying watch URL β
youtube.com/shorts/<id>andyoutube.com/watch?v=<id>produce identical comment streams. likeCounton the video metadata row is alwaysnull. YouTube hides video like counts behind an authenticated endpoint. Comment like counts are unaffected and are returned as integers on every comment and reply row.- Replies are charged as separate items. With
includeReplies: true, each reply you receive counts as one dataset row. ThemaxRepliesPerCommentcap is your main lever for keeping reply costs in check. - Comment text is user-generated and never translated by YouTube. The
languagesetting only affects the optional Video Metadata Row (titles, descriptions).
Legal & Ethical Use
This actor is designed for legitimate sentiment analysis, brand monitoring, market research, influencer vetting, and academic research. You are responsible for complying with YouTube's Terms of Service, applicable laws, and data protection regulations in your jurisdiction. The actor only collects publicly visible data β no login, no private comments, no age-gated or members-only content, and no personal data beyond what YouTube already shows on the public watch page. Do not use extracted data for spam, harassment, impersonation, or any unlawful purpose.