# Reddit Comments Scraper: Export Comments and Replies (`themineworks/reddit-comments-scraper`) Actor

Scrape Reddit comments and replies from any post: one row per comment with author, text, score, depth, parent id, time and permalink. Opens "load more comments" for up to 10,000 comments per post. Sort by best, top, new, controversial, old or Q\&A. No login. Monitor mode for new comments.

- **URL**: https://apify.com/themineworks/reddit-comments-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

## Reddit Comments Scraper: Export Comments and Replies

[![5,000 Reddit comments in 84 seconds: one row per comment, replies linked to their parents](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/reddit-comments-scraper-hero.png)](https://console.apify.com/actors/3MH5HOi1Snp0NbSCO/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

Updated 10 Oct 2026: first release. One flat row per comment, Reddit's "load more comments" links opened for up to 10,000 comments per post, six comment orders, and monitor mode for new comments. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **The whole conversation, not just the first screen.** Reddit sends about 490 comments for a post and hides the rest behind "load more comments" links. This actor opens those links too: in our test runs it read 5,000 comments of one AskReddit thread in 84 seconds, and the whole thread (8,084 comments, every "load more comments" link opened) in one run, with every reply placed under its parent and 0 duplicates.
- **One row per comment, ready for a spreadsheet.** Every comment carries its post's title and link, the author, the text, the score, the time, its depth, the comment it replies to and a direct link. No nested JSON to unpack: sort by `position` to read the thread in Reddit's order, or join `parent_comment_id` to `comment_id` to rebuild the tree.
- **Pay per comment, nothing for errors.** Posts that do not exist, links that are not Reddit posts, summary rows and comments you already have in monitor mode are never charged. No Reddit account, API key or cookies.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/3MH5HOi1Snp0NbSCO/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Social media and video family:** [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the first 100 comments of two popular threads, 200 rows. It took 7 seconds in one test run and 24 in another, depending on how fast Reddit answered:

```json
{
  "postUrls": [
    "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
    "https://www.reddit.com/r/cats/comments/1x15wvi/after_being_homeless_for_15_year_my_cat_and_me/"
  ],
  "maxCommentsPerPost": 100
}
```

A post can be given as a full link from www, old, new or np.reddit.com, a `redd.it` short link, or just its id (`1wy51c1`). Share links of the `reddit.com/r/<sub>/s/<code>` kind are opened to find the post. The same post given twice is read once.

Apify's free plan includes $5 of credit every month, which covers about 2,400 comments at this actor's price.

#### Copy to your AI assistant

```text
themineworks/reddit-comments-scraper on Apify. Exports every comment and reply of the Reddit posts you list, one flat row per comment, opening Reddit's "load more comments" links, with no Reddit login. Call ApifyClient("TOKEN").actor("themineworks/reddit-comments-scraper").call(run_input={"postUrls": ["https://www.reddit.com/r/AskReddit/comments/1wy51c1/"], "maxCommentsPerPost": 500}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: postUrls (list of Reddit post links, redd.it links or post ids; up to 1000). Optional: maxCommentsPerPost (default 500, 1 to 10000), maxDepth (default 10; 1 = top level comments only), commentSort ("best" default, "top", "new", "controversial", "old", "qa"), monitorMode (default false; delivers only comments not delivered by an earlier run in the same Apify account), clientId (own Reddit installed app client id). Comment rows have no _type field and carry comment_id, comment_fullname, post_id, post_title, post_url, post_author, post_num_comments, subreddit, author, body, score, created_utc, created_iso, depth, parent_id, parent_comment_id, is_top_level, is_submitter, permalink, edited, edited_utc, distinguished, stickied, locked, collapsed, position. Each run also writes one row with _type "summary", one with _type "info" when comments were delivered, and a row with _type "error" for each post that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~reddit-comments-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Up to 10,000 comments per post.** The first request returns up to about 490; after that the actor opens "load more comments" links, about 95 comments per request, shallowest first, so more top level comments come before deeper replies when a thread is cut.
- **Reddit's thread order kept.** Comments that a "load more" link returns are put back exactly where the link was. `position` numbers the rows in that order, and in our 8,084 row test every reply came after its parent.
- **Replies linked both ways.** `parent_id` holds Reddit's own reference (`t3_` for the post, `t1_` for a comment), `parent_comment_id` the plain id of the parent comment, `is_top_level` and `depth` the level.
- **Six comment orders.** best (Reddit's default), top, new, controversial, old and Q\&A, the same choices as the sort menu on reddit.com.
- **Monitor mode.** Remembers up to 50,000 comment ids it delivered to you and skips them on later runs, so a scheduled run pays only for new comments.
- **Deadline and rate limit safe.** The actor watches the run's time limit and Reddit's request window, stops cleanly before either runs out, keeps every comment it read, and says why in the summary row.

### How to use it

#### Basic: every comment of one thread

```json
{
  "postUrls": ["https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/"],
  "maxCommentsPerPost": 3000
}
```

Each comment is one row. Set `maxCommentsPerPost` to the size of the thread (the summary row shows the count Reddit reports as `num_comments_reported`) to read all of it.

#### Brand monitoring: new comments on your launch or AMA thread

```json
{
  "postUrls": ["https://www.reddit.com/r/SaaS/comments/<your post id>/"],
  "commentSort": "new",
  "maxCommentsPerPost": 500,
  "monitorMode": true
}
```

Save it as a task and add a schedule (every hour or every day). The first run delivers the thread; each later run delivers and charges only comments that were not in an earlier run. Sorting by new puts fresh top level comments first.

#### Competitor research: what buyers say on a rival's threads

Collect a competitor's launch post, its biggest complaint thread and a "X vs Y" discussion in one run:

```json
{
  "postUrls": [
    "https://www.reddit.com/r/<subreddit>/comments/<id1>/",
    "https://www.reddit.com/r/<subreddit>/comments/<id2>/",
    "https://redd.it/<id3>"
  ],
  "commentSort": "top",
  "maxCommentsPerPost": 1000
}
```

Filter rows on `score` to keep the opinions most people agreed with, and on `is_submitter` to separate the original poster's answers from everyone else's.

#### Pain point research: "what tool do you wish existed" threads

Threads where people list their problems are often the richest comment sections on Reddit. Find them with [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) (for example `"is there a tool" subreddit:smallbusiness`), then pass the post links here with `maxDepth: 2` to keep each complaint and the direct replies that agree or suggest a fix.

#### AI datasets: question and answer pairs

```json
{
  "postUrls": ["https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/"],
  "commentSort": "top",
  "maxDepth": 2,
  "maxCommentsPerPost": 2000
}
```

`post_title` is the question, depth 0 rows are answers, depth 1 rows are reactions to them. `body` keeps Reddit's markdown, `score` is a quality signal, and `edited`, `distinguished` and `collapsed` help you drop noise.

#### Moderation review: the controversial side of a thread

```json
{
  "postUrls": ["https://www.reddit.com/r/<subreddit>/comments/<id>/"],
  "commentSort": "controversial",
  "maxCommentsPerPost": 500
}
```

`controversiality` is 1 on comments Reddit marks as controversial, `collapsed` is true on comments Reddit hides by default, `distinguished` shows moderator and admin replies, and `stickied` flags the pinned moderator comment.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `postUrls` | array of strings | required | Reddit post links (www, old, new, np), `redd.it` links, share links or post ids. Up to 1,000 per run. |
| `maxCommentsPerPost` | integer | `500` | Most comments per post, top level and replies together, 1 to 10,000. |
| `maxDepth` | integer | `10` | Levels of the thread to return: 1 = top level only, 2 = plus direct replies, up to 10. |
| `commentSort` | string | `best` | `best`, `top`, `new`, `controversial`, `old` or `qa`. Decides which comments come first. |
| `monitorMode` | boolean | `false` | Delivers and charges only comments not delivered to you by an earlier run. |
| `clientId` | string | empty | Optional own Reddit "installed app" client id, so your requests do not share the default client id's rate limit. |

### What data do you get?

One row per comment. Comment rows have no `_type` field; the summary, info and error rows do, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `comment_id` | Reddit's comment id, e.g. `pdzjpb2` |
| `comment_fullname` | The id with its `t1_` prefix, the value replies point to |
| `post_id`, `post_title`, `post_url`, `post_author` | The post the comment is on |
| `post_num_comments` | Comment count Reddit showed on the post when the row was read |
| `subreddit`, `subreddit_id` | Where the post lives |
| `author`, `author_fullname`, `author_flair_text` | Who wrote the comment; `[deleted]` when the account is gone |
| `body` | Comment text in Reddit's markdown; `[deleted]` or `[removed]` when gone |
| `score`, `score_hidden`, `controversiality`, `awards_count` | Votes and signals at the time of the run |
| `created_utc`, `created_iso` | When it was posted (Unix seconds and ISO 8601, UTC) |
| `depth`, `is_top_level` | 0 for a top level comment, 1 for a reply to it, and so on |
| `parent_id`, `parent_comment_id` | What it replies to: `t3_<post>` or `t1_<comment>`, and the plain parent comment id |
| `is_submitter` | True when the post's author wrote the comment |
| `permalink` | Direct link to the comment |
| `edited`, `edited_utc` | Whether and when it was edited |
| `distinguished`, `stickied`, `locked`, `collapsed` | Moderator or admin mark, pinned, replies locked, collapsed by default |
| `position` | Place in the thread as read, 1 = first |
| `comment_sort` | The order the thread was read in |
| `scraped_at` | When the row was written |

**Summary row** (`_type: "summary"`, never charged): `posts_requested`, `posts_read`, `posts_failed`, `posts_not_started`, `comments_found`, `comments_delivered`, `charged_for`, `reddit_requests`, `rate_limit_waits`, `ended_on_deadline`, `stopped_by_rate_limit`, `stopped_by_max_cost`, `shortfall_reason` when fewer comments came back than asked, and `per_post`, one entry per post with `num_comments_reported`, `comments_read`, `comments_delivered`, `load_more_requests`, `load_more_ids_not_opened` and `complete`. The same summary is saved as the `OUTPUT` record of the run.

**Error rows** (`_type: "error"`, never charged): one per post that could not be read, with `error_type` (`not_found`, `private`, `banned`, `access_denied`, `invalid_url`, `share_link_unresolved`, `rate_limited`, `fetch_error`), `identifier`, `reason` and `http_status`.

#### Stable fields for automations

These were present in every comment row of our test runs (200 prefill rows and 5,000 rows from one thread), and their names will not change:

| Field | What it is |
|---|---|
| `comment_id` | The key to store and join on |
| `comment_fullname` | Join target for `parent_id` |
| `post_id` | The post's id |
| `post_title` | The post's title |
| `post_url` | Link to the post |
| `subreddit` | Subreddit name |
| `author` | Commenter's username or `[deleted]` |
| `body` | Comment text |
| `score` | Score when read |
| `created_utc` | Unix seconds, UTC |
| `created_iso` | ISO 8601, UTC |
| `depth` | Level in the thread |
| `parent_id` | Reddit's parent reference |
| `is_submitter` | Written by the post's author |
| `permalink` | Link to the comment |
| `edited` | Edited or not |
| `stickied` | Pinned by a moderator |
| `position` | Thread order |

Optional, present only when Reddit has a value: `parent_comment_id` (absent on top level comments), `author_fullname` (absent for deleted accounts: 191 of 200 prefill rows had it), `author_flair_text`, `edited_utc`, `distinguished`.

#### Output examples

A top level comment and the first reply under it, from the "Try it" input above (test run, 10 Oct 2026, trimmed):

```json
[
  {
    "comment_id": "pdzjpb2",
    "comment_fullname": "t1_pdzjpb2",
    "post_id": "1wy51c1",
    "post_title": "What 'cheat code' for life do you wish you'd discovered earlier?",
    "post_url": "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
    "post_author": "Unnamedaccount0",
    "post_num_comments": 2889,
    "subreddit": "AskReddit",
    "author": "explodingkraken",
    "body": "Give people appreciation. That's what most people want, and they'll remember you for it. ",
    "score": 9738,
    "controversiality": 0,
    "created_utc": 1791196213,
    "created_iso": "2026-10-05T10:30:13.000Z",
    "depth": 0,
    "parent_id": "t3_1wy51c1",
    "is_top_level": true,
    "is_submitter": false,
    "permalink": "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/pdzjpb2/",
    "edited": false,
    "stickied": false,
    "position": 1,
    "comment_sort": "best"
  },
  {
    "comment_id": "pe0h7sz",
    "comment_fullname": "t1_pe0h7sz",
    "post_id": "1wy51c1",
    "subreddit": "AskReddit",
    "author": "notacrook",
    "body": "And doing it publicly if appropriate (its a really great thing in a work setting too): ...",
    "score": 2074,
    "created_iso": "2026-10-05T13:41:45.000Z",
    "depth": 1,
    "parent_id": "t1_pdzjpb2",
    "parent_comment_id": "pdzjpb2",
    "is_top_level": false,
    "is_submitter": false,
    "permalink": "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/pe0h7sz/",
    "edited": true,
    "edited_utc": 1791228173,
    "position": 2
  }
]
```

The summary row of that run, trimmed:

```json
{
  "_type": "summary",
  "posts_requested": 2,
  "posts_read": 2,
  "comments_found": 298,
  "comments_delivered": 200,
  "charged_for": 200,
  "reddit_requests": 3,
  "ended_on_deadline": false,
  "per_post": [
    { "post_id": "1wy51c1", "num_comments_reported": 2889, "comments_read": 100, "comments_delivered": 100, "load_more_requests": 0, "stopped": "max_comments_reached", "seconds": 1.9 },
    { "post_id": "1x15wvi", "num_comments_reported": 3412, "comments_read": 198, "comments_delivered": 100, "load_more_requests": 1, "stopped": "max_comments_reached", "seconds": 19.4 }
  ]
}
```

Error rows from a test with a post that does not exist and a link that is not Reddit (nothing charged for either):

```json
[
  { "_type": "error", "error_type": "not_found", "identifier": "https://www.reddit.com/r/AskReddit/comments/zzzzzzzq/this_post_does_not_exist/", "reason": "Post zzzzzzzq was not found on Reddit (404)", "http_status": 404 },
  { "_type": "error", "error_type": "invalid_url", "identifier": "https://example.com/not-a-reddit-link", "reason": "Not a Reddit post link. Use a link that contains /comments/<id>/, a redd.it link, or a post id such as 1wy51c1." }
]
```

### Pricing

Pay per event: you pay for the comments you receive, plus a flat $0.005 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `comment-scraped` | Once per comment row stored in your dataset | $2.00 per 1,000 | $1.50 per 1,000 | $1.25 per 1,000 | $1.00 per 1,000 |
| `run-start` | Once per run, after the actor has signed in to Reddit | $0.005 | $0.005 | $0.005 | $0.005 |

The price of one comment is the price per 1,000 divided by 1,000.

Never charged:

- posts that do not exist, are private or banned, and links that are not Reddit posts (each gets an error row);
- comments skipped by monitor mode because an earlier run delivered them;
- comments read past your `maxCommentsPerPost`;
- the summary, info and error rows;
- a run with no valid post link, or one that cannot sign in to Reddit: it stops before the start fee;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every hour, every day at 08:00 and so on).
3. Turn on `monitorMode` in the task's input so each run delivers and charges only comments you have not received yet.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so new comments land where your team works.

Monitor mode keeps the ids of up to 50,000 delivered comments in a storage named `monitor-reddit-comments-scraper` in your own Apify account, shared by all your runs of this actor. If that storage cannot be opened, the run says so in its log, delivers everything, and sets `monitor_degraded: true` in the summary row.

### FAQ

#### What does this actor read?

The public comment section of the Reddit posts you list, as anyone sees it without logging in: every comment and reply Reddit serves, including the ones behind "load more comments" links. It does not read posts you have not listed; for whole subreddits use [Reddit Subreddit Scraper](https://apify.com/themineworks/reddit-subreddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

#### How many comments can I get per post?

Up to 10,000 per post and 1,000 posts per run. The first request returns up to about 490 comments; each "load more comments" request adds about 95 while there are big branches to open, fewer once only small ones are left. In our tests, 5,000 comments of one thread took 49 requests and 84 seconds; the whole of that thread, 8,084 comments, took 99 requests.

#### Why do I get fewer comments than the number Reddit shows?

Reddit's count includes comments that were removed or deleted and comments hidden by moderators or spam filters, which Reddit no longer serves. In our full thread test, every "load more comments" link was opened and 8,084 of the 9,006 comments Reddit counted came back. Very deep branches (past 10 levels, shown as "continue this thread") are not opened; the summary counts them in `continue_thread_links_not_opened`. If you set `maxCommentsPerPost` below the thread size, the run stops there on purpose.

#### In what order do the comments come, and how do I rebuild the thread?

In Reddit's thread order for the `commentSort` you chose: a comment, then its replies, then the next comment. `position` numbers the rows in that order. To rebuild the tree, link each row's `parent_comment_id` to the `comment_id` of another row; top level comments have `is_top_level: true` and no `parent_comment_id`.

#### What do maxDepth and commentSort change?

`maxDepth` is how many levels you keep: 1 returns top level comments only, 2 adds the direct replies, 10 returns everything Reddit serves. `commentSort` is the order of the thread, the same menu as on reddit.com, and it decides which comments come first when `maxCommentsPerPost` cuts a thread. When a thread is cut, top level comments are opened before deeper replies.

#### How long does a run take?

In our tests: 7 to 24 seconds for the two thread "Try it" input (200 comments), 84 seconds for 5,000 comments of one thread, and 525 seconds for all 8,084 comments of a thread Reddit counts at 9,006, which included a 236 second wait. Reddit allows about 100 requests per 10 minutes on the shared client id, enough for about 8,000 comments; past that the actor waits for Reddit's window to reset if the run's time limit allows, and otherwise stops cleanly with what it has.

#### Do I need a Reddit account, API key, cookies or a proxy?

No. The actor uses Reddit's anonymous app sign in, the same kind read only Reddit apps use. You can add your own free Reddit client id in `clientId` (an "installed app" from reddit.com/prefs/apps) so your requests do not share the default client id's limit.

#### What happens with deleted, removed, private or missing posts?

A post that does not exist gets an error row `not_found`; a private, banned or quarantined subreddit gets `private`, `banned` or `access_denied`. None of them is charged. A deleted or removed post that still has comments is read normally. Deleted and removed comments come back as `[deleted]` or `[removed]`, as Reddit shows them, because their replies still point to them.

#### Which link formats work?

Full post links from www, old, new and np.reddit.com (with or without the title part, or ending in a comment id), `reddit.com/comments/<id>`, `redd.it/<id>`, bare post ids such as `1wy51c1`, and share links like `reddit.com/r/<sub>/s/<code>`, which the actor opens to find the post. If a share link cannot be opened, the error row asks you to paste the full address instead.

#### How does monitor mode work with maxCommentsPerPost?

Each run reads the thread up to `maxCommentsPerPost` and delivers only the comments not delivered before. With `commentSort: "new"` the newest top level comments come first, so a run every hour or day catches fresh comments. Replies to older comments are caught as long as they fall inside the comments the run reads.

#### What happens when a run reaches its time limit or Reddit's rate limit?

The actor stops starting requests about 15 seconds before the run's timeout (900 seconds unless you change it), delivers every comment it read, and ends SUCCEEDED with `ended_on_deadline: true`, a `shortfall_reason`, and the posts it did not start in `posts_not_started`. In a test with a 40 second limit on a 9,006 comment thread it delivered 2,107 comments and stopped cleanly. The same happens when Reddit's request window is used up and the run has no time to wait (`stopped_by_rate_limit: true`).

#### Which Reddit actor should I use?

This one when you have the posts and want their comments as rows. [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for posts from subreddits, search, users or links with comments nested inside each post. [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) to find posts by keyword. [Reddit Subreddit Scraper](https://apify.com/themineworks/reddit-subreddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for the posts of whole subreddits. [Reddit User Scraper](https://apify.com/themineworks/reddit-user-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for profiles, karma and a user's post and comment history.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. Rows are flat, so CSV and Excel keep every field. The dataset has two ready views: Comments and Thread structure.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/reddit-comments-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http reddit-comments-scraper "https://mcp.apify.com/?tools=themineworks/reddit-comments-scraper"`

#### Is it legal to scrape Reddit comments?

The actor reads only public comments that anyone can see without logging in. Comments contain usernames and what people chose to write in public; you are responsible for how you use them, including Reddit's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

### Integrations

- **Google Sheets**: send each run's comments to a sheet with Apify's Google Sheets integration; one row per comment fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "new comments on our launch thread to Slack".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Twitter / X Scraper](https://apify.com/themineworks/twitter-x-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [YouTube Transcript](https://apify.com/themineworks/youtube-transcript-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Xiaohongshu (RED) Scraper](https://apify.com/themineworks/xiaohongshu-explore-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Scraper](https://apify.com/themineworks/telegram-channel-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Finder](https://apify.com/themineworks/telegram-channel-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Pinterest Profile Scraper](https://apify.com/themineworks/pinterest-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a thread that should return more comments, or a link format that is not read? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Give Reddit post links and get every comment and reply back as one row each, with author, text, score, depth, parent and time, up to 10,000 comments per post, no login.*

# Actor input Schema

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

The posts whose comments you want, one per line. Any of these forms works: https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/ (www, old, new or np), https://redd.it/1wy51c1, or just the post id 1wy51c1. Share links (reddit.com/r/<sub>/s/<code>) are opened to find the post. Up to 1,000 posts per run; the same post given twice is read once.

## `maxCommentsPerPost` (type: `integer`):

The most comments (top level comments and replies together) to return for each post, 1 to 10,000. The first request returns up to about 490; beyond that the actor opens Reddit's "load more comments" links, about 95 comments per extra request. Example: 2000.

## `maxDepth` (type: `integer`):

How many levels of the thread to return: 1 = top level comments only, 2 = plus their direct replies, up to 10 (Reddit's own limit). Default 10 returns every level Reddit serves.

## `commentSort` (type: `string`):

The order Reddit sorts the thread in, which also decides which comments come first when maxCommentsPerPost cuts the thread. Use new with monitor mode to catch fresh comments.

## `monitorMode` (type: `boolean`):

Deliver and charge only comments that earlier runs of this actor in your account have not delivered. Put the same input on a schedule to collect new comments on a thread as they arrive.

## `clientId` (type: `string`):

Leave blank. Optional: your own Reddit app client ID (type 'installed app', from https://www.reddit.com/prefs/apps) so your requests are not counted against the shared client ID's rate limit.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
    "https://www.reddit.com/r/cats/comments/1x15wvi/after_being_homeless_for_15_year_my_cat_and_me/"
  ],
  "maxCommentsPerPost": 100,
  "maxDepth": 10,
  "commentSort": "best",
  "monitorMode": 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 = {
    "postUrls": [
        "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
        "https://www.reddit.com/r/cats/comments/1x15wvi/after_being_homeless_for_15_year_my_cat_and_me/"
    ],
    "maxCommentsPerPost": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
        "https://www.reddit.com/r/cats/comments/1x15wvi/after_being_homeless_for_15_year_my_cat_and_me/",
    ],
    "maxCommentsPerPost": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/reddit-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 '{
  "postUrls": [
    "https://www.reddit.com/r/AskReddit/comments/1wy51c1/what_cheat_code_for_life_do_you_wish_youd/",
    "https://www.reddit.com/r/cats/comments/1x15wvi/after_being_homeless_for_15_year_my_cat_and_me/"
  ],
  "maxCommentsPerPost": 100
}' |
apify call themineworks/reddit-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/reddit-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/3MH5HOi1Snp0NbSCO/builds/vX9qVATLsFK6dcj4N/openapi.json
