Reddit Posts & Comments Scraper - Subreddits & Search
Pricing
from $0.90 / 1,000 post scrapes
Reddit Posts & Comments Scraper - Subreddits & Search
Reddit scraper for subreddit feeds, keyword search, user submissions and full comment threads. Returns score, upvote ratio, comment count, flair, awards and media URLs per post, with nested comment trees. No login, no API key, no rate-limit quota.
Pricing
from $0.90 / 1,000 post scrapes
Rating
0.0
(0)
Developer
Eimantas V
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Reddit Posts & Comments Scraper
Scrape Reddit posts and their comment threads from subreddits, keyword searches, user profiles and individual post links — no Reddit account, no API key, and none of the rate-limit quota the official API imposes.
One row per post, one row per comment, and a summary row per source that tells you exactly what was and was not collected.
What you get on every post
| Engagement | score, upvote ratio, comment count |
| Content | title, full self-text, post kind (text / link / image / gallery / video / poll) |
| Links & media | destination URL, domain, and direct media URLs — the original file, not a resized preview |
| Context | subreddit, subscriber count, flair, NSFW, spoiler, pinned, locked, archived |
| People | author username plus Reddit's stable account id, which survives a rename |
| Timing | UTC timestamps for posting and for the last edit |
| Moderation | who removed it, and whether the author posted with a mod or admin badge |
Upvote ratio is the field most Reddit exports leave out, and it is the one that separates a post everyone agreed with from a post that was fought over. Both can score 500.
What you get on every comment
The comment text, author, score, nesting depth, its parent comment id, a direct permalink, and whether it was written by the person who made the post. Every comment row also carries the post id and post title, so it reads on its own without joining anything back together.
Comments come back depth-first, so a parent always appears before its replies and the thread reconstructs in the order it is written.
Four ways to point it at Reddit — mix them freely in one run
Subreddits — programming, r/programming, or the full URL. Sort by hot, new, top, rising or controversial, over any timeframe from the past hour to all time.
Keyword search — across all of Reddit, or restricted to subreddits you name. Reddit's own search operators work, including quoted phrases, OR, and flair:"name".
Users — everything a given account has posted.
Individual posts — paste any post permalink or redd.it short link. A post URL always returns its comment thread, because Reddit serves a post and its comments together.
Give it a subreddit twice — once as a URL, once as a bare name — and it is scraped once, not twice.
Filters that cut the bill, not just the spreadsheet
Filtered posts are never written and never charged. They are not rows you pay for and then delete.
- Minimum score and minimum comment count — reach versus discussion
- Post kind — only text posts, only outbound links, only images and galleries, or only videos
- Skip pinned posts — drops the moderator announcements that sit on top of every page
- Exclude NSFW
minComments is the one to reach for before turning comments on: it spends the extra requests only where there is a discussion worth reading.
An empty result always tells you why
Here is a thing about Reddit that quietly breaks scrapers. Ask it for a subreddit that does not exist and it does not return an error — it returns HTTP 200 and an empty feed, byte-for-byte identical to what a real but quiet subreddit returns. A typo in your input list and a genuinely dead community are indistinguishable.
So when a source returns no posts, this Actor spends one extra request checking that source against its own record on Reddit, and tells you which it was:
zeroReason | What it means |
|---|---|
listing-empty-confirmed | The subreddit or user really does exist, and really has nothing matching |
subreddit-empty-confirmed | It exists and has no subscribers at all |
subreddit-quarantined | It exists, but Reddit gates its posts behind an opted-in account |
search-matched-nothing | The search ran and matched nothing — and if it was scoped, the scope subreddit was verified to exist |
all-posts-filtered-out | Posts were found; your filters removed all of them |
run-timeout-reached | The run stopped itself before the platform could kill it |
And if the check comes back saying the subreddit or user is not there, you get a typed not-found error row naming it — not a summary row implying it was empty. A suspended Reddit account is reported as such rather than as a user with no posts.
That extra request costs nothing on a normal run, because it only happens for a source that produced nothing.
Every source also gets a summary row carrying how many posts were examined, how many the filters dropped, how many pages were read, and why it stopped.
Sources that could not be read at all get a typed error row instead, and error rows are never charged. Reddit's four refusals are told apart rather than lumped together:
errorClass | What actually happened |
|---|---|
not-found | No such subreddit, user or post |
banned | Reddit banned the subreddit |
private | The subreddit exists but is closed |
quarantined | Needs an opted-in Reddit account |
blocked / rate-limited | A transport problem, retried on a fresh IP before it was reported |
Honest about limits, because Reddit has them
- About 1,000 posts per listing. Reddit stops paginating any single subreddit feed, search or user profile there, whatever is requested. More than that has to come from more sources — a narrower timeframe, a tighter search, a different sort — and this Actor will not pretend otherwise.
- Very large comment threads are partial. Reddit withholds the tail of a huge thread behind "load more" stubs. Those stubs carry counts but no text, so they are never counted as comments or billed. The post row is marked
commentsTruncated: trueinstead, so you can see it rather than discover it later. - Scores are approximate by design. Reddit fuzzes vote counts to frustrate manipulation. Treat a score threshold as a guide.
- Awards are gone, and this Actor will not pretend otherwise. Reddit retired awards and coins in 2023, so
totalAwardsreads 0 on every post — including years-old ones. The field is passed through because Reddit still sends it, and it is listed here rather than advertised as a feature, because it no longer carries any information. - Sorts differ per source. Reddit accepts
relevanceon a subreddit feed, ignores it, and quietly answers withhot. Rather than pass that through, an unsupported sort is swapped for the closest supported one and the change is written to the log. - Comments are slow, and the clock is real. Reddit hands over 100 posts in a single request, but a comment thread is one request per post, each taking 20–40 seconds through the unblocking proxy. Budget roughly one post per second per worker with comments on, against a hundred per request without. Set the run timeout accordingly — and if the run does start running out of time, it stops itself cleanly and marks every summary row
runTimeoutrather than being killed halfway with nothing saved. Posts and their comments are written as each post finishes, so a run you stop early keeps everything it had already collected.
Pricing
Pay per result. You are charged for rows that were actually written.
| Event | Price |
|---|---|
| Post scraped | $1.50 per 1,000 posts |
| Comment scraped | $0.50 per 1,000 comments |
| Comment thread opened | $2.50 per 1,000 posts, only when comments are on |
| Actor start | $0.00005 per run |
Prices fall on every paid Apify plan, to $0.90 per 1,000 posts at the top tier — still a fraction of what the established Reddit scrapers charge at their own volume floor.
Summary rows are free. Error rows are free. Filtered posts are free. Posts Reddit repeated across pages are deduplicated by id and charged once. A request that came back challenged and was retried is not charged.
A posts-only run is the cheap one. Reddit returns 100 posts per request, so scraping 1,000 posts costs $1.50 and takes a handful of requests. Turning comments on costs one extra request per post, which is why opening a thread is priced separately — including for a post that turns out to have no comments at all, since that answer cost a real request too.
Getting started
Put a subreddit in Subreddits, press Start, and look at the results. The defaults collect 100 posts per source with comments off.
Then, when you know what you want:
- Turn on Also scrape comments and set Minimum comment count so the extra requests go where the discussion is
- Set Sort to
topand Timeframe toyearfor a subreddit's greatest hits - Use Search keywords with Search inside these subreddits to track a brand, product or competitor across the communities that matter
- Raise Max posts in the run once you have seen the shape of the data
Export to JSON, CSV, Excel or XML, or pull the dataset straight from the Apify API.