Reddit Scraper API — Posts, Comments, Search, Users avatar

Reddit Scraper API — Posts, Comments, Search, Users

Pricing

from $3.00 / 1,000 post, community or user rows

Go to Apify Store
Reddit Scraper API — Posts, Comments, Search, Users

Reddit Scraper API — Posts, Comments, Search, Users

Scrape Reddit posts, comments, subreddits, users and search into one flat table. Score and upvote ratio on every row, no flag to enable. No API key, no login. Paste any Reddit URL or community name. Filters run before billing, so the rows you discard are free.

Pricing

from $3.00 / 1,000 post, community or user rows

Rating

0.0

(0)

Developer

Blackcube Agency AB

Blackcube Agency AB

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

33 minutes ago

Last modified

Share

More from this account: YouTube Transcript Suite · Website Contact & Email Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Meta Ad Library · Vinted

Paste anything from Reddit. Get back a flat table with the score, the upvote ratio, the media and the full comment thread already in it.

A community name, a post link, a redd.it short link, a user profile, a search-results URL, or a list of five hundred of them — this Actor works out what each one is and returns the same 37-column schema for all of them. No API key. No approval queue. No login. No developer token.

You pay for rows you actually receive. Starting a run costs a fraction of a cent — $0.003, falling to $0.001 by volume. That is the only tiered start fee in this category and it is 8× to 86× below what the largest Actors here charge. After that: a community that turns out to be private, a search with no hits, a user that no longer exists, every row a filter discarded, every duplicate, and every row a previous run already gave you are free. They come back as rows explaining themselves and they never reach your invoice.

Unofficial. Not affiliated with, endorsed by, or connected to Reddit. It reads only what Reddit publishes publicly to logged-out visitors.


Why this one

1. The score and the upvote ratio are on every row, by default

This is the field buyers in this category most often do not get. There is no flag to switch on, no "detailed mode" that halves your throughput, and no best-effort caveat.

On the last 1,500-post benchmark run — five communities, new sort, 34 seconds — score, upvoteRatio, createdAt and title were populated on 1,500 of 1,500 rows. author was populated on 1,499; the one gap was a deleted account, which is returned as null rather than as the literal text [deleted].

A missing value is always null, never 0. A post with no score and a post scored zero are different facts, and a filter on score > 0 must not silently swallow the second kind.

2. Paste the URL you already have

You pasteWhat you get
rust or r/rustThe community's posts
https://www.reddit.com/r/rust/top/?t=weekThat exact feed, sort and window already applied
https://www.reddit.com/r/rust/comments/1vq17rg/…That post, plus its comment thread
https://redd.it/1vq17rgSame, from the short link
A link to a specific commentThe post it belongs to, with the thread
https://www.reddit.com/user/spez/That user's public posts
https://www.reddit.com/search/?q=rust+asyncThat search, exactly as Reddit ranks it
u/spez, /r/rust, old.reddit.com/…, sh.reddit.com/…All understood

Anything it cannot read comes back as a free row naming the input and the reason. It is never guessed at. A bare word like marketing is not silently treated as a community — that is far more likely to be a search term pasted into the wrong box, and resolving it to a community would bill you for data you never asked for.

3. A spending cap that actually binds

Total row limit is a hard ceiling on billable rows for the entire run, counting posts and comments together, and it is enforced at the moment of delivery rather than checked hopefully in a loop. Set it to 1,000 and you get 1,000 — not 1,004 because four workers were in flight, and not 15,000 because the limit was per-source and you supplied twenty sources.

It survives interruption, too: if the platform migrates the container mid-run, the count continues from what was already delivered instead of restarting.

4. Repeat runs only charge for what is new

Turn on Only rows I have not had before and a scheduled run returns — and bills for — only what has appeared since last time. The first run returns everything; every run after it returns the delta.

Run 1Run 2Run 30
Normal500 rows500 rows500 rows
Only new500 rows~20 rows~20 rows

Each schedule keeps its own memory, and editing the input list does not reset it — adding one more community to a daily job does not make the next run re-deliver and re-charge for everything it already gave you.

5. Date windows and keyword filters, and you are not billed for what they discard

Filtering is the most-requested and least-available feature in this category, and the reason is always the same: when an Actor bills for every row it touches, throwing rows away costs the developer money. Discarding is cheap here, so it is free for you.

  • Posted after / Posted before — an absolute date (2026-01-31) or an age (7 days, 12h, 3 months). Use an age in a scheduled run; a fixed date silently goes stale.
  • Must contain / Must not contain — keyword filters over title, body and flair.
  • Minimum score.

Every row these remove is discarded before billing, and the run log tells you how many and why.

6. Comment threads that are actually complete

Reddit truncates long threads and leaves a "load more" stub in place of the rest. This Actor follows those stubs and keeps going until it has the number of comments you asked for, so a 5,000-comment thread returns comments rather than stubs. Replies carry depth, parentId and isSubmitter, so the tree can be rebuilt exactly.

7. Deep coverage, past the per-community ceiling

Reddit stops any single community feed at roughly 1,000 posts and then simply stops paginating. Switch on Deep coverage and the same community is read through its other sorts and time windows and the results are de-duplicated.

Measured on r/rust: the best single feed returned 998 unique posts; four feeds combined and de-duplicated returned 1,488.

What this is not: it is not a full historical archive, and no live scraper can be one. If a community has 200,000 posts going back ten years, this reaches a few thousand of them, not all of them. That limit is Reddit's and it applies to Reddit's own official API as well. Where a run stops short, the log says which of the two reasons it was — a limit you set, or the ceiling itself.


What you get

One flat row per post, comment, community or user, plus free rows for anything that produced nothing. Every row carries type, sourceRef (which of your inputs produced it) and scrapedAt.

Postsid · fullId · url · permalink · subreddit · subredditId · title · body · bodyHtml · author · authorId · createdAt · score · upvoteRatio · numComments · flair · linkUrl · domain · thumbnail · images[] · videoUrl · galleryImages[] · isNsfw · isSpoiler · isOc · isSelf · isVideo · isPinned · isStickied · isLocked · isArchived · totalAwards · editedAt · crosspostParentId

Commentsid · fullId · postId · postTitle · parentId · permalink · subreddit · author · authorId · body · bodyHtml · score · createdAt · depth · isSubmitter · isStickied · editedAt · totalAwards

Communitiesname · title · description · publicDescription · subscribers · activeUsers · createdAt · isNsfw · lang · iconUrl · bannerUrl

Usersusername · createdAt · linkKarma · commentKarma · totalKarma · isGold · isMod · isEmployee · isVerified · iconUrl · bio

Free rowssourceRef · errorReason · message · statusCode. errorReason is one of notFound, private, banned, quarantined, empty, blocked, badInput, maxItemsReached, chargeLimitReached, requestFailed — a stable machine-readable value, so a pipeline can branch on it.

Text arrives unescaped. A title containing & arrives as &, not &.


How to scrape a subreddit

Put the community name in Communitiesrust, or r/rust, either works — and pick a Sort. top and controversial also use the Time window.

Set Results per source for how many posts you want from each. Beyond roughly 1,000, turn on Deep coverage.

How to scrape Reddit comments

Switch on Include comments and set Comments per post. Every post the run returns then also returns its thread, with replies followed to Reply depth.

For one specific thread, put its URL in Reddit URLs instead — you get the post and its comments and nothing else. Comments are billed at their own, lower rate.

How to scrape Reddit search results

Put your terms in Keywords. Reddit's own operators work and are passed through untouched: title:launch, author:spez, flair:news, "an exact phrase", self:yes, and AND / OR / NOT.

Your query is never rewritten, never split into separate single-word searches, and never quietly widened. If you also list Communities, the search is restricted to them; if you do not, it runs across Reddit.

Reddit's search returns roughly 250 results per query. To go deeper, split the query — by time window, by community, or by adding terms.

How to scrape a Reddit user

Put usernames in Users, or paste profile URLs. …/user/name/comments/ returns their comments instead of their posts; …/user/name/about returns the profile record on its own.

How to monitor a subreddit for new posts

Sort by new, switch on Only rows I have not had before, set Posted after to something like 2 days, and put the Actor on a schedule. Each run returns only what appeared since the last one, and you are billed only for those rows.


Pricing

Two units, because a thread returns an order of magnitude more comments than posts and charging both at one rate makes a comment-heavy pull absurd.

FREEBRONZESILVERGOLDPLATINUMDIAMOND
Per 1,000 posts$6.00$5.40$3.90$3.00$2.80$2.60
Per 1,000 comments$0.90$0.80$0.70$0.60$0.55$0.50
Per run started$0.003$0.0025$0.002$0.0015$0.0012$0.001

Communities and user profiles are billed at the post rate. Platform usage is included — what is above is what you pay, with nothing added afterwards.

Everything here is tiered, including the run fee. Every other Actor in this category charges a flat start fee that its largest customers pay at the same rate as its smallest — and charges between $0.02 and $0.216 for it. The ladder here also keeps descending past Gold, where the rest of the category flattens out and high-volume buyers stop being rewarded for volume.

Never billed: rows a filter discarded, rows an earlier run already delivered when Only new is on, duplicate rows, and every free row explaining a gap.

A ten-row evaluation run costs about $0.063 all in.


Honest limits

  • A residential proxy is required, and it is the default. Reddit refuses datacenter addresses outright, so a run configured without one will return free blocked rows rather than data. Leave the proxy setting alone unless you know why you are changing it.
  • Roughly 1,000 posts per community feed, ~250 per search query, ~500 per top window. Deep coverage combines feeds to beat this; nothing gets you the complete history of a large community.
  • Public content only. Private, banned and quarantined communities return a free row saying which. Nothing behind a login is read.
  • Deleted content is gone. An author who deleted their account is null, not a name.

Frequently asked

Do I need a Reddit account, an app, or an API key? No. Nothing to register, nothing to wait for approval on.

Why is there a run fee at all, when the rest of the billing is per row? Because reaching Reddit at all costs something before a single row exists, and a fee that covers it is what lets everything else — the filters, the duplicates, the failures — genuinely stay free. It is a fraction of a cent and it is tiered; the alternative most of this category picked was a flat fee 8× to 86× larger.

What if I type a date it cannot read? You get a free row saying so, and the run does not pretend the filter ran. It will never quietly bill you for rows a filter you thought was active should have removed.

What happens if a community in my list is private? You get a free row with errorReason: "private" and the run carries on. Every input you supply produces either data or an explanation — never silence.

Can I get more than 1,000 posts from one community? Yes, with Deep coverage — measured at 1,488 unique on a community where a single feed gave 998. Not unlimited, and not the full archive.

Why did my run return fewer rows than I asked for? The log says which of the two reasons applied: a limit you set, or Reddit's own ceiling. They are reported separately on purpose.

Can I use this from Python / n8n / Make / an LLM agent? Yes — it is a standard Actor with a standard dataset, callable from the Apify API and client libraries.


You are responsible for how you use the data you collect, including compliance with Reddit's terms and with privacy law in your jurisdiction. Scrape public content, and honour deletion requests.

Run it without configuring anythingScrape the top posts of a subreddit, a ready-made example you can start as-is or copy.

Use cases

  • Research what people actually say. Posts and comments in one flat table, with score and upvote ratio on every row.
  • Track a brand or a topic. Search across Reddit and re-run it on a schedule to catch new mentions.
  • Mine a community. Pull a subreddit's history for product research, sentiment or training data.
  • Follow a thread properly. Comment trees come back whole rather than truncated at the first page.

Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open Schedules in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per row delivered, so a scheduled run that finds nothing new costs nothing.

FAQ

Do I need a Reddit API key or login?

No. No key, no OAuth, no account.

Can I paste any Reddit URL?

Yes — post, subreddit, user or search URL, and mixed in one run.

Are scores and upvote ratios included?

Yes, on every row, with no flag to enable.

Can I get comments as well as posts?

Yes, in the same run and in the same table, with a type column separating them.


Something wrong, or a field you need that is missing? Open an issue on the Issues tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.