How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://www.youtube.com/watch?v=aqz-KE-bpKQin YouTube video URLs or IDs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
YouTube Comments Scraper gets public comments and replies from YouTube videos. Add video URLs or IDs, choose Top or Newest order, and export one row for each saved comment or reply as JSON, CSV, or Excel. No YouTube login or API key is needed.
Good for
- Read feedback on a known public video or a small set of videos.
- Export comment text, likes, public author fields, and reply links.
- Match repeated exports by stable comment IDs in your own system.
Who uses it
YouTube creators
Read viewer feedback from many videos in one table.
Brand managers
See what people say under product review videos.
Researchers
Study a discussion by grouping replies under each comment.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Stored comment or reply | $0.0008 | Charged once after one unique comment or reply is saved to the Dataset. |
| Start fee | $0.05 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One comment: about $0.05.
- 1,000 comments: about $0.85.
- Every day 100 comments, for 30 days: about $3.90 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 5,800 comments.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Does it work with Shorts?
Yes. Shorts links, watch links and video IDs work.
Can I get live chat messages?
No. Live video links give comments, not live chat.
Do I need a Google API key?
No. It does not use the YouTube Data API or any key.
Is this an official YouTube or Google tool?
No. It is an independent Actor and is not made, approved, or sponsored by YouTube or Google.
Does it use the official YouTube Data API?
No. It reads the public website's InnerTube comments surface through YouTube.js. That interface is not a public supported API and can change.
Does this YouTube comment scraper need an API key?
No. It does not accept a Google API key, OAuth token, YouTube account, or cookies. For a separate official API client, Google documents commentThreads.list; that API is not this Actor's source.
Can I export comments from multiple videos, including Shorts?
Yes. Use up to 50 supported public video URLs or IDs. Duplicate videos are processed once. Live video URLs refer to comments, not live chat.
Can I download YouTube comments as CSV or Excel?
Yes. Open the results table and choose JSON, CSV, or Excel. Each saved comment or reply is one row. JSON preserves the complete nested shape.
Can it get every comment or recover deleted comments?
No. It gets the public comments visible during the run and inside your limits. It cannot recover deleted, hidden, held, private, or member-only comments.
Are replies included?
Only when includeReplies=true and maxRepliesPerComment>0. Leave room in maxComments by choosing a smaller per-video top-level cap. Every saved reply counts toward the total and price.
Details
Step by step on Apify
- Open Input. A new form suggests a public Blender video in
startUrls. - Keep that example or add your public video URL or ID.
- Keep
sort=TOP,maxComments=100, andincludeReplies=falsefor a first run. - Click Start. Set a maximum charge in Run options when needed.
- Open Comments and replies. Check
videoId,text, andisReply. - Open Run summary to check the result and stop reason for each video.
Use cases
| Task | Input choice | Key fields | Next step |
|---|---|---|---|
| Read feedback | One video, TOP, small maxComments | text, likeCount, videoId | Export a table for review |
| Read recent comments | sort=NEWEST | publishedTimeText, topLevelPosition | Check the displayed source order |
| Study a discussion | Replies on, smaller top-level cap | isReply, parentCommentId, threadId | Group rows by parent |
| Match repeat exports | Same video in later runs | id, recordKey, retrievedAt | Deduplicate in your own system |
Tips for better results
- Choose Newest order to read fresh comments first.
- Set a total row limit to control cost.
- Use comment IDs to remove duplicates between exports.
Recent updates
Update · 8 October 2026
- Recognize an explicit zero-comments header instead of failing with an ambiguous empty result. A challenge or contradictory comment renderer cannot become zero.
- Show the top-level per-video cap and explain how to leave space for optional replies; preserve every API default and output field.
- Respect a shorter platform timeout, bound source requests and backoff to the deadline reserve, and keep the existing internal ceiling for longer timeouts.
Version 0.1.0 · 2 September 2026
- Select Direct below 4,000 requested results and Residential US for larger limits automatically; hide low-level request, time, concurrency, and proxy controls from the visual Input form.
- Repair an enabled empty proxy-group selection to Residential US instead of failing before the first request.
- Isolate sticky Residential sessions between Actor runs and rotate the session after transient connection failures as well as blocked responses.
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"itemType": "comment",
"videoId": "aqz-KE-bpKQ",
"videoUrl": "https://www.youtube.com/watch?v=aqz-KE-bpKQ",
"isReply": false,
"parentCommentId": null,
"likeCount": 1900,
"publishedAt": null,
"sort": "TOP",
"topLevelPosition": 1,
"replyPosition": null,
"retrievedAt": "2026-10-08T09:17:19.761Z",
"source": "youtube-innertube"
}Use it from code
Actor ID: cliqtomedia/youtube-comments-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/youtube-comments-scraper").call(run_input={
"startUrls": [
"https://www.youtube.com/watch?v=aqz-KE-bpKQ"
],
"sort": "TOP"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~youtube-comments-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://www.youtube.com/watch?v=aqz-KE-bpKQ"], "sort": "TOP"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/youtube-comments-scraper")
result = tool.invoke({"run_input": {"startUrls": ["https://www.youtube.com/watch?v=aqz-KE-bpKQ"], "sort": "TOP"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (22)
| Field | Type | Meaning |
|---|---|---|
itemType | string | The result type. This Actor saves comment rows only. |
id | string | The comment ID provided by the source. |
recordKey | string | A stable key used to prevent duplicate saves and charges in one run. |
videoId | string | The 11-character YouTube video ID. |
videoUrl | string | The standard YouTube watch URL for the video. |
threadId | string | The top-level comment ID that starts this comment thread. |
isReply | boolean | True for a reply row. |
parentCommentId | string | The parent comment ID for a reply. It is null for a top-level comment. |
text | string | The public comment text shown by the source during this run. |
likeCount | integer | The like count seen during this run. It is null when the value is not clear. |
author | object | Public author details when available. No avatar or added profile data is included. |
isPinned | boolean | Whether the comment is pinned. It is null when the source does not make this clear. |
isHearted | boolean | Whether the creator hearted the comment. It is null when the source does not make this clear. |
authorIsCreator | boolean | Whether the author is the video creator. It is null when this is not clear. |
isEdited | boolean | Whether the source shows an edited label. It is null when this is not clear. |
publishedTimeText | string | The display time shown by the source, for example 2 hours ago. It may be relative or translated. |
publishedAt | null | Always null because the source does not provide a proven exact posting time. |
sort | string | The comment order selected for this run. |
topLevelPosition | integer | The top-level comment position seen in this run, starting at 1. |
replyPosition | integer | The reply position under its parent comment, starting at 1. It is null for a top-level comment. |
retrievedAt | string | The UTC time when the Actor saved this result. |
source | string | The technical name of the public YouTube website data source used by the Actor. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| YouTube video URLs or IDs required | startUrls | array | ["https://www.youtube.com/watch?v=aqz-KE-bpKQ"] |
| Sort order | sort | string | "TOP" |
| Maximum total results | maxComments | integer | 100 |
| Top-level comments for each video | maxTopLevelCommentsPerVideo | integer | 10000 |
| Include replies | includeReplies | boolean | false |
| Replies for each top-level comment | maxRepliesPerComment | integer | 50 |
| Maximum requests for each video | maxRequestsPerVideo | integer | 600 |
| Maximum requests for the run | maxTotalRequests | integer | 2000 |
| Videos processed at once | concurrency | integer | 1 |
| Maximum run time | maxRunSeconds | integer | 1800 |
| Connection settings | proxyConfiguration | object |
Use cases with this tool
Each guide shows all the steps and the other tools.