# YouTube Comments Scraper: Video Comments Export (`plainrows/youtube-comments-scraper`) Actor

Export YouTube comments of any video: text, likes, reply count, date and the video's title and comment count. Paste video links, Shorts links or IDs. Top and recent comments, up to 700 per video. No author names. Only-new-comments mode for daily checks. Pay per comment.

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

## Pricing

from $0.20 / 1,000 comments

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/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

Export **YouTube comments of any video or Short**: **comment text, likes, reply count and date**, plus the video's title, link and total comment count on every row. Paste YouTube links (`youtube.com/watch?v=…`, `youtu.be/…`, `/shorts/…`) or video IDs.

It calls a commercial data API instead of driving a browser: **no proxies, no CAPTCHAs, no YouTube API key or quota**. **Comment authors' names, channel links and profile pictures are not collected**: you get what viewers say, not who they are.

**What you get, in short: the top and recent comments, up to 700 per video, replies not included** (each comment carries its reply count).

### Typical uses

- **Sentiment analysis and AI summaries**: feed clean comment text to an LLM, a BI tool or an AI agent (MCP) to see what viewers like, ask and complain about.
- **Product and brand research**: read the comments under product reviews, launches and ads, yours or your competitors'.
- **Creators and social media teams**: turn on **Only new comments**, schedule a daily run and get the new comments on your videos, never the same one twice, in Slack or a spreadsheet.
- **Content ideas**: collect the questions viewers ask under the top videos of your niche.

### What you get

One row per comment:

| Field | Description |
|---|---|
| `input` | The video as you gave it |
| `videoId`, `videoTitle`, `videoUrl` | YouTube video ID, title and link |
| `videoCommentsCount` | Total number of comments shown on the video |
| `position` | Position of the comment in YouTube's order (the order YouTube serves them in) |
| `text` | Comment text |
| `likes`, `replyCount` | Likes on the comment and number of replies (the replies themselves are not included) |
| `publishedAt` | Approximate comment date (UTC, ISO 8601), computed from the relative date YouTube shows |
| `publishedText` | Date as YouTube shows it, e.g. "1 year ago" |
| `observedAt` | When the data was fetched (UTC) |

Missing values are always `null`, never guessed. A video that is not found, is private, has comments turned off or no comment yet gets one free row with `found: false`, a `notFoundReason` and a `note` (the blocks requested for it are still charged, see Pricing).

### Input

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=4gEoh3sk2AE",
    "https://youtu.be/dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 100
}
```

- **videos**: one per line, up to 500: a YouTube video link (`watch?v=`, `youtu.be/`, `/shorts/`, `/live/`, `/embed/`) or an 11-character video ID. Channel and playlist links are not accepted. Duplicates are removed for free.
- **maxCommentsPerVideo**: 20 to 700 (default 100). Comments are fetched in blocks of 20, so the number is rounded up to the next block (50 asks for 60).
- **onlyNewComments** (optional, monitoring): return only comments never delivered to you before for the same video. See below.
- **monitorName** (optional): name of the key-value store in your account that remembers delivered comments (default `plainrows-youtube-comments-monitor`).

### Chain it with YouTube Search Scraper

Find videos for a keyword with [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper), then paste its **`url`** or **`videoId`** column into **videos** here, as they are. In n8n, Make or Zapier, map the `url` of each result to the `videos` list of this tool.

### Monitor videos: get only new comments

Turn on **Only new comments** (`"onlyNewComments": true`) and add an Apify **schedule** (daily, for example). The first run returns the comments it finds and remembers them in a key-value store of your own Apify account (as one-way fingerprints, not the text or the author); each later run returns **and bills only comments it has never delivered**. A video with nothing new gets a free row with `notFoundReason: "no-new-comments"`. The blocks requested are still charged on every check (the data source bills them either way).

- YouTube decides which comments it serves and in which order: a new comment is not always within the first blocks on busy videos. For those, ask for more comments per check (200 to 700).
- Each run reads only the first `maxCommentsPerVideo` comments YouTube serves. **Set it above the number of new comments you expect on a video between two runs**: if more new comments arrive than that, the older new ones are not read again and are missed. When a check finds a full page of comments and none of them was delivered before, the run warns you (`more than … new comments since the last run`, also counted in `videosPossiblyMissingComments` in the run summary): raise `maxCommentsPerVideo` or run the check more often. When a check reads new comments that your limit leaves out (comments are read in blocks of 20, so a limit of 30 reads 40), the run warns too (`… new comments beyond your limit were not delivered this run`, counted in `commentsBeyondLimitNotDelivered` in the run summary): they come with a later run only if still among the comments it reads.
- Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.

### Output example

Row from a real run on 2026-10-11 (a sourdough baking video):

```json
{
  "input": "https://www.youtube.com/watch?v=4gEoh3sk2AE",
  "found": true,
  "videoId": "4gEoh3sk2AE",
  "videoTitle": "Bake the Perfect Sourdough Bread: A Step-by-Step Guide",
  "videoUrl": "https://www.youtube.com/watch?v=4gEoh3sk2AE",
  "videoCommentsCount": 3254,
  "position": 1,
  "text": "Making this bread is like getting a part time job.",
  "likes": 3100,
  "replyCount": 113,
  "publishedAt": "2024-10-11T13:37:20.000Z",
  "publishedText": "2 years ago",
  "observedAt": "2026-10-11T13:37:17.202Z",
  "schemaVersion": "1.0"
}
```

### Pricing

Pay per result, no subscription, no proxy costs. See the **Pricing** tab for current prices. Three events, nothing else:

- **Comment**: one per comment returned, cheaper on higher Apify plans.
- **Block of 20 comments requested**: comments are fetched in blocks of 20 per video, and the data source bills us every block requested. So 100 comments = 5 blocks. A block is charged once YouTube has answered, even if the video has fewer comments than you asked for, or is not found. Tip: set `maxCommentsPerVideo` to what you need to pay for fewer blocks (with Only new comments, keep it above the number of new comments expected between two runs).
- **Actor start**: a small fixed fee per run, charged by Apify when the run starts.

Example, 100 comments of one video at free Apify plan prices, run start included: about **$0.037**, i.e. under $0.0004 per comment.

Duplicates and values that are not a video link or ID cost nothing beyond the start fee (a well-formed but wrong 11-character ID is sent to YouTube and its blocks are charged), and requests YouTube does not answer are not charged. The run never spends more than the maximum cost you set.

**Free Apify plan:** each run returns up to 60 comments for up to 2 videos, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~youtube-comments-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "maxCommentsPerVideo": 100}'
```

Results take about a minute per batch of videos (the data source queues the requests).

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/youtube-comments-scraper`, schedule it daily with Only new comments and send new comments to Slack or Google Sheets.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/youtube-comments-scraper` to Claude, Cursor or any MCP client. The agent gets a typed tool and pays per result.

### What this is not

- **No author names, channel links, profile pictures or author IDs** (privacy by design, in line with GDPR data minimisation).
- **No replies**: only top-level comments, with their reply count.
- Not every comment ever written, and no sort option: the top and recent comments YouTube shows, up to 700 per video and run. Use Only new comments to build a history over time.
- Not a search tool: to find videos by keyword, use [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) first.
- Not affiliated with YouTube or Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): videos submitted and run, blocks of comments charged, how many returned nothing, comments billed, requests YouTube did not answer, monitored videos that probably got more new comments than `maxCommentsPerVideo` since the last run (`videosPossiblyMissingComments`), new comments read but left out by that limit (`commentsBeyondLimitNotDelivered`), duplicates and invalid values (with the reason, e.g. `NOT_A_VIDEO_LINK`), and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I export the comments of a YouTube video?**
Paste its link or ID and run: one row per comment with text, likes, reply count and date, ready for Excel, Google Sheets or JSON.

**Does it work with YouTube Shorts?**
Yes: paste the `/shorts/…` link as it is.

**How many comments per video?**
Up to 700 per video per run, in the order YouTube serves them. For a running history, schedule it with Only new comments.

**Does it include replies or author names?**
No. Each comment has its reply count, but replies, author names and channel links are not collected.

**Do I need a YouTube API key?**
No. No API key, no quota, no Google account.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [Google News Scraper](https://apify.com/plainrows/google-news-scraper) · [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [YouTube comments API without a Google Cloud project](https://nadaho.github.io/plainrows/youtube-comments-api/)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

## `videos` (type: `array`):

One per line: a YouTube video link (youtube.com/watch?v=…, youtu.be/…, /shorts/…, /live/…) or an 11-character video ID. The url and videoId columns of PlainRows YouTube Search Scraper work as they are. Channel and playlist links are not accepted. Up to 500 videos per run.

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

20 to 700. Comments are fetched in blocks of 20 (rounded up: 50 asks for 60): each block requested and each comment returned is billed; see Pricing.

## `onlyNewComments` (type: `boolean`):

Return only comments this tool has never delivered to you for the same video. The first run returns the comments and remembers them; later runs (for example a daily schedule) return and bill only new comments. Each run reads only the first "Max comments per video": set it above the number of new comments expected between two runs, or older new comments are missed (the run warns you). The block fee still applies.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered comments (default "plainrows-youtube-comments-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 100,
  "onlyNewComments": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "videos": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ],
    "maxCommentsPerVideo": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/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 = {
    "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "maxCommentsPerVideo": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/youtube-comments-scraper").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 '{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 100
}' |
apify call plainrows/youtube-comments-scraper --silent --output-dataset

```

## MCP server setup

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

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/cJOamwCrdFoXcmRaq/builds/RwdzTu0SvFgewt1i9/openapi.json
