YouTube Comments Scraper - Replies, Likes & Authors
Pricing
Pay per event
YouTube Comments Scraper - Replies, Likes & Authors
Read the room under any YouTube video. Pull every comment AND its replies with text, like count, reply count, publish time, author name, channel ID, verified badge and avatar, plus the video's own stats. $0.40 per 1,000 comments plus a $0.001 run-start fee, flat on every Apify plan.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
⚡ YouTube Comments Scraper — Every Comment, No Login, No API Key
Pull comments from any YouTube video without a login, API key, cookies, or quota. Paste watch URLs (or bare video IDs) and get back every comment — text, like count, reply count, author, verified status, timestamp and more. Export to JSON, CSV or Excel, call it from the API, or have results delivered straight to Notion. $0.40 per 1,000 comments plus a $0.001 run-start fee, billed per comment actually returned — the cheapest YouTube comment scraper on the market.
No Google account. No OAuth. No Data API key to register. No daily quota. Paste a video link and run.
Why this scraper wins
- 💸 Cheapest on the market — $0.40 per 1,000 comments, the same rate on every Apify plan. No volume tiers, no plan gates, no minimum spend.
- 🔓 Keyless & login-free — no Google sign-in, no OAuth, no YouTube Data API key, and none of the API's 10,000-unit daily quota.
- 🧹 Clean, flat records — one tidy object per comment, ready for sheets, sentiment analysis, dashboards or LLM pipelines. No nested renderer blobs to unwrap.
- 🧵 Replies included — reply-level comments come back alongside top-level ones, each flagged with
isReply, and every comment carries its ownreplyCount. - 📬 Built-in Notion delivery — push every run into Notion via Apify connectors, zero extra code.
- 🚦 Honest errors — a clear diagnostic row (
NO_RESULTS,BLOCKED,RATE_LIMITED,SERVER_ERROR,NETWORK) when a video has comments disabled or YouTube throttles, instead of silent emptiness. Diagnostic rows are never charged. - 🔁 Retries built in — transient 429s and 5xx responses are retried with exponential backoff and rotated request fingerprints before anything is reported as a failure.
What you can scrape
| Input | Accepts | Returns |
|---|---|---|
| Video URLs | https://www.youtube.com/watch?v=..., youtu.be/..., /shorts/... | Comments on each video |
| Video IDs | bare 11-char IDs (e.g. dQw4w9WgXcQ) | Comments on each video |
You can mix multiple videos in one run; maxComments is split fairly across them, so one very chatty video cannot eat the whole budget while the others return nothing.
Input
videoUrls— YouTube watch / Shorts /youtu.beURLs to scrape comments from. A video ID is extracted from any of those shapes, so query strings, timestamps and playlist parameters in the URL are harmless.videoIds— or bare 11-character video IDs. Mix both fields freely; duplicates across the two lists are de-duplicated before the run starts.maxComments— total comments to pull across all videos (default100, max10000). You pay per comment, so this is your budget cap.proxyConfiguration— Apify Proxy; rotating datacenter addresses are plenty for YouTube and are preconfigured. You can also supply your own proxy URLs.notionConnector/notionParentId— optional Notion delivery (connector ID + data-source ID).
Example input
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/9bZkp7q19f0"],"videoIds": ["kJQP7kiw5Fk"],"maxComments": 600,"proxyConfiguration": { "useApifyProxy": true }}
That run pulls up to 600 comments spread across the three videos and stops as soon as the budget is reached.
Output (one record per comment)
{"ok": true,"type": "comment","id": "UgxKREWxIgDrw8w2e_Z4AaABAg","videoId": "dQw4w9WgXcQ","text": "Never gonna give this song up 🎶","publishedTime": "2 weeks ago","likeCount": "1.2K","replyCount": "34","isReply": false,"author": "@musicfan","authorChannelId": "UCabc123...","authorIsVerified": false,"authorAvatar": "https://yt3.ggpht.com/...=s48"}
Field reference
| Field | Type | Notes |
|---|---|---|
ok | boolean | true on data rows, false on diagnostic rows — filter on it |
type | string | always comment |
id | string | YouTube's own comment ID; stable, use it to de-duplicate across runs |
videoId | string | the 11-char video the comment belongs to |
text | string | full comment body, emoji preserved, newlines intact |
publishedTime | string | relative, as YouTube shows it ("2 weeks ago") |
likeCount | string | as displayed, abbreviated for large numbers ("1.2K") |
replyCount | string | number of replies on the thread, as displayed |
isReply | boolean | true for reply-level comments |
author | string | display name / handle |
authorChannelId | string | UC… channel ID, for joining to channel data |
authorIsVerified | boolean | verified badge on the author's channel |
authorAvatar | string | avatar image URL |
Diagnostic rows use a different shape: { "ok": false, "errorCode": "NO_RESULTS", "error": "…human-readable explanation…", "videoId": "…" }. They exist so a run tells you why a video came back empty. They are free.
Calling it from the API
curl -X POST "https://api.apify.com/v2/acts/Dami_Studio~youtube-comments-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"videoUrls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"maxComments":200}'
The response is the dataset itself — a JSON array of the comment records above. Add &format=csv for CSV. The input field names follow the conventions used across similar Actors, so switching from another comment scraper is usually a drop-in change to the token and the Actor path.
What people build with it
- Sentiment and audience research — pull thousands of comments across a channel's videos and run them through a classifier to see what an audience actually reacts to.
- Creator competitive analysis — measure engagement depth (replies per comment, verified-author participation) instead of just view counts.
- Product feedback mining — review, unboxing and tutorial videos are full of specific complaints and feature requests that never reach a support inbox.
- Community moderation snapshots — export a video's comments before and after a moderation pass to see what changed.
- LLM/RAG corpora — flat one-object-per-comment records drop straight into an embedding pipeline without any reshaping.
Pricing
$0.40 per 1,000 comments ($0.0004 each), plus $0.001 each time a run starts. Flat on every Apify plan — this is the cheapest rate on the market for YouTube comments, and it does not change with volume, plan tier or account age.
| What | Price |
|---|---|
| Comment returned | $0.0004 (= $0.40 per 1,000) |
| Run start | $0.001 per run |
| Diagnostic / error rows | free |
You are charged only for comments actually returned. A video with comments disabled, a blocked run, or a run that finds nothing costs nothing beyond the $0.001 start fee. maxComments is a hard ceiling, so a run can never bill more than maxComments × $0.0004 + $0.001.
Worked example: 5,000 comments = 5,000 × $0.0004 + $0.001 = $2.001.
Limitations — read these before you buy
Stated plainly, because they decide whether this Actor fits your job:
- Comment order is YouTube's default ranking ("Top comments"), not chronological. There is no newest-first switch, so a
maxCommentscap gives you the most-engaged comments rather than the most recent ones. publishedTimeis relative, not an exact timestamp. YouTube itself only exposes"2 weeks ago"-style strings on this surface. If you need absolute dates you must anchor them to the run date yourself.likeCountandreplyCountare display strings, not integers — large values are abbreviated ("1.2K","3.4M"). Parse them if you need arithmetic.- Not every reply thread is expanded. Reply-level comments are returned as they appear in the comment stream and flagged with
isReply, but a thread with 500 replies will not return all 500. UsereplyCountto know how many exist. - Members-only, age-restricted, private and region-locked videos return a diagnostic row instead of comments — those surfaces need a signed-in account, which this Actor deliberately never uses.
- Videos with comments disabled return a
NO_RESULTSdiagnostic row. That is the video's setting, not a scraper failure. - No hearts, pins or timestamps-in-thread. Creator-hearted, pinned, and "highlighted" flags are not returned.
- No edit history and no deleted comments. You get what is publicly visible at run time.
- Hard cap of 10,000 comments per run. For more, split the videos across several runs — this cap is a cost guard, not a technical wall.
- Heavy sustained volume can be throttled by YouTube. The Actor backs off and retries, then reports
RATE_LIMITEDhonestly rather than returning a half-empty dataset with no explanation.
FAQ
Do I need a YouTube or Google account? No. Public videos' comments are scraped keyless — no login, OAuth, or Data API key, and nothing is ever signed in on your behalf.
How is this different from the official YouTube Data API? The Data API requires a registered key and burns a tight 10,000-unit daily quota that a single busy video can exhaust. This Actor needs neither and pulls comments far past those limits for a flat per-comment price.
Are replies included? Yes. Both top-level comments and replies are returned, each marked with isReply. See the limitation above on very large threads.
Can I scrape several videos in one run? Yes — pass any mix of videoUrls and videoIds. The maxComments budget is divided fairly between them.
A video returned a NO_RESULTS row — why? That video has comments disabled, is unavailable in the proxy's region, or requires a sign-in. The Actor tells you exactly what happened instead of failing silently, and does not charge you for it.
Do I pay for failed runs? Only the $0.001 start fee. Diagnostic rows are never billed.
Can I deliver straight to Notion? Yes — supply a notionConnector ID and notionParentId and every comment is pushed to your Notion data source automatically.
Can I schedule it? Yes. Use Apify Schedules to re-run the same input daily or hourly; de-duplicate across runs on the comment id, which is stable.
Which proxy should I use? The default rotating datacenter addresses are enough for YouTube. You can supply your own proxy URLs if you need a specific region.