Reddit Comments Scraper: Export Comments and Replies avatar

Reddit Comments Scraper: Export Comments and Replies

Pricing

from $1.00 / 1,000 comments

Go to Apify Store
Reddit Comments Scraper: Export Comments and Replies

Reddit Comments Scraper: Export Comments and Replies

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.

Pricing

from $1.00 / 1,000 comments

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

5,000 Reddit comments in 84 seconds: one row per comment, replies linked to their parents

From The Mine Works, makers of Reddit Scraper and Threads Scraper, 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

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.

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:

{
"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

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

{
"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

{
"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:

{
"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 (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

{
"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

{
"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

ParameterTypeDefaultWhat it does
postUrlsarray of stringsrequiredReddit post links (www, old, new, np), redd.it links, share links or post ids. Up to 1,000 per run.
maxCommentsPerPostinteger500Most comments per post, top level and replies together, 1 to 10,000.
maxDepthinteger10Levels of the thread to return: 1 = top level only, 2 = plus direct replies, up to 10.
commentSortstringbestbest, top, new, controversial, old or qa. Decides which comments come first.
monitorModebooleanfalseDelivers and charges only comments not delivered to you by an earlier run.
clientIdstringemptyOptional 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.

FieldWhat it is
comment_idReddit's comment id, e.g. pdzjpb2
comment_fullnameThe id with its t1_ prefix, the value replies point to
post_id, post_title, post_url, post_authorThe post the comment is on
post_num_commentsComment count Reddit showed on the post when the row was read
subreddit, subreddit_idWhere the post lives
author, author_fullname, author_flair_textWho wrote the comment; [deleted] when the account is gone
bodyComment text in Reddit's markdown; [deleted] or [removed] when gone
score, score_hidden, controversiality, awards_countVotes and signals at the time of the run
created_utc, created_isoWhen it was posted (Unix seconds and ISO 8601, UTC)
depth, is_top_level0 for a top level comment, 1 for a reply to it, and so on
parent_id, parent_comment_idWhat it replies to: t3_<post> or t1_<comment>, and the plain parent comment id
is_submitterTrue when the post's author wrote the comment
permalinkDirect link to the comment
edited, edited_utcWhether and when it was edited
distinguished, stickied, locked, collapsedModerator or admin mark, pinned, replies locked, collapsed by default
positionPlace in the thread as read, 1 = first
comment_sortThe order the thread was read in
scraped_atWhen 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:

FieldWhat it is
comment_idThe key to store and join on
comment_fullnameJoin target for parent_id
post_idThe post's id
post_titleThe post's title
post_urlLink to the post
subredditSubreddit name
authorCommenter's username or [deleted]
bodyComment text
scoreScore when read
created_utcUnix seconds, UTC
created_isoISO 8601, UTC
depthLevel in the thread
parent_idReddit's parent reference
is_submitterWritten by the post's author
permalinkLink to the comment
editedEdited or not
stickiedPinned by a moderator
positionThread 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):

[
{
"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:

{
"_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):

[
{ "_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.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
comment-scrapedOnce 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-startOnce 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.

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.

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 for posts from subreddits, search, users or links with comments nested inside each post. Reddit Search Scraper to find posts by keyword. Reddit Subreddit Scraper for the posts of whole subreddits. Reddit User Scraper 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"

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

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools

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.