YouTube Comments Scraper avatar

YouTube Comments Scraper

Pricing

from $0.25 / 1,000 results

Go to Apify Store
YouTube Comments Scraper

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

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

3 days ago

Last modified

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 parentCommentId for 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 isCreatorReply indicator 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 β€” maxRepliesPerComment keeps 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 includeVideoInfo to 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/..., and youtube.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 isCreatorReply rows and isHearted engagement

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 videoInfo rows to provide topical context for context-aware models

Trend Detection

  • Switch to latest sort 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

ParameterTypeDefaultDescription
startUrlsstring[]["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

ParameterTypeDefaultDescription
sortBystring"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.
includeRepliesbooleanfalseAlso 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

ParameterTypeDefaultDescription
maxResultsinteger100Total 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).
maxRepliesPerCommentinteger50Cap 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

ParameterTypeDefaultDescription
includeVideoInfobooleanfalseEmit 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

ParameterTypeDefaultDescription
languagestring"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)

FieldTypeDescription
recordTypestringOne of comment, reply, or videoInfo. Use this to filter and route rows downstream.
videoIdstringThe 11-character YouTube video ID this row belongs to.
sourceInputstringThe original URL the user provided, useful for grouping results in batches.
scrapedAtstringISO 8601 timestamp of when the row was captured.

Comment & Reply fields (recordType: "comment" or "reply")

FieldTypeDescription
commentIdstringStable YouTube comment ID. Reply IDs use the form <parentId>.<replyId>.
parentCommentIdstring | nullThe top-level comment's ID for replies; null for top-level comments.
textstringFull comment text (links collapsed back to URLs).
authorstringAuthor display name.
authorChannelIdstring | nullAuthor's YouTube channel ID (UC...).
authorProfileUrlstring | nullCanonical channel URL https://www.youtube.com/channel/<UC...>.
authorThumbnailstring | nullURL to the author's avatar (largest variant available).
publishedAtstring | nullISO 8601 best-effort timestamp resolved from the relative label. Populated for English-locale runs; null for other languages.
publishedAtRawstring | nullThe original "2 days ago (edited)" label exactly as YouTube renders it.
isEditedbooleantrue if the comment was edited (parsed from the "(edited)" marker).
likeCountintegerLike count (parsed from labels like "1.2K" or "3.4M" into an integer).
replyCountinteger | nullNumber of replies on a top-level comment; null on reply rows.
isPinnedbooleantrue if the comment is pinned by the channel owner.
isHeartedbooleantrue if the comment is hearted by the channel owner.
isCreatorReplybooleantrue if the author is the channel that uploaded the video.

Video Info fields (recordType: "videoInfo")

FieldTypeDescription
titlestring | nullVideo title in the requested language.
channelstring | nullUploader channel display name.
channelIdstring | nullUploader channel ID (UC...).
viewCountintegerTotal views at fetch time.
likeCountinteger | nullAlways null in this version β€” see Good to Know below.
publishedAtstring | nullUpload date (ISO 8601 format).
lengthSecondsinteger | nullVideo duration in seconds; null for active live streams.
descriptionstring | nullVideo description (full text).
isShortbooleantrue if the input URL was a youtube.com/shorts/... URL.

Tips for Best Results

  • Set maxRepliesPerComment for 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 latest for live-event and fresh-upload monitoring. Switch the sort to latest when you need to track reactions as they happen β€” perfect for product launches, news events, or just-uploaded videos.
  • Turn on includeVideoInfo for 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/..., and youtube.com/shorts/... β€” Shorts URLs are auto-normalized to the corresponding watch URL behind the scenes.
  • Use sourceInput to 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: 0 only when you genuinely want everything. YouTube has an undocumented natural ceiling on the public comments stream; 0 will 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.

ResultsCost
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.
  • publishedAt ISO dates are populated for English-locale runs. Non-English runs (Spanish, French, etc.) still return the human-readable publishedAtRaw (e.g. "hace 1 aΓ±o") but leave publishedAt as null. If you need ISO timestamps for non-English videos, parse publishedAtRaw downstream.
  • 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> and youtube.com/watch?v=<id> produce identical comment streams.
  • likeCount on the video metadata row is always null. 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. The maxRepliesPerComment cap is your main lever for keeping reply costs in check.
  • Comment text is user-generated and never translated by YouTube. The language setting only affects the optional Video Metadata Row (titles, descriptions).

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.