# YouTube Comments Scraper & New-Comment Monitor — No API Key (`slothtechlabs/youtube-comments-scraper-monitor`) Actor

Scrape any YouTube video or channel's comments — author, text, likes, replies, timestamps & avatars — or run monitor mode to get ONLY the new comments since the last run (never re-pay for old ones). Reply threads, pinned/hearted flags, no API key, no quota. Pay-per-use, first run free.

- **URL**: https://apify.com/slothtechlabs/youtube-comments-scraper-monitor.md
- **Developed by:** [SlothTechLabs](https://apify.com/slothtechlabs) (community)
- **Categories:** Automation, SEO tools, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 comment delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Comments Scraper & New-Comment Monitor — No API Key

> **Watch any YouTube video or channel and get only the comments posted since your last run — never re-pay for old comments again.** Or bulk-export a whole comment section in one go. **No API key, no quota, no browser.** Your first run on each video is a **free baseline**.

Scrape **YouTube comments** into a flat, spreadsheet-ready row per comment — author, text, likes, replies, pinned/hearted flags, timestamps, avatar and a deep link to each comment. In **monitor mode**, every scheduled run returns **only the new comments since the last run**, per video, so the same comment is never delivered (or billed) twice. Point it at videos or whole channels, run it on a schedule, and turn a comment section into a live feed — no API key, no quota, no subscription.

### ✨ What does this Actor do?

| Feature                                 | Details                                                                                                                                                               |
| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 🔔 **Monitor mode**                     | Each scheduled run returns **only the comments new since the last run**, per video — no duplicates, no re-paying for old data. First run per video is a free baseline |
| 📦 **Bulk mode**                        | One-off export of a video's comment section, sorted by **Top** or **Newest**                                                                                          |
| 📡 **Channel watching**                 | Paste `@handles` or channel URLs — each channel's latest uploads are found automatically and their comments scraped/monitored                                         |
| 💬 **Reply threads**                    | Optionally expand replies (in monitor mode, only for new comments — keeps cost down)                                                                                  |
| 🏷️ **Rich comment fields**              | Like & reply counts, 📌 pinned flag, ❤️ hearted-by-creator flag, channel-owner / verified / artist author flags, avatar, and a deep link to each comment              |
| 🧵 **Thread reconstruction**            | Every reply carries its `parentCommentId`, so you can rebuild full conversation threads                                                                               |
| 🔑 **No API key, no login, no browser** | No quota to manage and no accounts to connect — just clean, structured comment rows                                                                                   |

#### ⚡ Zero-config start

Just click **Start**. The prefilled input runs a **bulk** scrape of a sample video so your first dataset has comment rows in seconds. When you're ready to track a video or niche, switch `mode` to `monitor`, add your videos or channels, and put it on a schedule — see the [3 steps](#-how-to-use--first-run-in-3-steps) below.

### 💰 Why use this instead of…?

| Option                    | Cost                                       |       New-comments-only feed?       | No quota wall? |
| ------------------------- | ------------------------------------------ | :---------------------------------: | :------------: |
| YouTube Data API v3       | Free, but **quota-capped** then blocked    |                 ❌                  |       ❌       |
| One-shot comment scrapers | **Re-scrape the whole thread every run**   |                 ❌                  |       ✅       |
| **This Actor**            | **Pay-per-use — first run per video free** | ✅ (monitor mode, raw rows you own) |       ✅       |

To "watch" a video with a snapshot scraper you must re-scrape the entire comment section every run and de-duplicate it yourself. This Actor delivers only the genuinely new comments, so a busy video costs pennies to monitor — and you still get a full bulk export whenever you want one.

### 🎯 Use cases

- 🔔 **Community & brand managers** — monitor your channel's latest uploads for new comments daily (auto-discovered from your `@handle`); get on top of questions and complaints the day they land.
- 🎁 **Giveaway & contest runners** — collect every new entry comment as it arrives, with author and timestamp, without re-pulling the whole thread each time.
- 📊 **Creator analysts** — bulk-export a video's comment section for sentiment/topic analysis, or track sentiment over time with a daily monitor.
- 🏢 **Agencies** — watch many client videos for new comments in a single run, exported straight to Sheets or a webhook.
- 🤖 **Data & AI teams** — feed only fresh comments into your pipeline each run (no de-duplication code on your side), with structured author and engagement fields ready to embed.

### 📖 How to use — first run in 3 steps

1. **Click Start** — the prefill (a bulk scrape of a sample video) is safe and completes in seconds.
2. **Open the Dataset tab** — one flat row per comment. Export as **CSV / JSON / Excel**, or open in Google Sheets.
3. **Turn it into a monitor** — set `mode` to `monitor`, add your own videos or channels, **Save as Task**, and add a daily [Schedule](https://docs.apify.com/platform/schedules). The first run per video is a free baseline; from the next run on, only genuinely new comments arrive.

### 🧾 Input

The form is built to be tried in seconds: paste video URLs and click Start. Everything else is optional.

**What to scrape**

| Field       | Type             | Required | Description                                                                           |
| ----------- | ---------------- | :------: | ------------------------------------------------------------------------------------- |
| `videoUrls` | array of strings |    ✅    | YouTube video URLs, one per line — watch, Shorts, `youtu.be`, and live links all work |

**Options**

| Field                  | Type                | Default   | Description                                                                                                                              |
| ---------------------- | ------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `mode`                 | `monitor` | `bulk` | `monitor` | `monitor` = only comments new since the last run · `bulk` = export the comment section (the one-click sample run is prefilled to `bulk`) |
| `sort`                 | `top` | `newest`   | `top`     | Order for bulk scraping — Top comments or Newest first                                                                                   |
| `maxCommentsPerVideo`  | integer             | `100`     | Cap on top-level comments per video. In monitor mode this is a ceiling per run                                                           |
| `includeReplies`       | boolean             | `false`   | Also fetch reply threads (in monitor mode, only for new comments)                                                                        |
| `maxRepliesPerComment` | integer             | `100`     | Cap on replies fetched per comment (only when replies are on)                                                                            |

**Monitor whole channels (optional)**

| Field                 | Type             | Default | Description                                                                                                                                                                            |
| --------------------- | ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `channelUrls`         | array of strings | —       | Optional — watch whole channels instead of (or in addition to) specific videos; their latest uploads are found automatically and scraped/monitored. Accepts channel URLs or `@handles` |
| `maxVideosPerChannel` | integer          | `3`     | Latest videos per channel to scrape/monitor                                                                                                                                            |

**Advanced**

| Field                | Type   | Default          | Description                                                      |
| -------------------- | ------ | ---------------- | ---------------------------------------------------------------- |
| `proxyConfiguration` | object | Apify datacenter | Uses Apify's datacenter proxy by default — no extra setup needed |

> **Advanced (API only):** the filters `commentTextFilter` (deliver only comments containing a phrase), `onlyChannelOwner` (only the creator's own comments), and `minLikeCount` (a like threshold) are still honored if you pass them in JSON input — they narrow delivery (and your bill) to just the comments you care about. They're hidden from the Console form to keep the first run simple.

#### Example input — daily monitor of a video + a channel

```json
{
    "videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],
    "channelUrls": ["@mkbhd"],
    "maxVideosPerChannel": 3,
    "mode": "monitor",
    "maxCommentsPerVideo": 100,
    "includeReplies": false,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

Schedule that daily and each run returns just the new comments across that video plus MKBHD's three latest uploads.

### 📊 Output

One flat row per comment — perfect for spreadsheets, pivots, and pipelines. Each row reads like a YouTube comment — **avatar, author, then the comment** — so a comments spreadsheet is scannable at a glance.

| Field                  | Type            | Description                                                                    | Example                                         |
| ---------------------- | --------------- | ------------------------------------------------------------------------------ | ----------------------------------------------- |
| `authorAvatarUrl`      | string          | Author avatar image                                                            | `"https://yt3.ggpht.com/…"`                     |
| `authorName`           | string          | Comment author handle                                                          | `"@SanDiegoZoo"`                                |
| `text`                 | string          | Comment body                                                                   | `"We're so honored…"`                           |
| `likeCount`            | integer | null | Likes as a number                                                              | `4500000`                                       |
| `likeCountText`        | string          | Likes as YouTube's abbreviated label                                           | `"4.5M"`                                        |
| `replyCount`           | integer | null | Replies as a number                                                            | `985`                                           |
| `replyCountText`       | string          | Replies as YouTube's abbreviated label                                         | `"985"`                                         |
| `publishedTimeText`    | string          | Relative publish time (as shown on YouTube)                                    | `"6 years ago"`                                 |
| `publishedAtApprox`    | string | null  | Approximate absolute post time                                                 | `"2020-06-12T09:00:00.000Z"`                    |
| `videoTitle`           | string          | Title of the source video                                                      | `"Me at the zoo"`                               |
| `videoChannelName`     | string          | Uploader channel name                                                          | `"jawed"`                                       |
| `isReply`              | boolean         | Whether this row is a reply                                                    | `false`                                         |
| `isPinned`             | boolean         | 📌 Pinned comment                                                              | `false`                                         |
| `isHeartedByCreator`   | boolean         | ❤️ Hearted by the creator                                                      | `false`                                         |
| `isEdited`             | boolean         | Comment was edited                                                             | `false`                                         |
| `authorIsChannelOwner` | boolean         | Author is the video's channel                                                  | `false`                                         |
| `authorIsVerified`     | boolean         | Verified author                                                                | `true`                                          |
| `authorIsArtist`       | boolean         | Artist channel                                                                 | `false`                                         |
| `commentUrl`           | string          | Deep link to the comment                                                       | `"https://www.youtube.com/watch?v=…&lc=…"`      |
| `videoUrl`             | string          | Watch link for the source video                                                | `"https://www.youtube.com/watch?v=jNQXAC9IVRw"` |
| `commentId`            | string          | Unique comment ID                                                              | `"UgzuC3zz…AaABAg"`                             |
| `parentCommentId`      | string | null  | Parent comment ID for replies (null for top-level) — use it to rebuild threads | `null`                                          |
| `authorChannelId`      | string | null  | Author's YouTube channel ID                                                    | `"UCC5NfQ6Mf0dq_eEwv4P_hWA"`                    |
| `videoId`              | string          | Source video ID                                                                | `"jNQXAC9IVRw"`                                 |
| `videoChannelId`       | string | null  | Source video's channel ID                                                      | `"UC4QobU6STFB0P71PMvOGN5A"`                    |
| `isNew`                | boolean         | New since the previous run (always meaningful in monitor mode)                 | `true`                                          |
| `scrapedAt`            | string          | UTC timestamp of the run (ISO 8601)                                            | `"2026-06-12T09:15:00.000Z"`                    |

> **Thread reconstruction:** `parentCommentId` is `null` for top-level comments and carries the parent's ID for replies — group rows by it (with `includeReplies` on) to rebuild full conversation threads. The `*Text` like/reply fields keep YouTube's abbreviated display form (`"4.5K"`, `"1.2M"`), which is handy at a glance alongside the parsed numbers.

#### Example row (JSON)

```json
{
    "authorAvatarUrl": "https://yt3.ggpht.com/…",
    "authorName": "@SanDiegoZoo",
    "text": "We're so honored that the first ever YouTube video was filmed here!",
    "likeCount": 4500000,
    "likeCountText": "4.5M",
    "replyCount": 985,
    "replyCountText": "985",
    "publishedTimeText": "6 years ago",
    "publishedAtApprox": "2020-06-12T09:00:00.000Z",
    "videoTitle": "Me at the zoo",
    "videoChannelName": "jawed",
    "isReply": false,
    "isPinned": false,
    "isHeartedByCreator": false,
    "isEdited": false,
    "authorIsChannelOwner": false,
    "authorIsVerified": true,
    "authorIsArtist": false,
    "commentUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw&lc=UgzuC3zzpRZkjc5Qzsd4AaABAg",
    "videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "commentId": "UgzuC3zzpRZkjc5Qzsd4AaABAg",
    "parentCommentId": null,
    "authorChannelId": "UCC5NfQ6Mf0dq_eEwv4P_hWA",
    "videoId": "jNQXAC9IVRw",
    "videoChannelId": "UC4QobU6STFB0P71PMvOGN5A",
    "isNew": true,
    "scrapedAt": "2026-06-12T09:15:00.000Z"
}
```

Export the dataset as **CSV, JSON, Excel** or HTML from the run's **Dataset** tab, or connect Google Sheets / BigQuery / Slack / Make / Zapier via Apify integrations.

### 🔔 How monitor mode works

1. **First run per video = free baseline.** You start watching a video without a surprise bill — the initial batch of comments is delivered free.
2. **Every later run = new only.** From the second run on, you receive only the comments posted since your last run, per video, deduplicated automatically.
3. **Quiet runs are cheap.** A run that finds nothing new costs only a tiny per-video check fee, so you can schedule it as often as you like.

### 📅 Daily scheduling for a continuous feed

1. Configure your input once (`mode: "monitor"`, your videos and/or channels) and **Save as Task**.
2. Add a [Schedule](https://docs.apify.com/platform/schedules) — daily or hourly.
3. Connect an [integration](https://docs.apify.com/platform/integrations) — Google Sheets, Slack webhook, BigQuery, Make, n8n or Zapier — to act on each batch of new comments automatically.

### 💵 Pricing

**Pay-per-event** — no subscription. You're charged per run start, per video checked, and per comment delivered — with the **first run per video delivered free**. Empty monitor checks (no new comments) cost only the run + per-video check fees, so scheduling is cheap. Exact per-event rates are shown on the Actor's **Pricing** tab.

| Event             | When it's charged                                                          |
| ----------------- | -------------------------------------------------------------------------- |
| Actor start       | Once per run                                                               |
| Video checked     | Per video inspected, even when no new comments are found                   |
| Comment delivered | Per comment row delivered — **free on the first (baseline) run per video** |

With Apify's **free tier** ($5 credit), a daily multi-video comment monitor runs for a long time before you pay anything.

### 💡 Pro tips

- **Best monitor setup:** `mode = monitor`, leave `includeReplies` off, and schedule daily — every row in a monitor run is new by definition.
- **Cheapest runs:** keep `includeReplies` off; reply threads cost extra requests. Turn it on only when you need full conversations (monitor mode expands replies for new comments only).
- **Busy videos:** if more new comments arrive between runs than `maxCommentsPerVideo`, raise the cap or run more often — the Actor emits the newest cap and logs a warning so you know.
- **Trim your bill for free:** pass `commentTextFilter`, `onlyChannelOwner`, or `minLikeCount` in JSON input (see Input note) to deliver only the comments you care about — you aren't charged for the ones filtered out.
- **Rebuild threads:** turn on `includeReplies` and group rows by `parentCommentId` to reconstruct full conversations.

### ℹ️ Good to know

- **Publish time is relative.** YouTube shows `"2 hours ago"`; `publishedAtApprox` is an approximate absolute time that grows less precise with age (a "3 years ago" comment is only roughly accurate). The verbatim label is always kept in `publishedTimeText`.
- **Counts are abbreviated.** `likeCount` / `replyCount` are parsed from YouTube's short labels (`"4.5M"` → `4500000`), so large numbers are approximate; the exact display strings are kept in `likeCountText` / `replyCountText`.
- **Monitor scope = new top-level comments.** New replies to *old* comments are not flagged as new. (Replies to *new* comments are captured when `includeReplies` is on.)
- **Resilient by design** — videos with comments disabled, deleted, or made private produce a warning and 0 rows, never a failed run, so one bad video never breaks the whole run.

### ▶️ Ready?

**Click Start** with the prefilled input — your first comment rows arrive in seconds. Then set `mode` to `monitor`, add your videos or channels, schedule it, and never miss a new comment again.

### 📬 Feedback & support

If you have any questions, feature requests, or encounter any issues, please open an [issue on the Actor's page](https://apify.com/slothtechlabs/youtube-comments-scraper-monitor/issues). We'd love to hear from you!

# Actor input Schema

## `videoUrls` (type: `array`):

Paste YouTube video URLs, one per line — watch, Shorts, youtu.be, and live links all work.

## `mode` (type: `string`):

Monitor = return only comments that are NEW since the last run (best for scheduled runs — comment alerts, brand monitoring, giveaway tracking). Bulk = scrape up to the cap (best for a one-off export or analysis).

## `sort` (type: `string`):

Comment order for bulk scraping (Top or Newest). Monitor mode always returns the newest comments first.

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

Upper bound on top-level comments fetched per video (1–1000). In monitor mode it's just an upper limit per run — you only pay for genuinely new comments.

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

Also fetch reply threads. In monitor mode, replies are fetched only for NEW comments. Each comment's reply thread costs extra requests — leave off for the cheapest runs.

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

Upper bound on replies fetched per comment when 'Include replies' is on (1–500). 100 captures virtually every thread.

## `channelUrls` (type: `array`):

Optional — watch whole channels: their latest uploads are found automatically and their comments scraped/monitored.

## `maxVideosPerChannel` (type: `integer`):

How many of each channel's most recent uploads to include (1–20).

## `proxyConfiguration` (type: `object`):

Uses Apify's datacenter proxy by default — no extra setup needed.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "mode": "bulk",
  "sort": "top",
  "maxCommentsPerVideo": 100,
  "includeReplies": false,
  "maxRepliesPerComment": 100,
  "maxVideosPerChannel": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `comments` (type: `string`):

All comment rows pushed to the default dataset by this run.

## `runSummary` (type: `string`):

JSON object with mode, videos, channels, totalComments, newComments, errors, errorDetails, durationMs.

# 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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    ],
    "mode": "bulk",
    "maxCommentsPerVideo": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("slothtechlabs/youtube-comments-scraper-monitor").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 = {
    "videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],
    "mode": "bulk",
    "maxCommentsPerVideo": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw"
  ],
  "mode": "bulk",
  "maxCommentsPerVideo": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call slothtechlabs/youtube-comments-scraper-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,slothtechlabs/youtube-comments-scraper-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SXUvSdAJvDpDITSWq/builds/DcMpktEkjuQOKONA0/openapi.json
