# YouTube Comments Scraper — Fast, No API Key (`thirdwatch/youtube-comments-scraper`) Actor

Scrape public YouTube comments and replies from videos and Shorts. Get text, authors, likes, dates, profile images, thread metadata, video IDs, and source URLs. No YouTube API key or account required.

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

## Pricing

from $0.45 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — Comments, Replies, Authors & Likes

> Scrape public YouTube comments and replies from videos and Shorts without a YouTube API key, account, or quota, then export text, authors, likes, dates, and thread metadata.

### What you get from the YouTube Comments Scraper

Turn YouTube conversations into structured rows for sentiment analysis, audience research, creator intelligence, moderation, and brand monitoring. Add one or many video URLs or IDs, select newest or popular ordering, choose whether to include replies, and export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.

The Actor accepts regular videos, Shorts, live and embed URLs, `youtu.be` links, and bare 11-character video IDs. It uses publicly visible YouTube data and does not consume YouTube Data API quota.

#### Quick start

1. Add one or more YouTube video URLs or IDs.
2. Choose **Newest first** for monitoring or **Most popular** for audience research.
3. Set a per-video result limit and decide whether to include replies.
4. Click **Start**, then open or export the comment dataset.

### YouTube comment output fields

| Field | Description |
|---|---|
| `cid` | Public YouTube comment identifier, when available |
| `text` | Full public comment or reply text |
| `author` | Public commenter display name |
| `channel` | Public commenter channel URL or identifier, when available |
| `votes` | Public like count shown for the comment |
| `time` | Human-readable posting time shown by YouTube |
| `time_parsed` | Structured posting timestamp when it can be derived |
| `photo` | Public commenter profile-image URL, when available |
| `heart` | Whether the creator-heart marker is present, when available |
| `reply` / `is_reply` | Indicates that the row is a reply, when supplied by YouTube |
| `videoId` | Source YouTube video ID |
| `videoUrl` | Canonical source video URL |

YouTube does not expose every field on every comment. Optional values may be empty when they are not publicly shown.

### Example YouTube comment output

```json
{
  "cid": "Ugx1AbCDefGhijkLmN4AaABAg",
  "text": "The explanation at 4:12 finally made this topic click for me.",
  "author": "Alex R.",
  "channel": "https://www.youtube.com/@alexresearch",
  "votes": 128,
  "time": "2 days ago",
  "time_parsed": 1784073600,
  "photo": "https://yt3.ggpht.com/example",
  "heart": false,
  "reply": false,
  "videoId": "dQw4w9WgXcQ",
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}
````

### YouTube Comments Scraper input parameters

| Parameter | Required | Default | Description |
|---|---:|---|---|
| `videoUrls` | Yes | Example video | YouTube watch, Shorts, live, embed, or `youtu.be` URLs, or bare 11-character video IDs. |
| `maxCommentsPerVideo` | No | `50` | Maximum combined comments and replies returned for each video, from 1 to 100,000. |
| `sort` | No | `recent` | Comment order: `recent` for newest first or `popular` for YouTube's popular ordering. |
| `language` | No | `en` | Language code used for YouTube-generated labels, such as `en`, `de`, or `es`. |
| `includeReplies` | No | `true` | Include publicly available replies. Disable it for top-level comments only. |

#### Example input

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://www.youtube.com/shorts/aqz-KE-bpKQ"
  ],
  "maxCommentsPerVideo": 500,
  "sort": "recent",
  "language": "en",
  "includeReplies": true
}
```

### YouTube comment data use cases

- **Brands and social-listening teams:** Track customer reactions, complaints, questions, and competitor mentions.
- **Creators and agencies:** Discover recurring audience interests, content ideas, and highly engaged viewers.
- **Researchers and analysts:** Build comment datasets for sentiment, topic, language, and community analysis.
- **Moderation teams:** Review public discussion at scale and prioritize high-engagement threads.
- **Developers and AI teams:** Connect comment data to dashboards, classifiers, retrieval systems, or scheduled workflows.

### YouTube Comments Scraper limitations

- Only publicly visible comments are returned. Private, deleted, held-for-review, members-only, or otherwise restricted comments are unavailable.
- Videos with comments disabled, private videos, deleted videos, and unavailable regional content can return no rows.
- This Actor accepts video URLs and IDs. It does not expand channel or playlist URLs into videos.
- `maxCommentsPerVideo` limits the combined accepted rows. When replies are enabled, replies can count toward that limit.
- Relative dates such as “2 months ago” are only as precise as YouTube's public label.
- Result order follows YouTube's public newest or popular ordering and can change over time.

### Compared to other YouTube comment scrapers

- Compared with `lurkapi/youtube-comments-scraper`, this Actor focuses on direct video and Shorts inputs with a compact setup rather than channel expansion, playlist expansion, keyword filters, or date filters.
- Compared with `api-ninja/youtube-comments-scraper` and `apihq/youtube-comments-scraper`, it supports the same core video-comment workflow while offering a very high per-video limit and straightforward control over ordering, replies, and language labels.
- Choose this Actor for simple bulk extraction from video URLs you already know. Choose a channel-expansion tool when discovering videos from a channel or playlist is part of the job.

### YouTube Comments Scraper FAQ

#### Do I need a YouTube Data API key?

No. Add public video URLs or IDs and run the Actor without providing a Google Cloud project, API key, YouTube account, or copied cookies.

#### Does it work with YouTube Shorts?

Yes. Shorts URLs, regular watch URLs, `youtu.be` links, live URLs, embed URLs, and bare video IDs are accepted.

#### Can I scrape comments from multiple videos?

Yes. Add multiple values to `videoUrls`. The result limit is applied separately to each valid video.

#### Can I scrape only top-level comments?

Yes. Set `includeReplies` to `false`. The Actor filters reply rows while continuing until it fills the requested top-level-comment limit when enough comments exist.

#### Why did a video return zero comments?

Comments may be disabled, the video may be private or unavailable, or YouTube may not expose public comments for that video at the time of the run. Check that the URL opens publicly and retry later.

#### Can I monitor new comments automatically?

Yes. Choose `recent`, create an Apify schedule, and send each dataset to a webhook, database, spreadsheet, Slack workflow, or another integration.

### Related Thirdwatch Actors

- [YouTube Scraper](https://apify.com/thirdwatch/youtube-scraper) — video search and metadata
- [TikTok Scraper](https://apify.com/thirdwatch/tiktok-scraper) — public TikTok profiles and content data
- [Instagram Scraper](https://apify.com/thirdwatch/instagram-scraper) — public Instagram profiles and posts

Explore more social and video data tools from [Thirdwatch](https://thirdwatch.dev/).

**Last verified: 2026-07**

# Actor input Schema

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

Videos whose public comments should be extracted.

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

Maximum number of comments and replies returned for each video.

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

Return newest comments first or YouTube's most popular comments.

## `language` (type: `string`):

Language code for YouTube-generated labels, for example en, de, or es.

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

Include replies when they are available in the public thread.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 50,
  "sort": "recent",
  "language": "en",
  "includeReplies": true
}
```

# Actor output Schema

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

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Comments Scraper — Fast, No API Key",
        "description": "Scrape public YouTube comments and replies from videos and Shorts. Get text, authors, likes, dates, profile images, thread metadata, video IDs, and source URLs. No YouTube API key or account required.",
        "version": "1.1",
        "x-build-id": "AxVlJCXEdT4CqnrcU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/thirdwatch~youtube-comments-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-thirdwatch-youtube-comments-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/thirdwatch~youtube-comments-scraper/runs": {
            "post": {
                "operationId": "runs-sync-thirdwatch-youtube-comments-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/thirdwatch~youtube-comments-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-thirdwatch-youtube-comments-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "YouTube video URLs or IDs",
                        "type": "array",
                        "description": "Videos whose public comments should be extracted.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxCommentsPerVideo": {
                        "title": "Maximum comments per video",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Maximum number of comments and replies returned for each video.",
                        "default": 50
                    },
                    "sort": {
                        "title": "Comment order",
                        "enum": [
                            "recent",
                            "popular"
                        ],
                        "type": "string",
                        "description": "Return newest comments first or YouTube's most popular comments.",
                        "default": "recent"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for YouTube-generated labels, for example en, de, or es.",
                        "default": "en"
                    },
                    "includeReplies": {
                        "title": "Include replies",
                        "type": "boolean",
                        "description": "Include replies when they are available in the public thread.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
