YouTube Comments Scraper API - Channel, Playlist & Video avatar

YouTube Comments Scraper API - Channel, Playlist & Video

Pricing

from $2.00 / 1,000 comments

Go to Apify Store
YouTube Comments Scraper API - Channel, Playlist & Video

YouTube Comments Scraper API - Channel, Playlist & Video

Scrape YouTube comments from whole channels, playlists and search results, not just one video. Full nested reply threads, like counts flagged when YouTube rounds them, optional sentiment and keyword scoring, and delta-only re-runs for daily monitoring. Pay per comment, no run-start fee.

Pricing

from $2.00 / 1,000 comments

Rating

0.0

(0)

Developer

Blackcube

Blackcube

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Share

More from this account: YouTube Transcript Suite · Website Contact & Email Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Reddit · Meta Ad Library · Vinted · Trustpilot Review Intelligence Suite · App Store & Google Play Reviews Suite · Business Reviews Suite · Amazon Product Data Suite

Scrape YouTube comments from whole channels, playlists and search results, not just one video. Full nested reply threads, like counts flagged when YouTube rounds them, optional sentiment and keyword scoring, and delta-only re-runs for daily monitoring. Pay per comment, no run-start fee.

No run-start fee, and failures are free. Videos with comments turned off, videos that no longer exist, per-video rows, the coverage report and every error row all cost nothing. A video that was read but had no new comment is billed once as a video checked ($0.004) — twice a single comment, and a fraction of what a busy video costs.

What most YouTube comment scrapers make you do

Feed them one video URL at a time. If you want a channel's last fifty videos you write the loop yourself, find the video ids yourself, and stitch the results together yourself.

This one takes the channel. Paste an @handle, a playlist link, a search phrase or a Shorts tab and it finds the videos and returns every comment underneath them, in one dataset, deduplicated on YouTube's own comment id.

You pasteYou get
@handle or a channel URLComments from every video on the channel
A playlist URLComments from every video in the playlist
A search phraseComments from every video the search returns
A /shorts tabComments from the creator's Shorts
A video URL, id, youtu.be or /live linkComments from that video

Mix as many as you like in a single run.

What you get

FieldWhat it is
textThe comment itself, exactly as written
author, authorChannelId, authorChannelUrlWho wrote it, and a link straight to their channel
authorIsVerified, authorIsCreatorVerified badge, and whether the video's own channel wrote it
likeCountNumeric likes — exact below 1,000
likeCountIsApproximatetrue when YouTube rounded the number, so a filter is never silently wrong
likeCountTextWhat YouTube actually rendered, verbatim: "306K", "201"
replyCountHow many replies the comment has
isReply, replyLevelWhether this is a reply, and how deep
threadId, parentCommentIdRebuild the conversation exactly — every reply points at its parent
isHeartedThe creator hearted this comment
publishedTimeTextYouTube's own wording: "1 year ago"
publishedAtApproxThat resolved to an ISO timestamp, so it sorts and filters
commentIdYouTube's own id — stable, and what deduplication keys on
videoId, videoUrl, videoTitle, channelName, channelIdWhich video and channel it came from
sortedBy, scrapedAtWhich order was requested, and when it was read

Turn on enrichComments and every comment also carries:

FieldWhat it is
sentimentpositive, negative or neutral
sentimentScoreNormalised -1 to 1, so comments sort by strength of feeling
toxicityScore0 to 1 triage signal for surfacing abuse to a human
keywordsContent words, stopwords and @mentions stripped out
isQuestionThe comment asks something — the fastest route to FAQ and content ideas
mentionedTimestampsTimestamps viewers cite, like ["1:23"]
languageDominant writing system (latin, cyrillic, han, …), or null when too short to tell

Four kinds of row, and only one of them costs anything

RowtypeCosts
A comment or replycomment$2.00 per 1,000 (+$2.00 per 1,000 if enriched)
One row per video, with its title, views and how many comments came backvideofree
What each input produced, and whether the source ran out or your cap stopped itcoveragefree
Anything that could not be served, with the reasonerrorfree

Pricing

Your Apify plancomment / 1,000enrichment / 1,000
Free$4.00$4.00
Bronze$3.35$3.40
Silver$2.55$2.60
Gold$2.00$2.00
Platinum$2.00$1.90
Diamond$2.00$1.80

You are charged per comment delivered, once. A comment reached through two different inputs is billed a single time, and on a scheduled re-run with onlyNewSinceLastRun the comments you already have are neither delivered nor charged again.

Filters run before billing. minLikes, filterKeywords, onlyQuestions and excludeAuthorReplies all reduce the bill rather than filtering something you paid for.

Set maxCostUsd for a hard ceiling in dollars, or maxComments for one in rows.

Try it

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

Worked recipes

Every comment on a whole channel

Paste a handle. It sweeps the channel's video tab and returns comments from every video in one dataset.

{ "videoUrls": ["@MrBeast"], "maxVideosPerSource": 50, "maxCommentsPerVideo": 200, "maxComments": 10000 }

A whole playlist, in order

Course feedback, a conference track, a review series — one URL, every video's comments.

{ "videoUrls": ["https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"], "maxVideosPerSource": 40, "maxComments": 5000 }

Everything people say about a product

A search phrase becomes a corpus: every review and unboxing video on the topic, and every comment under them.

{ "videoUrls": ["sony wh-1000xm5 review"], "maxVideosPerSource": 15, "maxCommentsPerVideo": 200, "enrichComments": true, "emitSummary": true }

Full conversations, not a flat list

Replies come back linked to their parents, so threads rebuild exactly.

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

Watch a channel daily and pay only for new comments

Put it on a schedule with onlyNewSinceLastRun. It remembers what it already returned, so tomorrow's run delivers — and bills — only what is genuinely new.

{ "videoUrls": ["@MrBeast"], "onlyNewSinceLastRun": true, "monitorName": "mrbeast-watch", "sortBy": "newest", "maxComments": 2000 }

Only the questions viewers ask

Every question under a channel's videos, which is a content calendar and an FAQ in one run.

{ "videoUrls": ["@MrBeast"], "onlyQuestions": true, "maxVideosPerSource": 30, "maxComments": 3000 }

Only comments mentioning a word you care about

Refunds, a competitor, a bug, a feature request — filtered before billing, so you never pay for the rest.

{ "videoUrls": ["@MrBeast"], "filterKeywords": ["refund", "broken", "scam"], "maxComments": 2000 }

Score the lot and summarise it

Sentiment, keywords and question intent on every comment, plus one summary row with the split and the top phrases.

{ "videoUrls": ["@MrBeast"], "enrichComments": true, "emitSummary": true, "maxComments": 5000 }

Only the comments that got traction

Skip the noise: a like floor filters before billing, so you pay for signal only.

{ "videoUrls": ["@MrBeast"], "minLikes": 50, "maxVideosPerSource": 50, "maxComments": 2000 }

Shorts as well as long-form

A creator's whole Shorts tab, in the same shape as their regular uploads, so the two compare directly.

{ "videoUrls": ["https://www.youtube.com/@MrBeast/shorts"], "maxVideosPerSource": 40, "maxComments": 3000 }

Cap the spend, not just the rows

A hard ceiling in dollars. The run stops the moment it would exceed it.

{ "videoUrls": ["@MrBeast"], "maxComments": 100000, "maxCostUsd": 5 }

Honest limits

These are measured, and stated because a listing that hides them wastes your first run.

  • Like counts above about 1,000 are rounded by YouTube itself. There is no exact source for them. Rather than quietly present a rounded number as exact, every row carries likeCountIsApproximate, plus likeCountText with what YouTube actually rendered. Below 1,000 the count is exact, and zero is reported as a real 0.
  • Comment timestamps are relative. YouTube publishes "1 year ago", not a date. publishedAtApprox resolves that against the run clock so it sorts, but it is an approximation and is named like one.
  • The sentiment layer is a triage signal, not a verdict. It is a lexicon, it runs locally, and it is very good at sorting ten thousand comments into piles worth reading first. No accuracy figure is claimed for it, because none was measured. Do not use it as a moderation decision.
  • Commenter email addresses are not available. YouTube does not expose them. Nothing here infers them.
  • Videos with comments switched off return a free error row, not a failed run. Same for deleted videos and ones YouTube will not serve.

Not affiliated with, endorsed by, or sponsored by YouTube or Google. "YouTube" is a trademark of Google LLC and is used here only to describe what this Actor reads.

It collects publicly visible comment data only — nothing behind a login, nothing private. Comments are personal data under GDPR: you are the controller for whatever you collect, and you are responsible for having a lawful basis, honouring deletion requests and not using it to contact people who have not agreed to hear from you.

Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is vonsensey/youtube-comments-scraper; every snippet below sends {}, which runs the defaults shown on the form — replace it with your own input.

n8n

Install the Apify community node (@apify/n8n-nodes-apify under Settings → Community Nodes, or search "Apify" on n8n Cloud). Add Apify → Run Actor with Actor vonsensey/youtube-comments-scraper and your input JSON, then Apify → Get Dataset Items on the run's defaultDatasetId and pipe the rows anywhere. For scheduled runs, the On new Apify Event trigger fires when a run of this Actor finishes.

MCP (Claude, Cursor, VS Code, any MCP client)

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=vonsensey/youtube-comments-scraper",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}

Your agent then calls vonsensey/youtube-comments-scraper as a tool with the same input the form takes and reads the dataset back.

REST API (one call, rows in the response)

curl -X POST "https://api.apify.com/v2/acts/vonsensey~youtube-comments-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{}'

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/youtube-comments-scraper").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/youtube-comments-scraper').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Make, Zapier, LangChain, CrewAI

The Apify app in Make and Zapier has a Run an Actor module: pick vonsensey/youtube-comments-scraper. In LangChain and CrewAI the Apify tool wrappers take the same Actor id. A daily schedule needs nothing but the Console: Schedules → Create → this Actor → cron, and the dataset fills on its own.

Use cases

  • Read a whole channel's audience, not one video's. Paste an @handle and every comment under every video comes back in one dataset, deduplicated on YouTube's own comment id. Most comment scrapers make you feed them one video URL at a time and stitch the results yourself.
  • Find out what people really think of a product. A search phrase becomes a corpus: every review and unboxing video on the topic, and every comment underneath. Turn on scoring and the complaints, the questions and the praise separate themselves.
  • Mine the questions for content. Viewers ask the same things over and over. Filter a channel's comments to questions only and you have a content calendar and an FAQ page, written by the audience, in one run.
  • Watch a channel or a launch daily and pay only for what is new. Put it on a schedule with only-new-since-last-run and it remembers what it already returned. Tomorrow's run delivers, and bills, only genuinely new comments — so a daily watch stays cheap instead of re-buying the same thread every morning.

Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open Schedules in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per comment delivered, so a scheduled run that finds nothing new bills one video checked ($0.004) per video instead of a comment — nothing at all for a video that was private, deleted, has comments off, or failed to load.

FAQ

Do I need a YouTube account, an API key or a quota?

No. Paste a video, a channel @handle, a playlist link or a search phrase and press Run. There is nothing to register and no key to paste, and you are not spending anyone's API quota — so there is no daily unit limit to run out of.

Can it scrape comments from a whole channel or playlist at once?

Yes, and that is the main reason this suite exists. Give it a channel URL or @handle and it sweeps the channel's video tab; give it a playlist and it takes every video in the list; give it a search phrase and it takes every video the search returns. Mix as many as you like in one run.

Does it return replies, and can I rebuild the conversation?

Yes. Reply threads are expanded and every reply carries threadId and parentCommentId, so a thread rebuilds exactly. replyLevel tells you how deep it sits. Set includeReplies to false if you only want top-level comments.

Are the like counts exact?

Below about 1,000 they are exact, and a comment with no likes is reported as a real 0. Above that YouTube itself rounds them to "306K" and publishes no exact figure anywhere, so every row carries likeCountIsApproximate telling you which case you are in, plus likeCountText with exactly what YouTube rendered. Be wary of any scraper advertising exact likes — the number is not available to it either.

What am I actually charged for?

Comments you keep, once each. There is no run-start fee. Videos with comments turned off, videos that no longer exist, the per-video rows, the coverage report and every error row are all free. Filters like minimum likes, keyword matching and questions-only run before billing, so they lower the bill rather than filtering something you already paid for. A comment reached through two different inputs is charged a single time.

How good is the sentiment scoring?

It is a lexicon signal built for triage, and it is described that way deliberately. It is very good at sorting ten thousand comments into piles worth reading first, and at splitting positive from negative in bulk. It is not a moderation verdict and no accuracy figure is claimed for it, because none was measured. It runs locally, which is why it costs a fraction of a per-comment model call.

Can I get commenters' email addresses?

No, and nothing here pretends to. YouTube does not expose email addresses on comments. You get the author's display name, channel id and channel URL, which is what is genuinely public.

Can I export to CSV, JSON or Excel?

Yes. Every run writes a dataset you can export in one click from the Console, or pull from the API as JSON, CSV, XLSX or XML. Set includeVideoRows to false for a flat one-row-per-comment file that opens straight into a spreadsheet.


Something wrong, or a field you need that is missing? Open an issue on the Issues tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.