YouTube Comment Scraper — Comments, Replies, Likes avatar

YouTube Comment Scraper — Comments, Replies, Likes

Pricing

from $0.25 / 1,000 comments

Go to Apify Store
YouTube Comment Scraper — Comments, Replies, Likes

YouTube Comment Scraper — Comments, Replies, Likes

Scrape YouTube comments and their reply threads from any video, channel, or search query. Each comment carries author identity and badges, like and reply counts, and timestamps as structured JSON built for sentiment work. Sort by top or newest and re-run for only what is new.

Pricing

from $0.25 / 1,000 comments

Rating

0.0

(0)

Developer

Black Falcon Data

Black Falcon Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

a day ago

Last modified

Share

What does YouTube Comment Scraper do?

YouTube Comment Scraper pulls comments and their reply threads from youtube.com as structured JSON. Paste video URLs (watch links, Shorts, youtu.be, embeds, or bare video IDs), point it at a channel, or give it a search query — every matching video's comments come back with text, author, like and reply counts, verified/creator/pinned/hearted flags, YouTube's relative timestamp and an ISO date, plus a permalink to each comment. Sort by top or newest, attach reply threads to their parent comment, and re-run in incremental mode to receive only the comments posted since last time.

New to Apify? Sign up free and use the included $5 monthly platform credit to test this actor.

Key features

  • 💬 Comments and their reply threads: every comment comes back with its text, author, like and reply counts, and both YouTube's relative timestamp and an ISO date. Turn on includeReplies and each thread's replies are attached to their parent comment under replies — replies are part of that comment's charge, not billed as extra results.
  • 🎯 By video, by channel, or by search: paste video URLs (watch, Shorts, youtu.be, embed, or bare video IDs), or point it at a channel and get comments across its latest videos, or give it a search query and get comments from the top matching videos. Mix all three in one run; maxVideos bounds what channels and searches contribute, and pasted video URLs are always processed in full.
  • 🏷️ Author and engagement signals: each comment carries the author's channel URL, avatar, and badges, plus authorIsVerified, authorIsChannelOwner, isPinned and isHearted — so you can tell a creator reply, a pinned announcement, and a hearted fan comment apart without a second pass. commentUrl links straight back to the comment on YouTube.
  • 🔀 Top or newest, with a cost ceiling: ask YouTube for top (its own ranking) or newest (chronological). Volume is bounded twice: maxComments per video, and maxItems as the total the run may deliver — so a channel-wide job cannot surprise you.
  • ♻️ Incremental mode: re-run the same configuration and receive only the comments that appeared since last time. Each record carries changeType, firstSeenAt, and lastSeenAt. Pair it with sortBy: newest and a schedule to turn the actor into a new-comment monitor for a video or a channel.
  • 🔌 MCP connectors: export your results into Notion via Apify's MCP connectors — a clean run-summary page, no glue code. Opt-in via the App connector field; deterministic field-mapping, no AI. Built on Apify's connector framework, so more destinations open up as their catalog grows.

What data can you extract from youtube.com?

Each result includes Core video fields (datasetType, commentId, videoId, author, authorChannelId, authorChannelUrl, authorAvatarUrl, and authorIsVerified, and more). All fields are always present — unavailable data points are returned as null, never omitted.

Input

Configure the actor through the input schema in Apify Console.

Key parameters:

  • videoUrls — YouTube video URLs to scrape comments from (one per line). Accepts watch links, Shorts, youtu.be short links, embed links, and bare 11-character video IDs. Every URL you paste here is processed — Max Videos only limits videos discovered from channels and search queries. Also accepts the aliases videoUrl, url, urls, and startUrls. (default: [])
  • channelUrls — Channel URLs or bare @handles (one per line), e.g. "https://www.youtube.com/@MrBeast" or "@veritasium". The channel's latest videos are collected (up to Max Videos) and their comments are scraped. Default: empty. Also accepts the alias channelUrl. (default: [])
  • searchQueries — Keywords to search on YouTube (one per line). The top matching videos (up to Max Videos) are used as comment sources. Default: empty. Also accepts the aliases query, q, keyword, keywords, search. (default: [])
  • maxComments — Maximum number of top-level comments to scrape per video. YouTube returns comments in pages of roughly 20, so higher values follow more continuation pages and take longer. 0 = no limit of our own, though the walk still stops after 200 pages (roughly 4,000 comments) for one video, and the total cap below always applies. Default: 100. Also accepts the aliases commentsPerVideo, maxCommentsPerVideo, commentsCount, count. (default: 100)
  • maxItems — Hard ceiling on how many comments the whole run delivers (and therefore on what the run costs), across every video. Reached mid-run, the run stops and pushes what it has. 0 = unlimited. Default: 1000. Also accepts the alias maxTotalComments. (default: 1000)
  • sortBy — Comment order requested from YouTube. "Top comments" is YouTube's own ranking (most engagement first); "Newest first" is chronological — use it together with Incremental Mode to monitor fresh comments. Default: top. Also accepts the aliases commentsSort, orderBy, sort, order. (default: "top")
  • includeReplies — Fetch each comment's reply thread and attach it to the parent comment under replies. Replies are part of the parent comment's record — they are not billed as extra results. Replies are fetched for up to 200 comments per video, and up to the first 20 replies on each of those. Adds one extra request per comment thread, so runs take longer. Default: false. (default: false)
  • ...and 9 more parameters

Input examples

Comments from one video — undefined

→ undefined

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"maxComments": 100,
"sortBy": "top"
}

Comments with reply threads — undefined

→ undefined

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"maxComments": 100,
"includeReplies": true
}

Comments across a channel's latest videos — undefined

→ undefined

{
"channelUrls": [
"https://www.youtube.com/@MrBeast"
],
"maxVideos": 5,
"maxComments": 100,
"maxItems": 500
}

New comments only, on a schedule — undefined

→ undefined

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"sortBy": "newest",
"maxComments": 200,
"incrementalMode": true
}

Comments from the top videos for a keyword — undefined

→ undefined

{
"searchQueries": [
"iphone 17 review"
],
"maxVideos": 5,
"maxComments": 50
}

Output

Each run produces a dataset of structured video records. Results can be downloaded as JSON, CSV, or Excel from the Dataset tab in Apify Console.

Example video record

{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg",
"videoId": "dQw4w9WgXcQ",
"author": "@YouTube",
"authorChannelId": "UCBR8-60-B28hp2BmDPdntcQ",
"authorChannelUrl": "https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ",
"authorAvatarUrl": "https://yt3.ggpht.com/3s6evpqAiDU9tQR4sC2siJippbH2RWVPnwHgyl4V0th2iuQz0VDQZbUhQBGmsxLYo-mjG6TqZQ=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": true,
"authorIsChannelOwner": false,
"authorBadges": [
"verified"
],
"text": "can confirm: he never gave us up",
"likeCount": 309000,
"likeCountText": "309K",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"replyCount": 963,
"isPinned": true,
"isHearted": true,
"isReply": false,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg",
"replies": [
{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR",
"videoId": "dQw4w9WgXcQ",
"author": "@linganguliguliwatcha",
"authorChannelId": "UCjFRISlX-LPxiqViJAE3h6Q",
"authorChannelUrl": "https://www.youtube.com/channel/UCjFRISlX-LPxiqViJAE3h6Q",
"authorAvatarUrl": "https://yt3.ggpht.com/AbGqKNjK9k5tyOqdV7cdXx-GgnGuuGQ5wj8RN42U5YCDvYHT0vaOKXGFahR36iaDPseGN08DjQ=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"text": "YOUTUBE AND ONE LIKE WOOHAAAAH",
"likeCount": 7400,
"likeCountText": "7.4K",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"isPinned": false,
"isHearted": true,
"parentCommentId": "Ugzge340dBgB75hWBm54AaABAg",
"isReply": true,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR",
"scrapedAt": "2026-09-01T19:06:30.869Z"
},
{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA",
"videoId": "dQw4w9WgXcQ",
"author": "@_bugrabilgin",
"authorChannelId": "UCg9tPtxMOieUEyhSv63uJ4g",
"authorChannelUrl": "https://www.youtube.com/channel/UCg9tPtxMOieUEyhSv63uJ4g",
"authorAvatarUrl": "https://yt3.ggpht.com/LvMpN24GYYr8w43sGoMeYZYejDPJz_skehI6jm_XGGhfM5YeRa9OOsaplj60LnFNehE79ZxImg=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"text": "HEY YOUTUBE",
"likeCount": 3100,
"likeCountText": "3.1K",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"isPinned": false,
"isHearted": true,
"parentCommentId": "Ugzge340dBgB75hWBm54AaABAg",
"isReply": true,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA",
"scrapedAt": "2026-09-01T19:06:30.869Z"
},
{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAOCSlaNN",
"videoId": "dQw4w9WgXcQ",
"author": "@NashiraArif",
"authorChannelId": "UCWrbmlBO2iW7jwhSuvLsgXQ",
"authorChannelUrl": "https://www.youtube.com/channel/UCWrbmlBO2iW7jwhSuvLsgXQ",
"authorAvatarUrl": "https://yt3.ggpht.com/ytc/AIdro_n1guDiz8iQIUgFGnmh5VA5PJlNSiWQwX3Ik0ywlPv8JUDRXZiF6wxDvbC7F3YSi1BdlA=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"text": "new comment alert",
"likeCount": 2100,
"likeCountText": "2.1K",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"isPinned": false,
"isHearted": true,
"parentCommentId": "Ugzge340dBgB75hWBm54AaABAg",
"isReply": true,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAOCSlaNN",
"scrapedAt": "2026-09-01T19:06:30.869Z"
},
{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAQwtwdoZ",
"videoId": "dQw4w9WgXcQ",
"author": "@jennaortega-m4m",
"authorChannelId": "UCbHhpa0tTOY_LO-uMH5ZKig",
"authorChannelUrl": "https://www.youtube.com/channel/UCbHhpa0tTOY_LO-uMH5ZKig",
"authorAvatarUrl": "https://yt3.ggpht.com/ytc/AIdro_lVdgv6VK0IOScTdHt1R4NdIFdRkvG2Y1jsrCR_otHBLogTg1YjnUt3k9YQBrmAT3VFLg=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"text": "oop 3rd didnt realise youtube was here😄",
"likeCount": 944,
"likeCountText": "944",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"isPinned": false,
"isHearted": true,
"parentCommentId": "Ugzge340dBgB75hWBm54AaABAg",
"isReply": true,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAQwtwdoZ",
"scrapedAt": "2026-09-01T19:06:30.869Z"
},
{
"datasetType": "comment",
"commentId": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEB5iPJLDp",
"videoId": "dQw4w9WgXcQ",
"author": "@TheAngelofBattle99",
"authorChannelId": "UCCejpvuOWrro8w-YM4SecQQ",
"authorChannelUrl": "https://www.youtube.com/channel/UCCejpvuOWrro8w-YM4SecQQ",
"authorAvatarUrl": "https://yt3.ggpht.com/92UP2htp8mRB1oRt7tZ1bmid5hSmtrt-fNUlOH0sgx0zBFEwLSQ7OT0Vo8nuyWC3XSyUxNl3oMQ=s88-c-k-c0x00ffffff-no-rj",
"authorIsVerified": false,
"authorIsChannelOwner": false,
"text": "He's ingrained in our brains at this point. Such a devoted man.",
"likeCount": 732,
"likeCountText": "732",
"publishedTimeText": "1 year ago",
"publishedAt": "2025-09-01T13:06:30.869Z",
"isPinned": false,
"isHearted": true,
"parentCommentId": "Ugzge340dBgB75hWBm54AaABAg",
"isReply": true,
"isEdited": false,
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"commentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ&lc=Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEB5iPJLDp",
"scrapedAt": "2026-09-01T19:06:30.869Z"
},
"... 5 more items"
],
"scrapedAt": "2026-09-01T19:06:30.869Z",
"position": 0
}

Incremental fields

When incremental mode is on, each record also carries:

  • changeType — one of NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED.

How to scrape youtube.com

  1. Go to YouTube Comment Scraper in Apify Console.
  2. Configure the input.
  3. Set maxItems to control how many results you need.
  4. Click Start and wait for the run to finish.
  5. Export the dataset as JSON, CSV, or Excel.

Use cases

  • Extract video data from youtube.com for market research and competitive analysis.
  • Monitor new and changed videos on scheduled runs without processing the full dataset every time.
  • Export clean, structured data to dashboards, spreadsheets, or data warehouses.

How much does it cost to scrape youtube.com?

YouTube Comment Scraper uses pay-per-event pricing. You pay a small fee when the run starts and then for each result that is actually produced.

  • Run start: $0.001 per run
  • Per result: $0.00025 per video record

Example costs:

  • 10 results: $0.0035
  • 25 results: $0.00725
  • 100 results: $0.026
  • 200 results: $0.051
  • 500 results: $0.13

Example: recurring monitoring savings

These examples compare full re-scrapes with incremental runs at different churn rates. Churn is the share of videos that are new or whose tracked content changed since the previous run. Actual churn depends on your query breadth, source activity, and polling frequency — the scenarios below are examples, not predictions.

Example setup: 250 videos per run, daily polling (30 runs/month). Costs scale linearly with the number of videos.

Churn rateFull re-scrape run costIncremental run costSavings vs full re-scrapeMonthly cost after baseline
5% — stable niche query$0.06$0.00413$0.06 (94%)$0.12
15% — moderate broad query$0.06$0.01$0.05 (84%)$0.31
30% — high-volume aggregator$0.06$0.02$0.04 (69%)$0.59

Full re-scrape monthly cost at the same cadence: $1.91. First month with incremental costs $0.18 / $0.36 / $0.64 for the 5% / 15% / 30% scenarios because the first run builds baseline state at full cost before incremental savings apply.

Platform usage is included in the per-result fee shown above.

FAQ

How many results can I get from youtube.com?

The number of results depends on the search query and available videos on youtube.com. Use the maxItems parameter to control how many results are returned per run.

Does YouTube Comment Scraper support recurring monitoring?

Yes. Enable incremental mode to only receive new or changed videos on subsequent runs. This is ideal for scheduled monitoring where you want to track changes over time without re-processing the full dataset.

Can I integrate YouTube Comment Scraper with other apps?

Yes. YouTube Comment Scraper works with Apify's integrations to connect with tools like Zapier, Make, Google Sheets, Slack, and more. You can also use webhooks to trigger actions when a run completes.

Can I use YouTube Comment Scraper with the Apify API?

Yes. You can start runs, manage inputs, and retrieve results programmatically through the Apify API. Client libraries are available for JavaScript, Python, and other languages.

Can I use YouTube Comment Scraper through an MCP Server?

Yes. Apify provides an MCP Server that lets AI assistants and agents call this actor directly. Use excludeEmptyFields to keep payloads manageable for LLM context windows.

This actor extracts publicly available data from youtube.com. Web scraping of public information is generally considered legal, but you should always review the target site's terms of service and ensure your use case complies with applicable laws and regulations, including GDPR where relevant.

What counts as a billable result?

A "result" is one comment written to the dataset, billed at the per-comment price.

  • Top-level comments — 1 result each.
  • Replies — when includeReplies is on, replies are nested under their parent comment's replies field and are not billed separately. A comment with 40 replies is still 1 result.
  • Videos — scanning a video to reach its comments is never billed as a result, whether you pasted its URL or it came from a channel or a search.

Two inputs bound what a run can cost: maxComments caps comments per video, and maxItems caps the total for the whole run. A run that hits the total cap stops and delivers what it collected.

Do I need a proxy, and what does it cost?

No. The default proxy setting is what this actor is tuned for, and platform usage (compute and network) is paid by us — the per-event price is the whole price. You can point the Proxy input at your own provider if your setup requires it, but nothing here needs it.

What should I know about coverage and limits?

  • Comments can be turned off. A creator can disable comments on a video; that video contributes no records. This is normal, not an error, and the run reports how many videos came back empty.
  • YouTube pages comments in blocks of roughly 20. A high maxComments follows more continuation pages, so large jobs take proportionally longer.
  • Sort order changes what you get first. top is YouTube's own ranking, so a capped run returns the most-engaged comments. newest is chronological — the right choice for monitoring, and the one to pair with incremental mode.
  • Reply threads are capped: up to 20 replies per comment, and up to 200 threads per video, so one enormous thread cannot consume the whole job. The parent comment always carries YouTube's true replyCount, even when fewer replies are attached.
  • publishedAt is derived. YouTube exposes a relative timestamp ("2 months ago"), so the ISO date is an approximation of it, computed against the scrape instant. publishedTimeText carries YouTube's original label.
  • maxVideos applies to discovery only. A channel or a search contributes at most that many videos; video URLs you paste are always all processed.

Your feedback

If you have questions, need a feature, or found a bug, please open an issue on the actor's page in Apify Console. Your feedback helps us improve.

You might also like

Getting started with Apify

New to Apify? Create a free account with $5 credit — no credit card required.

  1. Sign up — $5 platform credit included
  2. Open this actor and configure your input
  3. Click Start — export results as JSON, CSV, or Excel

Need more later? See Apify pricing.

Disclaimer

This actor accesses only publicly available data on youtube.com. You are responsible for how you use the extracted data — in particular any personal information such as names, phone numbers, or email addresses — and for complying with YouTube Comment's terms of use, applicable data-protection law (including the GDPR where it applies), and the anti-spam rules of your jurisdiction.

This actor is not affiliated with, endorsed by, or connected to YouTube Comment.

Search keywords

youtube scraper, youtube api, apify youtube, youtube data extraction, youtube comment scraper, youtube comment api, apify youtube comment, youtube comment data extraction, youtube.com scraper, youtube.com data, youtube.com api, social media scraper, video data, creator data.