Reddit Posts & Comments Scraper - Subreddits & Search avatar

Reddit Posts & Comments Scraper - Subreddits & Search

Pricing

from $0.90 / 1,000 post scrapes

Go to Apify Store
Reddit Posts & Comments Scraper - Subreddits & Search

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

Eimantas V

Maintained by Community

Actor 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

Engagementscore, upvote ratio, comment count
Contenttitle, full self-text, post kind (text / link / image / gallery / video / poll)
Links & mediadestination URL, domain, and direct media URLs — the original file, not a resized preview
Contextsubreddit, subscriber count, flair, NSFW, spoiler, pinned, locked, archived
Peopleauthor username plus Reddit's stable account id, which survives a rename
TimingUTC timestamps for posting and for the last edit
Moderationwho 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

Subredditsprogramming, 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:

zeroReasonWhat it means
listing-empty-confirmedThe subreddit or user really does exist, and really has nothing matching
subreddit-empty-confirmedIt exists and has no subscribers at all
subreddit-quarantinedIt exists, but Reddit gates its posts behind an opted-in account
search-matched-nothingThe search ran and matched nothing — and if it was scoped, the scope subreddit was verified to exist
all-posts-filtered-outPosts were found; your filters removed all of them
run-timeout-reachedThe 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:

errorClassWhat actually happened
not-foundNo such subreddit, user or post
bannedReddit banned the subreddit
privateThe subreddit exists but is closed
quarantinedNeeds an opted-in Reddit account
blocked / rate-limitedA 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: true instead, 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 totalAwards reads 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 relevance on a subreddit feed, ignores it, and quietly answers with hot. 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 runTimeout rather 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.

EventPrice
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 top and Timeframe to year for 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.