# Reddit Comments Scraper (`scrapesmith/reddit-comments-scraper`) Actor

Extract every comment from any Reddit post URL — including collapsed, hidden, and deeply nested replies. Get comment text, author, upvotes, depth level, controversiality, reply counts, and timestamps. Filter by date. Flattened output with full thread context. No login or cookies needed.

- **URL**: https://apify.com/scrapesmith/reddit-comments-scraper.md
- **Developed by:** [Scrape Smith](https://apify.com/scrapesmith) (community)
- **Categories:** Developer tools, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

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

## Reddit Comments Scraper — Extract Every Comment, Reply, and Hidden Thread

If you need the **most comprehensive Reddit comments scraper** available, stop scrolling. This tool digs through any Reddit post — no matter how big the thread — and pulls out every single comment, including the ones Reddit hides behind "load more comments" and deeply buried nested replies most tools simply miss. It's the fastest way to turn a messy comment section into clean, structured **Reddit data**.

Built for researchers, brand teams, social listening tools, and anyone who needs full-depth comment data from Reddit threads without spending hours clicking "load more" by hand.

### What It Does

Reddit Comments Scraper takes one or more Reddit post URLs and returns a complete, flattened dataset of every comment on that thread — top-level replies, nested sub-replies, and the collapsed/hidden comments Reddit doesn't show by default. Each comment comes with a `depth` value so you always know exactly where it sits in the conversation tree, even after flattening.

This isn't a shallow scrape that stops at the first page of visible comments — it's built to chase down "load more" threads recursively until the entire discussion is captured, making it the most thorough **subreddit** comment extraction tool around.

### Features

- **Captures 100% of comments, including collapsed and hidden ones** — most comment sections hide the majority of replies; this tool recovers them all
- **Full nested reply threads, flattened** — every reply-to-a-reply is followed to the bottom and returned as a clean flat list with depth tracking
- **Multiple post URLs per run** — batch-process dozens of Reddit threads in a single job
- **Date filtering** — set a cutoff date and automatically exclude older comments
- **Skip post data option** — pull comments only, without the original post, if that's all you need
- **Rich comment metadata** — author, upvotes, timestamps, flair, moderator/distinguished status, stickied status, and parent-child relationships
- **Resumable, checkpointed runs** — large comment threads won't lose progress if interrupted
- **No Reddit login or API key required** — 100% anonymous
- **Instant export** — download results as JSON, CSV, or Excel with one click

### Input Parameters

| Field | Type | Description |
|---|---|---|
| `postUrls` | Array | One or more Reddit post URLs to extract comments from |
| `maxComments` | Number | Maximum number of comments to collect per post |
| `commentDateLimit` | Date (YYYY-MM-DD) | Only include comments posted on or after this date |
| `skipPostData` | Boolean | If enabled, only comments are returned — the original post is excluded |
| `maxItems` | Number | Hard cap on total items (posts + comments) across all URLs |

### Output Fields

| Field | Description |
|---|---|
| `id` / `parsedId` | Reddit's internal comment ID |
| `postUrl` | URL of the parent post |
| `postTitle` | Title of the parent post |
| `parentId` | ID of the parent comment (or post, for top-level comments) |
| `username` | Comment author |
| `body` | Full comment text |
| `upVotes` | Comment score |
| `depth` | Nesting depth in the comment tree |
| `controversiality` | Reddit's controversiality flag |
| `isSubmitter` | Whether the commenter is the original poster |
| `isStickied` | Whether the comment is pinned |
| `isScoreHidden` | Whether the score is hidden by Reddit |
| `isLocked` | Whether the comment thread is locked |
| `distinguished` | Moderator/admin distinguished status |
| `authorFlair` | Commenter's subreddit flair |
| `communityName` | Subreddit the comment belongs to |
| `url` | Direct permalink to the comment |
| `createdAt` | Comment creation timestamp (ISO format) |
| `scrapedAt` | Time the data was scraped |
| `numberOfreplies` | Number of direct replies to this comment |
| `dataType` | `post` or `comment` |

### Sample Output

```json
{
  "id": "t1_kx9z1a2",
  "parsedId": "kx9z1a2",
  "postUrl": "https://www.reddit.com/r/technology/comments/1abcxyz/example_post/",
  "postTitle": "New breakthrough in battery technology announced",
  "parentId": "t3_1abcxyz",
  "username": "reddit_commenter",
  "body": "This is genuinely exciting if it scales to production.",
  "upVotes": 245,
  "depth": 0,
  "isSubmitter": false,
  "isStickied": false,
  "distinguished": null,
  "communityName": "r/technology",
  "url": "https://www.reddit.com/r/technology/comments/1abcxyz/example_post/kx9z1a2/",
  "createdAt": "2026-07-01T15:03:00.000Z",
  "scrapedAt": "2026-07-06T09:12:00.000Z",
  "numberOfreplies": 3,
  "dataType": "comment"
}
````

### Use Cases

1. **Brand sentiment analysis** — analyze what people really think in the comments, not just the post itself
2. **Community & discourse research** — study how discussions evolve and branch across large threads
3. **Customer feedback mining** — extract product feedback buried deep in comment replies
4. **Crisis & PR monitoring** — track fast-moving comment sections during viral moments
5. **NLP & sentiment model training** — build large labeled datasets of real conversational text
6. **Competitive research** — see how audiences react to competitor announcements and posts
7. **Journalism & fact-checking** — pull full comment context for stories referencing Reddit threads
8. **Moderation & community management research** — analyze how moderators and top commenters engage
9. **Academic social science research** — study online conversation structure and depth patterns

### Pricing

Simple, pay-per-result pricing: **$0.80 per 1,000 results**. No monthly commitment — you're only charged for the comments and posts actually returned to your dataset.

### Tips for Best Results

- Use `maxComments` conservatively on massive viral threads to control run size and cost
- Set `commentDateLimit` when you only care about the latest wave of a fast-moving discussion
- Enable `skipPostData` if you already have the post data from the Reddit Posts Scraper and only need comments
- Batch multiple post URLs into a single run to save time versus running them one at a time
- Pair this scraper with Reddit Posts Scraper for full post + comment coverage of a subreddit

### FAQ

**Does this scraper really get hidden and collapsed comments?**
Yes. It recursively follows Reddit's "load more comments" mechanism until the entire thread is captured, not just what's visible on the first load.

**Do I need to be logged into Reddit?**
No. This is a fully anonymous Reddit comments scraper — no login, cookies, or API key needed.

**Can I scrape comments from more than one post at a time?**
Yes, just add multiple post URLs to the input list and they'll all be processed in the same run.

**Can I filter out old comments?**
Yes, use the `commentDateLimit` field to only collect comments from a specific date onward.

**What export formats are supported?**
JSON, CSV, and Excel — all available for instant download once your run completes.

**What does the `depth` field mean?**
It tells you how deeply nested a comment is in the reply tree — `0` for top-level comments, `1` for replies to those, and so on.

**Will this work on extremely large threads with thousands of comments?**
Yes, the scraper is built to handle large volumes and checkpoints progress automatically so nothing is lost.

**Can I run this on a schedule to track a thread over time?**
Yes, you can schedule recurring runs to monitor an active or growing thread and capture new comments as they're posted.

### Why Teams Choose This Scraper

Most comment scrapers stop at whatever Reddit shows on the first page load, leaving the majority of a thread's replies uncollected. Reddit Comments Scraper was purpose-built to solve that gap — chasing down every collapsed reply and nested sub-thread so you get the complete picture, not a partial snapshot. That's what makes it the go-to tool for anyone who needs full-depth Reddit comment data.

### Getting Started

Add one or more Reddit post URLs to the input, choose whether you want post data included, set a comment cap if needed, and run. Your dataset fills in as comments are collected, with checkpoints along the way so nothing is ever lost mid-run.

### A Note on Reliability

Reddit threads can be huge, messy, and unpredictable — some have a handful of replies, others have tens of thousands spread across dozens of collapsed branches. This scraper is designed to handle both extremes gracefully, so whether you're pulling a quiet niche discussion or a front-page viral thread, you get consistent, complete, and reliable comment data every time.

### Support

Questions, feature requests, or issues? Reach out via the contact/support options on this actor's Apify page — we're always improving this tool to stay the most comprehensive Reddit comments scraper available.

# Actor input Schema

## `postUrls` (type: `array`):

List of Reddit post URLs to scrape comments from, e.g. https://www.reddit.com/r/python/comments/abc123/title/

## `maxComments` (type: `integer`):

Maximum number of comments to fetch for each post URL.

## `commentDateLimit` (type: `string`):

Only include comments posted on or after this date (format: YYYY-MM-DD). Leave empty to disable.

## `skipPostData` (type: `boolean`):

If enabled, the post itself is not included in the output — only its comments.

## `maxItems` (type: `integer`):

Hard cap on the total number of items (posts + comments) returned across all URLs.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.reddit.com/r/AskReddit/comments/1unskql/whats_cool_when_youre_1822_but_embarrassinglame/"
  ],
  "maxComments": 500,
  "skipPostData": false
}
```

# 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 = {
    "postUrls": [
        "https://www.reddit.com/r/AskReddit/comments/1unskql/whats_cool_when_youre_1822_but_embarrassinglame/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesmith/reddit-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 = { "postUrls": ["https://www.reddit.com/r/AskReddit/comments/1unskql/whats_cool_when_youre_1822_but_embarrassinglame/"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesmith/reddit-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 '{
  "postUrls": [
    "https://www.reddit.com/r/AskReddit/comments/1unskql/whats_cool_when_youre_1822_but_embarrassinglame/"
  ]
}' |
apify call scrapesmith/reddit-comments-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Reddit Comments Scraper",
        "description": "Extract every comment from any Reddit post URL — including collapsed, hidden, and deeply nested replies. Get comment text, author, upvotes, depth level, controversiality, reply counts, and timestamps. Filter by date. Flattened output with full thread context. No login or cookies needed.",
        "version": "0.0",
        "x-build-id": "aYmeEzvVDHXUCYLDM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesmith~reddit-comments-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesmith-reddit-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/scrapesmith~reddit-comments-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesmith-reddit-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/scrapesmith~reddit-comments-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesmith-reddit-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": [
                    "postUrls"
                ],
                "properties": {
                    "postUrls": {
                        "title": "Reddit post URLs",
                        "type": "array",
                        "description": "List of Reddit post URLs to scrape comments from, e.g. https://www.reddit.com/r/python/comments/abc123/title/",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxComments": {
                        "title": "Max comments per post",
                        "type": "integer",
                        "description": "Maximum number of comments to fetch for each post URL.",
                        "default": 500
                    },
                    "commentDateLimit": {
                        "title": "Only comments after date",
                        "type": "string",
                        "description": "Only include comments posted on or after this date (format: YYYY-MM-DD). Leave empty to disable."
                    },
                    "skipPostData": {
                        "title": "Skip post data",
                        "type": "boolean",
                        "description": "If enabled, the post itself is not included in the output — only its comments.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max total items",
                        "type": "integer",
                        "description": "Hard cap on the total number of items (posts + comments) returned across all URLs."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
