# YouTube Comments Scraper — Replies & Authors (`chronometrica/youtube-comments-scraper`) Actor

Collect clean YouTube comment and reply rows from public videos and Shorts. Get linked parent/reply IDs, text, authors, likes, pins, creator hearts, and CSV/JSON exports. No YouTube API key, account, cookies, or compute fees. Pay only for saved comments and replies.

- **URL**: https://apify.com/chronometrica/youtube-comments-scraper.md
- **Developed by:** [Chronometrica](https://apify.com/chronometrica) (community)
- **Categories:** Social media, Agents, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 youtube comment or replies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 💬 YouTube Comments Scraper — Replies & Authors

### 💬 What does YouTube Comments Scraper do?

YouTube Comments Scraper collects public comments and replies from known
YouTube videos and Shorts. Add video URLs or IDs and get clean, linked rows
with comment text, stable IDs, author details, likes, pins, creator hearts, and
reply relationships.

Skip manual copy-and-paste. Add the video URLs you already have, choose a clear
comment limit, and export organized rows for analysis. Results are saved as
they are collected, so useful rows remain available if a later video cannot be
completed.

Use it for audience research, customer feedback, brand monitoring, creator
research, social listening, comment analysis, spreadsheets, and automated data
pipelines.

With YouTube Comments Scraper, you can:

- 💬 Collect public top-level comments from videos and Shorts.
- 🧵 Save public replies as separate rows linked to their parent comments.
- 🆔 Export stable video, comment, parent-comment, and author IDs.
- ❤️ Capture public likes, pins, creator hearts, and creator replies.
- 🔀 Choose Top comments, Newest comments, or a wider sample of both.
- 📦 Download results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- ⚙️ Run through the Apify API, SDKs, webhooks, schedules, and integrations.

Each paid result is one public comment or reply saved to the default dataset.
Inputs that are invalid, unavailable, comments-disabled, or return no public
comments do not create paid result rows.

This Actor uses logged-out public YouTube data. It does not need a YouTube API
key, account, cookies, or copied browser session from you. It does not access
private videos, private comments, YouTube Studio, live chat, or chat replay.

### ✨ What You Get

Each dataset row represents one public YouTube comment or reply.

| Data group         | Example fields                                                      |
| ------------------ | ------------------------------------------------------------------- |
| 🎬 Video identity  | `inputUrl`, `videoUrl`, `videoId`                                   |
| 💬 Comment content | `commentId`, `text`, `publishedTimeText`, `isEdited`                |
| 🧵 Thread links    | `parentCommentId`, `isReply`, `replyDepth`, `replyCount`            |
| 👤 Author details  | `authorChannelId`, `authorHandle`, `authorDisplayName`, `authorUrl` |
| ❤️ Public signals  | `likesCount`, `isPinned`, `isHeartedByCreator`, `isChannelOwner`    |
| 🧭 Row context     | `commentIndex`, `replyIndex`, `sortMode`, `status`, `scrapedAt`     |

Public values that YouTube does not expose stay `null`. They are not guessed
and they are not replaced with fake zeroes.

### ⚙️ Can I use this Actor through an API?

Yes. You can run YouTube Comments Scraper manually in Apify Console or use it
through:

- 🔌 Apify API
- 🐍 Python SDK
- 🟢 Node.js SDK
- 🪝 Webhooks
- ⏰ Scheduled runs
- 🧩 Apify integrations

This makes it easy to send comments into spreadsheets, databases, dashboards,
AI analysis tools, customer-feedback systems, and research pipelines.

### 🎯 Why collect YouTube comments?

YouTube comments contain direct public feedback from viewers. They can help
you understand what people like, dislike, ask for, repeat, or misunderstand.

| Use case                  | How comment data helps                                              |
| ------------------------- | ------------------------------------------------------------------- |
| 🔍 Audience research      | Find common questions, opinions, needs, and language.               |
| 📣 Brand monitoring       | Track public feedback around products, launches, and campaigns.     |
| 🧑‍🎨 Creator research       | Study audience response, creator replies, pins, and hearts.         |
| 💡 Content planning       | Find ideas, objections, follow-up topics, and recurring questions.  |
| 🤖 Sentiment and NLP      | Feed clean comment text into your own analysis workflow.            |
| 🧱 Data pipeline building | Load stable comment and reply rows into databases and applications. |

The Actor is focused on data collection. It gives you clean comment text and
thread links that you can send to your own sentiment, language, topic, or
question-analysis workflow.

### 💵 Pricing

YouTube Comments Scraper uses pay-per-result pricing. One result means one
public comment or reply saved to the default dataset. Platform usage is
included.

| Apify plan | Price per 1,000 saved rows |
| ---------- | -------------------------: |
| Free       |                      $0.50 |
| Starter    |                      $0.45 |
| Scale      |                      $0.40 |
| Business   |                      $0.35 |

Use `maxCommentsPerVideo`, `includeReplies`, and `maxRepliesPerComment` to
control result volume before a run. Replies are separate paid rows. Start with
10 to 25 top-level comments while testing a new video.

### 🚀 How do I use YouTube Comments Scraper?

1. Create or log in to your Apify account.
2. Open **YouTube Comments Scraper**.
3. Add one or more public YouTube video URLs, Shorts URLs, or video IDs.
4. Choose the maximum top-level comments to save from each video.
5. Choose Top, Newest, or Top + Newest comment order.
6. Turn on replies only when you need them.
7. Click **Start**.
8. Open the **Output** tab to inspect the dataset and run summary.
9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ⬇️ Input

The main input is `startUrls`. Add between 1 and 100 known public YouTube
videos or Shorts.

```json
{
  "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
  "maxCommentsPerVideo": 25,
  "commentSortMode": "top",
  "includeReplies": false
}
```

To collect replies too:

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://www.youtube.com/shorts/Q217U36FOUQ"
  ],
  "maxCommentsPerVideo": 100,
  "commentSortMode": "both",
  "includeReplies": true,
  "maxRepliesPerComment": 20
}
```

#### 🔗 Supported inputs

- 🎬 Regular watch URLs
- 📱 YouTube Shorts URLs
- 🔗 `youtu.be` share URLs
- 🖼️ Embed URLs
- 🔴 Live video URLs with public comments
- 🆔 Raw 11-character YouTube video IDs

Equivalent inputs for the same video are collected once in a run.

#### 🎛️ Settings

| Setting                | What it controls                                                                                                                            |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`            | One to 100 direct YouTube video or Shorts URLs, or 11-character video IDs.                                                                  |
| `maxCommentsPerVideo`  | Saves 1–1,000 unique top-level comments from each video. If blank, the Actor uses 100. Replies do not count toward this limit.              |
| `commentSortMode`      | `top` collects featured comments, `newest` collects recent comments, and `both` splits the cap across both lists and removes duplicate IDs. |
| `includeReplies`       | Saves public replies as separate rows. Off by default for a more predictable result count.                                                  |
| `maxRepliesPerComment` | Saves 1–100 replies under each saved top-level comment. If blank, the Actor uses 20. Used only when replies are on.                         |

Top + Newest gives a wider sample. It does not guarantee every public comment
on the video.

### ⬆️ Output sample

Results are stored in the default dataset. The field order is stable for JSON,
CSV, spreadsheet, API, and database workflows.

```json
{
  "inputIndex": 0,
  "inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "platform": "youtube",
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "videoId": "dQw4w9WgXcQ",
  "commentId": "UgxExamplePublicCommentId",
  "parentCommentId": null,
  "isReply": false,
  "replyDepth": 0,
  "commentIndex": 0,
  "replyIndex": null,
  "sortMode": "top",
  "text": "This video never gets old.",
  "publishedTimeText": "2 days ago",
  "publishedAt": null,
  "updatedAt": null,
  "likesCount": 12,
  "likesCountText": "12",
  "likesCountPrecision": "exact",
  "replyCount": 3,
  "authorChannelId": "UCExamplePublicChannelId",
  "authorHandle": "@examplecreator",
  "authorDisplayName": "Example Creator",
  "authorUrl": "https://www.youtube.com/@examplecreator",
  "authorThumbnailUrl": "https://yt3.ggpht.com/example",
  "isEdited": false,
  "isPinned": false,
  "isHeartedByCreator": true,
  "isChannelOwner": false,
  "status": "ok",
  "scrapedAt": "2026-07-12T00:00:00.000Z"
}
```

#### 🧵 Comment and reply relationships

Top-level comments have `isReply: false` and `parentCommentId: null`.

Replies have `isReply: true` and a `parentCommentId` that points to their
saved top-level comment. Replies are only saved when their parent comment is
also in the dataset.

`commentIndex` and `replyIndex` show collection order. They are not permanent
YouTube ranks.

`commentId` is the stable ID for the saved comment or reply.
`parentCommentId` is the stable ID of the top-level comment above a reply. Use
both fields to rebuild the comment threads saved in your dataset.

#### 📊 Run summary

The `OUTPUT` record includes:

- 🎯 Inputs received and unique videos attempted;
- 🪞 Duplicate video inputs skipped;
- 🎬 Videos that produced rows;
- 💬 Top-level comments and replies saved;
- 🚦 Input status and stop-reason counts;
- 🧯 Safe details for inputs that did not produce rows;
- 🔄 Request, retry, and recovery totals.

Comments-disabled, unavailable, login-required, invalid, and
no-public-comment inputs do not create dataset rows. The run summary explains
their status.

### 🎯 Comment order, status, and precision

`sortMode` records whether a row came from the public Top or Newest comment
order. YouTube can change either order between runs.

Every saved row has `status: "ok"`. Input-level problems are reported in the
run summary because they do not create paid rows.

`likesCountPrecision` explains whether the public like count is exact,
display-rounded, or unavailable. Use `likesCountText` when you also want the
public display value.

### 🔒 Source boundary

YouTube Comments Scraper uses logged-out public YouTube data only.

It does not use:

- a YouTube API key supplied by you;
- user cookies or copied sessions;
- logged-in account automation;
- private videos or private comments;
- YouTube Studio analytics;
- challenge solving;
- live chat or chat replay;
- video or audio downloads.

### ⚠️ Limits and interpretation

- Top and Newest are public comment samples, not a promise of every comment.
- YouTube can delete, hide, hold, reorder, or limit comments at any time.
- Comment availability can differ by region and logged-out viewer state.
- Likes, reply counts, pins, hearts, author details, and visible replies can
  change between runs.
- Exact publish timestamps are not always public. In those cases,
  `publishedAt` stays `null` and `publishedTimeText` keeps the visible label.
- A requested cap is a maximum, not a guarantee. The public comment list can
  run out first.
- This Actor collects comments from known videos. It does not search channels,
  playlists, or keywords for videos.

### ❓ FAQ

#### Does this Actor need a YouTube API key, account, or cookies?

No. You do not need to provide a YouTube API key, account, cookies, or browser
session.

#### Does this Actor collect every comment on a video?

No. It collects from the public Top, Newest, or combined comment samples that
YouTube makes available during the run. Deleted, hidden, held, regional, and
account-only comments may not be available.

#### Are replies separate results?

Yes. Each saved reply is its own dataset row and its own paid result. Use
`includeReplies` and `maxRepliesPerComment` to control reply volume.

#### How are duplicates handled?

Equivalent video inputs are collected once. Comment and reply rows are
deduplicated by stable `commentId` within the run.

#### Why did I receive fewer rows than requested?

The video may expose fewer public comments, comments may be disabled, the
video may be unavailable, or the selected public order may end before the cap.
Check the `OUTPUT` record for the input status and stop reason.

#### How long does a run take?

Runtime grows with the number of videos, the top-level comment limit, replies,
and the selected comment order. Replies and Top + Newest require more work than
top-level Top comments alone. Start with 10 to 25 comments while testing a new
video. Rows are saved as they are collected.

#### What do `commentId` and `parentCommentId` mean?

`commentId` identifies the saved comment or reply. For a reply,
`parentCommentId` identifies its saved top-level comment. Use these IDs to
rebuild the thread without guessing from names or text.

#### Does this Actor collect live chat or chat replay?

No. Live chat and chat replay are outside this Actor's scope.

### 🛟 Support

For help, include the run ID, one input URL or video ID, the result you
expected, and the observed dataset or `OUTPUT` status. Do not send cookies,
account data, or private YouTube links.

### 🔗 Related social media scrapers

Combine this Actor with our other social media scrapers for discovery,
performance tracking, comment research, and transcript collection.

#### YouTube

- [YouTube Search Scraper](https://apify.com/chronometrica/youtube-search-scraper)
  — find public videos, Shorts, channels, and metrics by keyword.
- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)
  — collect public video, Short, channel, and engagement metrics.
- [YouTube Transcript Scraper](https://apify.com/chronometrica/youtube-transcript-scraper)
  — extract public captions as clean text, timestamps, SRT, VTT, or LLM-ready
  output.

#### Facebook

- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)
  — collect public post, Reel, video, and profile/page metrics.
- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)
  — collect public comments, replies, authors, dates, and reactions from known
  Facebook content.

#### Instagram

- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)
  — collect public post, Reel, carousel, profile, and collaboration metrics.
- [Instagram Comments Scraper](https://apify.com/chronometrica/instagram-comments-scraper)
  — collect public comments, authors, dates, likes, and reply counts from posts
  and Reels.

#### TikTok

- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)
  — find public TikTok videos, creators, and metrics by keyword.
- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)
  — collect public video, profile, engagement, hashtag, and music data.
- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)
  — collect public comments, replies, authors, likes, and thread links.
- [TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper)
  — extract public caption text and timestamped segments from TikTok videos.

# Actor input Schema

## `startUrls` (type: `array`):

Add direct watch, Shorts, live, embed, youtu.be URLs, or 11-character video IDs.

## `maxCommentsPerVideo` (type: `integer`):

Save up to this many unique top-level comments from each video (1-1,000). If left blank, the Actor uses 100. Replies do not count toward this limit.

## `commentSortMode` (type: `string`):

Top follows featured comments. Newest follows recent comments. Top + Newest splits the row cap between both lists and removes duplicate comment IDs. It does not guarantee every comment.

## `includeReplies` (type: `boolean`):

Save public replies as separate rows. Leave this off for the most predictable result size.

## `maxRepliesPerComment` (type: `integer`):

Save up to this many replies under each top-level comment (1-100). If left blank, the Actor uses 20. Used only when Include replies is on.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 100,
  "commentSortMode": "top",
  "includeReplies": false,
  "maxRepliesPerComment": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `output` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/youtube-comments-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/youtube-comments-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ]
}' |
apify call chronometrica/youtube-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=chronometrica/youtube-comments-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/kQ1yfQhrLc9mI4do6/builds/dFXd2OfvMuHWauyqF/openapi.json
