Reddit Post Comments Scraper avatar

Reddit Post Comments Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Reddit Post Comments Scraper

Reddit Post Comments Scraper

Scrape every comment and nested reply from any Reddit post or subreddit, no API key or login needed. Get a transparent coverage report showing exactly how complete each thread scrape is, plus filters by score, date, and keyword.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Data Minds

Data Minds

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Reddit Post Comments Scraper — Full Thread & Nested Reply Extractor with a Coverage Report

Scrape every comment on any Reddit post — deep nested replies included — and know, per post, exactly what percentage you got.

🔗 View this Actor on Apify Store


Table of Contents


👽 Introduction

Reddit Post Comments Scraper is a reddit scraper built on the Apify platform that answers the one question every reddit comment scraper quietly dodges: how many comments did I actually get? Point it at a post link, a subreddit, a search query, or a username, and it pulls every comment and every nested reply — however many levels deep — off old.reddit.com's HTML. No official Reddit API, OAuth token, or login is required. It then re-checks its own work with a dedicated completeness pass and attaches a transparent, per-post coverage report (coverage_pct, comments_reported_by_reddit vs comments_scraped) to every run, so a partial scrape never masquerades as a full one.

Main features:

  • 🔍 Four discovery modes in one run — direct urls, subreddits, searchQuery (site-wide or scoped to one subreddit), and usernames — all combinable and de-duplicated automatically.
  • 🌳 Full nested-reply extraction — every reply at every depth, not just the first rendered page.
  • Automatic "load more comments" expansion via Reddit's own /api/morechildren endpoint — the exact gap that leaves most reddit comment scraper python scripts stuck at a partial thread.
  • A two-stage completeness/backfill pass that re-checks the thread after the first expansion and fills in anything still missing, then reports the result numerically instead of leaving you to guess.
  • 🔓 No Reddit API key, OAuth app, or login — this is a genuine reddit api alternative and praw alternative for anyone who wants data without registering a developer app or living inside Reddit's official rate limits.
  • 🎯 Rich filtering — score, date range, keywords, specific authors, and deleted/removed comments, applied only after the full thread is collected so filtering never distorts the coverage number.

Running on Apify also means this is not a script you babysit: built-in monitoring and run history, scheduling for recurring pulls, a full REST API and client SDKs for programmatic access, and automatic proxy rotation (datacenter → residential) if Reddit ever pushes back — all without extra setup.


🧵 What data can you extract from a Reddit thread?

In plain terms, every dataset row is one comment, and it carries four kinds of information:

  • Who said it — the author's username, flair, whether they're the original poster, and whether they're a moderator or admin.
  • What they said — the comment body as clean Markdown, as plain text (ready for reddit sentiment analysis dataset or LLM pipelines), and optionally the raw HTML.
  • Where it sits in the thread — its parent comment, nesting depth, how many direct and total replies it has, and (optionally) the full chain of ancestor comments back to the post.
  • How it's doing — upvote score, posting and edit timestamps, and deleted/removed status.

Every comment row can also carry the parent post's title, author, subreddit, score, and text, so you get a flat, self-contained table ready for how to export reddit comments to csv/json workflows — no separate join required. And running alongside all of that is the actor's signature feature: a reddit scraper coverage report showing exactly what fraction of Reddit's own reported comment count made it into your dataset, post by post.


🔄 How it works

  1. Resolve sources. Every urls, subreddits, searchQuery, and usernames entry is normalized (any Reddit subdomain, short redd.it links, and share links all work) and merged into one de-duplicated post list.
  2. Fetch the thread. Each post is loaded from old.reddit.com's HTML with the requested commentSort, and every visible comment is parsed with its exact parent and depth straight from the DOM nesting.
  3. Expand hidden sections. Every collapsed "load more comments" stub is resolved automatically through Reddit's own /api/morechildren endpoint — this is how the actor answers how to scrape all comments from a reddit post instead of stopping at the first page, and how it avoids the classic reddit load more comments not expanding dead end.
  4. Run the completeness pass. A second, targeted pass rechecks the thread for anything still missing after the first expansion and backfills it, in configurable rounds and batch sizes.
  5. Compute coverage. The actor compares comments_scraped against comments_reported_by_reddit and produces coverage_pct, plus diagnostic counts (morechildren_calls, backfill_requests, unresolved_stub_ids, truncated_subtrees_remaining, completeness_pass_converged, expansion_complete) — the transparent answer to how many comments did I actually get.
  6. Filter, shape, and stream. Score, date, keyword, and author filters are applied only after the full thread is in hand, then every kept comment (and optionally the post itself) is pushed live to your Apify Dataset — visible while the run is still going.

📝 Input parameters reference

Full input parameter names, types, and defaults — grouped exactly as they appear in the actor's input form.

🚀 Start here — what to scrape

FieldTypeDescriptionDefault
urlsarrayReddit post/thread links — any subdomain (www., old., new., np., m.), short redd.it links, and share links accepted, bulk/one-per-line. Required if no other source is set.[]
subredditsarrayPull the top posts from these subreddits and scrape all of their comments.[]
searchQuerystringFind posts matching this text across Reddit (or inside one subreddit).""
searchInSubredditstringRestricts searchQuery to this one subreddit.""
usernamesarrayScrape comments of posts these Reddit users have commented in.[]

📋 Post discovery

Only used when discovering posts from subreddits or usernames — ignored for direct URLs.

FieldTypeDescriptionDefault
subredditSortstring (enum)hot, new, top, rising, controversial.hot
searchSortstring (enum)relevance, hot, top, new, comments.relevance
subredditTimeFilterstring (enum)hour, day, week, month, year, all — used by top/controversial sort and search.week
maxPostsPerSourceintegerHow many posts to pull per subreddit/search/username source (1–100000). Direct URLs always scrape in full.10

💬 Comment extraction

Controls how deep and how complete the comment collection is for every post.

FieldTypeDescriptionDefault
commentSortstring (enum)top, best, new, controversial, old, qa.top
maxCommentsPerPostintegerCaps how many comments are written per post; collection still runs in full first so filters/coverage stay accurate. 0 = unlimited.0
maxDepthintegerOnly keep comments up to this nesting depth. 0 = unlimited depth.0
includeRepliesbooleanKeep nested reply comments, not just top-level ones.true
expandAllbooleanAutomatically reveal every collapsed "load more comments" section.true
completenessPassbooleanExtra pass that double-checks the thread for anything still missing and fills it in.true
maxMoreRequestsPerPostintegerSafety valve — caps how many "load more" requests one post can use. 0 = unlimited.0
maxBackfillRequestsintegerSafety valve for the completeness pass. 0 = unlimited.0
maxBackfillRoundsintegerHow many rounds the completeness pass may run before it stops.6
backfillBatchintegerHow many spots are rechecked per round during the completeness pass.60

🎯 Filters

All filters are optional and applied after the full thread is collected, so the coverage report always reflects the whole post.

FieldTypeDescriptionDefault
minScoreintegerOnly keep comments with at least this many upvotes. Empty = no minimum.
dateFromstring (date)Only keep comments posted on or after this date.""
dateTostring (date)Only keep comments posted on or before this date.""
keywordsarrayOnly keep comments whose text contains at least one of these words (or all, with the toggle below).[]
keywordsMatchAllbooleanOn = a comment must contain every keyword; off = any one is enough.false
authorsarrayOnly keep comments written by these usernames.[]
skipDeletedbooleanDrop comments whose text or author has been deleted or removed.true

📦 Output shape

Decide exactly what rides along with every comment row.

FieldTypeDescriptionDefault
includePostInfobooleanRepeat the parent post's title, author, score and text on every comment row.true
includePostRecordbooleanAlso save the post itself as a separate row, with the coverage report attached (_meta).false
includeThreadPathbooleanAttach each comment's full parent chain inline (thread_path) — ready-made context for LLM pipelines.false
includeBodyHtmlbooleanKeep the original rendered HTML of the comment body (body_html) alongside markdown/plain-text.false
outputTreebooleanSave one row per post with all comments nested as replies, instead of one flat row per comment.false
authorKarmabooleanFetch post/comment karma for every unique commenter. Adds one request per unique author.false

🌍 Network

FieldTypeDescriptionDefault
proxyConfigurationobjectRuns with no proxy by default and self-escalates (datacenter → residential) only if Reddit pushes back.{"useApifyProxy": false}
browserFallbackbooleanLast-resort retry of stubborn requests inside a real browser session.true

⚡ Speed & politeness

FieldTypeDescriptionDefault
concurrencyintegerHow many posts/comment batches to process at the same time (1–32).4
requestDelaynumberPause between requests, in seconds (random jitter added automatically).0.7
maxRetriesintegerAttempts before a request gives up or the run escalates to the next network route.6

📤 Output example

Every comment is streamed to your dataset as it's found — here is one realistic row (with includePostInfo on, the actor's default):

{
"comment_id": "p00n6zh",
"comment_fullname": "t1_p00n6zh",
"parent_fullname": "t3_1v7tfx9",
"parent_id": "1v7tfx9",
"depth": 0,
"author": "Zealousideal-Bid462",
"author_fullname": "t2_k11lcbbt",
"author_flair": null,
"is_op": false,
"distinguished": null,
"is_stickied": false,
"body": "Automate it with python and charge for LLM subscription",
"body_plain": "Automate it with python and charge for LLM subscription",
"score": 548,
"is_score_hidden": false,
"num_direct_replies": 0,
"num_children": 21,
"created_utc": 1785137981,
"created_at": "2026-07-27T07:39:41Z",
"is_edited": false,
"edited_at": null,
"is_deleted": false,
"is_removed": false,
"permalink": "https://old.reddit.com/r/Python/comments/1v7tfx9/python_automations_are_so_much_better_than_ai/p00n6zh/",
"subreddit": "Python",
"post_id": "1v7tfx9",
"post_fullname": "t3_1v7tfx9",
"post_title": "Python automations are so much better than AI Agents and LLMs",
"post_url": "https://old.reddit.com/r/Python/comments/1v7tfx9/",
"post_author": "hassanwithanh",
"post_score": 869,
"post_num_comments": 170,
"post_flair": "Discussion",
"post_selftext": "This is gonna be more of a rant than anything else...",
"scraped_at": "2026-08-02T10:40:20Z"
}

If includePostRecord is on, the post itself is saved as an extra row carrying the _meta coverage object:

{
"post_id": "1v7tfx9",
"record_type": "post",
"_meta": {
"comments_reported_by_reddit": 170,
"comments_scraped": 168,
"coverage_pct": 98.8,
"morechildren_calls": 4,
"backfill_requests": 2,
"unresolved_stub_ids": 0,
"truncated_subtrees_remaining": 0,
"completeness_pass_converged": true,
"expansion_complete": true,
"comments_after_filters": 168
}
}

🔎 Output fields worth explaining

FieldMeaning
depthNesting level — 0 for top-level comments, incrementing for each reply level.
num_childrenTotal descendant comments below this one, as reported by Reddit.
is_score_hiddentrue when Reddit hides the score (e.g. very new comments).
distinguished"moderator" or "admin" when the author is badge-flagged, otherwise null.
thread_path(only with includeThreadPath) the ordered ancestor chain — comment_id/author/body_plain for each parent up to the post.
_meta.coverage_pctcomments_scraped ÷ comments_reported_by_reddit × 100 — the actor's headline completeness metric, attached to the post row when includePostRecord is on and always printed in the run log.
_meta.expansion_completetrue only when nothing was left uncollected, unresolved, or capped by a safety valve.
author_post_karma / author_comment_karmaOnly present when authorKarma is on.
body_htmlOnly present when includeBodyHtml is on.

If comment-thread depth and a quantified completeness guarantee aren't what you need for a given task, two companion actors cover broader Reddit discovery:

  • Reddit Scraper - Posts, Comments, Search & Subreddits — a general-purpose reddit data scraper for pulling posts, light comment sets, subreddit listings, and search results in bulk. Good for wide discovery across many subreddits or keywords at once.
  • Reddit Post & Subreddit Extractor — focused on reddit post scraper workflows: post metadata, subreddit feeds, and listing-level fields without diving deep into every reply chain.

Reddit Post Comments Scraper (this Actor) is purpose-built for the opposite job. Use it when you already know which post or thread you care about and need every comment and reply extracted with a measurable, per-post completeness guarantee — the coverage_pct figure the other two don't attempt to produce. Use the two actors above for scrape reddit for research style discovery across many posts, and this one when the comments themselves — all of them, nested replies included — are the deliverable.


❓ FAQ

This Actor only collects publicly available data — the same comments any visitor can see on old.reddit.com without logging in. Scraping public web data is generally permitted in most jurisdictions, but you're responsible for how you use it: respect Reddit's Terms of Service, avoid collecting data from private or quarantined communities, and handle usernames and comment text in line with GDPR/CCPA if that applies to you. This is general information, not legal advice.

🆚 How is this different from the official Reddit API or PRAW?

The official Reddit API requires a registered developer app, OAuth credentials, and is subject to Reddit's own rate limits and pricing changes — the same constraints PRAW (the popular Python wrapper) inherits. This Actor is a practical reddit api alternative: it reads old.reddit.com's public HTML directly, so there's no Reddit API key to request, no OAuth flow to implement, and no developer account to maintain. It's built specifically to answer how to scrape reddit without api access while still returning fully structured, deduplicated data.

🕳️ How do I scrape all comments from a Reddit post, including deeply nested replies?

Leave expandAll and completenessPass on (both default to true) and set maxCommentsPerPost to 0 for unlimited. The Actor automatically resolves every "load more comments" stub through Reddit's /api/morechildren endpoint, then runs a second backfill pass to catch anything the first expansion missed — this is the direct answer to how to get all replies from a reddit thread without manual clicking.

📊 Why isn't coverage ever exactly 100%?

Reddit's own reported comment count (post_num_comments / comments_reported_by_reddit) includes comments Reddit itself no longer renders — deleted, removed, or filtered by spam systems. A coverage_pct in the mid-90s to 100% range on a thread with any deletions is the realistic ceiling, and it's reported transparently rather than silently rounded up. Check _meta.expansion_completetrue means the completeness pass converged cleanly and nothing was left on the table.

🔧 My "load more comments" section isn't expanding — what's wrong?

Confirm expandAll is true (it is by default) and that includeReplies is also on — hidden reply sections are skipped if replies are disabled entirely. For unusually large threads, raise maxMoreRequestsPerPost / maxBackfillRequests above their default 0 (unlimited) only if you specifically want a hard cap; otherwise leave them unlimited and let the safety valves stay out of the way.

💰 How much does it cost to scrape Reddit with this Actor?

This Actor runs on Apify's pay-per-event pricing model, billed on the comment_result event — one charge per comment (or post record) actually saved to your dataset, with no separate compute or per-request billing to calculate yourself. To keep costs down, set maxCommentsPerPost to cap rows written per post and maxPostsPerSource to limit how many posts are pulled per source while testing. Check the Actor's Pricing tab on Apify Store for the live rate.

📁 Can I export the results to CSV or JSON?

Yes. Every Apify dataset supports one-click export to JSON, CSV, Excel, XML, and RSS from the Output tab, or programmatic retrieval via the Apify API and client SDKs — a direct answer to how to export reddit comments to csv/json without writing your own conversion script.

🧠 Can I use this for sentiment analysis, LLM training data, or brand monitoring?

Yes — body_plain gives clean flat text ready for a reddit sentiment analysis dataset or reddit comment scraper for llm training data pipeline with no HTML cleanup needed, and includeThreadPath attaches each comment's full ancestor chain inline for multi-turn conversational context. For reddit brand monitoring scraper or reddit data for market research use cases, combine keywords, authors, and minScore filters with the subreddits or searchQuery discovery modes to track a specific topic or competitor across many threads at once.

🌐 Do I need a proxy?

No. Runs start with no proxy by default. If Reddit pushes back, the Actor escalates automatically — first to a datacenter proxy, then to a residential proxy — and stays on that route for the rest of the run. You only need to configure proxyConfiguration manually if you want a specific country route or expect unusually heavy throughput.


🤝 Support

Found a bug, need a custom field, or want a private integration or bulk pipeline built around this Actor? Reach out at hello.dataminds@gmail.com. Issues and feature requests are also welcome on the Actor's Issues tab in Apify Console — and if it saved you time, a review helps other users find it.