Reddit Scraper | Posts, Comments and Search | No API Key avatar

Reddit Scraper | Posts, Comments and Search | No API Key

Pricing

from $1.00 / 1,000 posts

Go to Apify Store
Reddit Scraper | Posts, Comments and Search | No API Key

Reddit Scraper | Posts, Comments and Search | No API Key

Scrape Reddit posts, comments, subreddits, search & user history. No login, pay per result, full nested comment trees, monitor mode for new posts only. Use in Claude, ChatGPT & any MCP agent for market research, sentiment & AI training data.

Pricing

from $1.00 / 1,000 posts

Rating

5.0

(1)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

97

Total users

45

Monthly active users

a day ago

Last modified

Share

300 Reddit posts in 27 seconds: a recorded run pulled the top 300 posts of the year from r/CFP in 27 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with nearly 139,000 runs across our actors.

Why choose this actor?

  • 300 posts in 27 seconds, with no Reddit account. A recorded run pulled the top 300 posts of the year from r/CFP in 27 seconds at the default 512 MB. You do not need a Reddit login, a password, cookies or an API key of your own.
  • Whole comment threads, nested the way Reddit shows them. A test run returned the 10 top posts of the week from r/Python with their comment trees in 22 seconds. Comments ride inside the post row, so they add no extra charge.
  • You pay only for posts that land in your dataset. $1.00 to $2.00 per 1,000 posts depending on your Apify plan. Summary rows, error rows, empty searches and posts that fail to save are never charged, and monitor mode charges only for posts you have not received before.

Run it on Apify

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

Try it in one minute

Paste this into the input's JSON tab and start the run. It returns the 10 top posts of the week from r/Python, each with up to 5 comments and two levels of replies.

{
"mode": "subreddit",
"subreddits": ["Python"],
"sortBy": "top",
"timeframe": "week",
"maxPosts": 10,
"includeComments": true,
"maxCommentsPerPost": 5,
"maxDepth": 2
}

There are four ways to say what you want, one per mode: subreddit names without the r/ ("Python", "MachineLearning"), a search query in Reddit's own search syntax ("lab grown diamonds" subreddit:EngagementRings), a username without the u/ ("spez"), or full post URLs that contain /r/<subreddit>/comments/<id>/ from www.reddit.com or old.reddit.com. Share links of the /s/ kind and redd.it short links are not read, so open them in a browser first and copy the full address.

Apify's free plan includes $5 of credit every month, which covers about 2,475 posts at this actor's price (the Free plan rate of $0.002 per post, plus the $0.005 start fee on each of 10 runs at the default memory).

Copy to your AI assistant

themineworks/reddit-scraper on Apify. Scrapes public Reddit posts, with optional nested comment trees, from subreddits, a search query, a user's post history or specific post URLs, with no Reddit login. Call ApifyClient("TOKEN").actor("themineworks/reddit-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: mode ("subreddit", "search", "user" or "post") plus the matching subreddits, searchQuery, username or postUrls. Optional: sortBy (default "hot"), timeframe (default "all", used with sortBy "top"), maxPosts (default 25, up to 1000 per run), includeComments (default false), maxCommentsPerPost (default 100), maxDepth (default 3), after (cursor from a previous run), skipPinnedPosts (default false), clientId (your own Reddit client id), monitorMode (default false). Post rows have no _type field; every run also writes one row with _type "summary", a run that delivered posts adds one row with _type "info", and each failed target gets a row with _type "error"; none of these extra rows is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~reddit-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

  • Four modes in one actor. subreddit reads a community's hot, new, top or rising feed, search runs a Reddit search across the whole site, user reads a person's submitted posts, and post reads the exact threads you list.
  • 21 fields per post. ID, subreddit, title, author, score, upvote ratio, link, body text, flair, comment count, creation time, pinned and locked flags, award count and more, all as flat top-level fields that drop straight into a spreadsheet.
  • Nested comment trees. Turn on includeComments and each post carries a comments array with replies nested inside replies. maxCommentsPerPost goes up to 500 and maxDepth up to 10. Threads that Reddit collapses arrive as a small more stub with the count and IDs of the hidden comments.
  • Up to 1,000 posts per run, with a cursor. maxPosts caps the whole run. The summary row carries last_after_cursor, which you paste into after to continue a feed where the last run stopped.
  • Monitor mode for schedules. With monitorMode on, the actor remembers up to 50,000 post IDs it has already delivered to you and skips them on later runs, so a daily run delivers and charges only new posts.
  • No proxy, no browser. It reads Reddit through Reddit's own anonymous app sign in (the installed client flow that read only Reddit apps use), at 512 MB of memory by default.

How to use it

Basic: one subreddit, top posts of the month

{
"mode": "subreddit",
"subreddits": ["smallbusiness"],
"sortBy": "top",
"timeframe": "month",
"maxPosts": 100
}

timeframe only matters with sortBy: "top". It takes hour, day, week, month, year or all.

Several subreddits in one run

{
"mode": "subreddit",
"subreddits": ["personalfinance", "financialplanning", "fatFIRE"],
"sortBy": "new",
"maxPosts": 300,
"skipPinnedPosts": true
}

Subreddits are read in the order you list them, and maxPosts is shared across all of them: the run stops once 300 posts are delivered in total. To get a fixed number from each one, run them separately or put each in its own saved task. skipPinnedPosts drops the moderator posts that sit at the top of most feeds.

Pain point research: what people complain about

{
"mode": "search",
"searchQuery": "(subreddit:Landlord OR subreddit:PropertyManagement) (\"nightmare\" OR \"so frustrating\" OR \"is there a tool\")",
"sortBy": "top",
"timeframe": "year",
"maxPosts": 200
}

Reddit search accepts subreddit:, author:, title:, quoted phrases, OR and NOT. This is the kind of query we run ourselves for product research: one run per phrase family, 200 posts each, then read the titles and bodies for repeated problems.

Brand mention alerts, delivered daily

{
"mode": "search",
"searchQuery": "\"your brand name\"",
"sortBy": "new",
"maxPosts": 100,
"monitorMode": true
}

Save this as a task and put it on a daily schedule. The first run sets the baseline and delivers everything it finds. Every later run delivers and charges only posts that were not in an earlier run, and the summary row shows new_this_run and skipped_duplicates.

Read specific threads with every comment

{
"mode": "post",
"postUrls": [
"https://www.reddit.com/r/Python/comments/1woh8y4/whats_new_in_python_315/"
],
"maxCommentsPerPost": 500,
"maxDepth": 10
}

In post mode the comment tree is always fetched, whatever includeComments says. maxPosts still caps how many URLs are read.

A user's post history

{
"mode": "user",
"username": "spez",
"maxPosts": 50
}

User mode always returns the newest submissions first; sortBy and timeframe do not apply to it. It returns posts only, not the comments a user wrote on other threads.

Input parameters

ParameterTypeDefaultWhat it does
modestringsubredditRequired. subreddit, search, user or post. Picks which of the next four fields is read.
subredditsarray[]Subreddit names without r/, for subreddit mode. Read in order; maxPosts is shared across them.
searchQuerystringnoneReddit search query, for search mode. Supports Reddit's search syntax.
usernamestringnoneReddit username without u/, for user mode.
postUrlsarray[]Full Reddit post URLs, for post mode. Comments are always fetched in this mode.
sortBystringhothot, new, top or rising. Used by subreddit and search modes.
timeframestringallhour, day, week, month, year or all. Only used with sortBy: "top".
maxPostsinteger25Most posts delivered in the whole run, 1 to 1000. This is also your cost cap.
includeCommentsbooleanfalseAdds each post's comment tree as a comments array. One extra request per post, so runs take longer.
maxCommentsPerPostinteger100Comment limit sent to Reddit for each post, 1 to 500. Used when comments are fetched.
maxDepthinteger3How many levels of replies to follow, 1 to 10. 1 returns top level comments plus their direct replies; each step adds one level.
afterstringnoneA cursor such as t3_1va1tm3 from an earlier run's summary row. The run starts from that point in the feed.
skipPinnedPostsbooleanfalseSkips moderator pinned posts. Skipped posts do not count toward maxPosts.
clientIdstringnoneOptional Reddit client ID of your own ("installed app" type, from reddit.com/prefs/apps) for rate limits that are not shared with other users.
monitorModebooleanfalseDelivers and charges only posts not delivered to you in an earlier run.

What data do you get?

One row per post, plus one summary row per run. Post rows have no _type field, so filtering on _type separates them from the rest.

The post: id (such as 1woh8y4), name (the full Reddit ID, t3_1woh8y4), title, selftext (body text, empty for link posts), is_self, url (the linked page, or the thread itself for text posts), permalink, domain, flair.

Where and who: subreddit, subreddit_id, author, author_fullname.

Engagement and status: score, upvote_ratio, num_comments, awards_count, is_pinned, is_locked, created_utc (Unix seconds), scraped_at (ISO time the row was written).

Comments (when fetched): each comment has id, name, author, body, score, created_utc, is_submitter (true when the post's author wrote it), depth (0 for top level) and replies, a list of comments in the same shape. A collapsed branch appears as {"kind": "more", "id", "name", "count", "children"}, where children holds the IDs Reddit did not expand.

Summary row (_type: "summary", never charged): posts_requested, posts_scraped, posts_failed, subreddits_processed, charged_for, last_after_cursor (when the feed has more), ended_on_deadline (true when the run stopped early for its time limit), monitor, plus previously_seen, new_this_run and skipped_duplicates in monitor mode, and shortfall_reason when nothing was found or the run stopped for time.

Info row (_type: "info", never charged): written on runs that delivered at least one post, with the count and a note on scheduling.

Error rows (_type: "error", never charged): one per target that failed, with error_type (not_found, access_denied, rate_limited, fetch_error, invalid_url and a few others), identifier, reason and http_status.

Stable fields for automations

These fields were present in all 300 post rows of the recorded run, and in every post row of our test runs. Their names will not change, so a Google Sheet, Zapier zap or n8n flow can map them once.

FieldWhat it is
idReddit post ID, the key to store and join on
nameFull ID with the t3_ prefix
subredditCommunity name, without r/
titlePost title
authorAuthor's username, or [deleted]
scoreUpvotes minus downvotes at the time of the run
upvote_ratioShare of votes that are upvotes, 0 to 1
num_commentsComment count Reddit shows on the post
urlLinked page, or the thread for text posts
permalinkFull link to the Reddit thread
selftextBody text, empty string for link posts
created_utcPost time in Unix seconds, UTC
is_pinnedTrue for moderator pinned posts
scraped_atWhen this row was written, ISO 8601

flair and author_fullname are left out of a row when Reddit has no value (2 and 6 of the 300 recorded rows), so treat them as optional. The comments key appears only when comments were fetched in that run.

Output examples

A subreddit post with its comment tree (test run, r/Python top of the week, maxDepth: 2; body and replies trimmed):

{
"id": "1wqy9yg",
"name": "t3_1wqy9yg",
"subreddit": "Python",
"subreddit_id": "t5_2qh0y",
"title": "The Python documentation is now available in Persian",
"author": "AlSweigart",
"author_fullname": "t2_369qx",
"score": 145,
"upvote_ratio": 0.91,
"url": "https://www.reddit.com/r/Python/comments/1wqy9yg/the_python_documentation_is_now_available_in/",
"permalink": "https://www.reddit.com/r/Python/comments/1wqy9yg/the_python_documentation_is_now_available_in/",
"selftext": "https://blog.python.org/2026/09/the-python-documentation-is-now-available-in-persian/ ...",
"is_self": true,
"domain": "self.Python",
"flair": "News",
"num_comments": 7,
"created_utc": 1790448473,
"is_pinned": false,
"is_locked": false,
"awards_count": 0,
"scraped_at": "2026-09-29T22:44:52.760Z",
"comments": [
{
"id": "pc7zmbx",
"name": "t1_pc7zmbx",
"author": "AlSweigart",
"body": "I think it's great that the Python devs aren't just throwing ChatGPT at translation projects. ...",
"score": 41,
"created_utc": 1790448522,
"is_submitter": true,
"depth": 0,
"replies": [
{
"id": "pc8o80p",
"name": "t1_pc8o80p",
"author": "shinitakunai",
"body": "A big burden to localize all texts if you are alone. ...",
"score": 10,
"created_utc": 1790455249,
"is_submitter": false,
"depth": 1,
"replies": []
}
]
}
]
}

A search result (recorded run, a search across four expat and visa subreddits, top of the year; body trimmed):

{
"id": "1qlqn4l",
"name": "t3_1qlqn4l",
"subreddit": "expats",
"subreddit_id": "t5_2rhwp",
"title": "Malta looks great on holiday. Here’s what daily life is actually like",
"author": "True-Ingenuity-8974",
"author_fullname": "t2_e48mtn3e",
"score": 303,
"upvote_ratio": 0.96,
"url": "https://www.reddit.com/r/expats/comments/1qlqn4l/malta_looks_great_on_holiday_heres_what_daily/",
"permalink": "https://www.reddit.com/r/expats/comments/1qlqn4l/malta_looks_great_on_holiday_heres_what_daily/",
"selftext": "If you’re thinking of moving to Malta because it’s sunny, English-speaking and in the EU, I get it. ...",
"is_self": true,
"domain": "self.expats",
"num_comments": 130,
"created_utc": 1769270342,
"is_pinned": false,
"is_locked": false,
"awards_count": 0,
"scraped_at": "2026-09-24T19:22:45.888Z"
}

This row has no flair because the post had none.

The summary row (the recorded r/CFP run):

{
"_type": "summary",
"posts_requested": 300,
"posts_scraped": 300,
"posts_failed": 0,
"subreddits_processed": 1,
"charged_for": 300,
"last_after_cursor": "t3_1va1tm3",
"monitor": false,
"scraped_at": "2026-09-24T19:20:29.995Z"
}

An error row and the summary of a run that found nothing (test run on a subreddit that does not exist; nothing was charged):

[
{
"_type": "error",
"error_type": "not_found",
"identifier": "r/thissubdoesnotexist98765",
"reason": "Resource not found (404)",
"http_status": 404,
"scraped_at": "2026-09-29T22:47:53.487Z"
},
{
"_type": "summary",
"posts_requested": 5,
"posts_scraped": 0,
"posts_failed": 0,
"subreddits_processed": 1,
"charged_for": 0,
"monitor": false,
"scraped_at": "2026-09-29T22:47:53.489Z",
"shortfall_reason": "No posts found matching the input criteria."
}
]

Pricing

Pay per event. You are charged for each post delivered to your dataset, plus a small start fee per run. The rate falls as your Apify plan rises.

EventFreeBronzeSilverGold and above
Post delivered (post-scraped), per post$0.002$0.0015$0.00125$0.001
Per 1,000 posts$2.00$1.50$1.25$1.00
Run start (apify-actor-start)$0.005 per GB of run memory, minimum one eventsamesamesame

The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, one event per GB of memory with a minimum of one. At the default 512 MB, and at 1 GB, that is one event, $0.005 per run. A 4 GB run would pay $0.02. This actor does not need more than 512 MB.

Comments are free. A post's comment tree rides inside the post row, so a post with 500 comments costs the same as a post with none.

Never charged: the summary row, the info row, error rows, posts that fail to save, posts skipped by skipPinnedPosts, and posts skipped by monitor mode because you already have them. A run that finds nothing pays only the start fee.

What real jobs cost on Gold: 300 posts cost $0.30 plus $0.005. A daily brand search in monitor mode that finds 20 new posts costs about $0.025 a day.

There is no price change scheduled for this actor. The Pricing tab on this page always shows the rate for your own plan.

FAQ

What is Reddit, and what does this actor read from it? Reddit is a network of topic communities (subreddits) where people post links and text and discuss them in threaded comments. This actor reads public posts and their comments: a subreddit's feeds, Reddit's site search, a user's submitted posts, or the threads you name.

How many posts can I get? Up to 1,000 per run. Reddit itself stops serving a single feed after roughly a thousand posts: a test run asking for 1,000 of r/Python's newest posts got 948 before Reddit's listing ended. To go further back, combine sorts and time windows (top with year, then all, then new), split a search into narrower queries, or pass the after cursor from an earlier run's summary row.

How fresh is the data? Live. Every run asks Reddit at the moment it runs. Scores, upvote ratios and comment counts are the values Reddit showed at that moment, stamped in scraped_at.

Do I need a Reddit account, API key or cookies? No. The actor uses Reddit's anonymous app token, the same kind read-only Reddit apps use, with a shared client ID. You never enter a Reddit login. If you run it heavily, you can add a free client ID of your own in clientId so your rate limit is not shared with other users.

Do I need a proxy? No. The actor does not use one and you do not need to set one. When Reddit asks it to slow down, it waits 5, 10 and then 20 seconds before retrying, unless that wait would run past the run's time limit.

How do I get the data out? From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. JSON keeps the nested comments tree intact. CSV and Excel flatten nested fields, so for comment work use JSON.

What happens with deleted, removed or private content? Deleted and removed posts and comments come back as [deleted] or [removed], as Reddit shows them; the original text cannot be recovered. A subreddit that does not exist, is private or is banned produces an error row (not_found or access_denied) and is not charged. Quarantined communities are generally not served to anonymous apps, so expect errors or empty results there.

How do I run it on a schedule or get only new posts? Save your input as a task, then add a schedule in Apify Console (Schedules, then Create new, for example daily at 06:00). Turn on monitorMode so each run delivers and charges only posts you have not received before. Monitor mode keeps up to 50,000 post IDs in a storage named monitor-reddit-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 marks monitor_degraded: true in the summary row.

Why did a run return fewer posts than maxPosts? The feed or search ran out, pinned posts were skipped, or monitor mode skipped posts you already had. The summary row says which: posts_scraped, skipped_duplicates and shortfall_reason. If you set a maximum cost per run in Apify and it is reached, the run stops delivering posts at that point.

What happens when a run reaches its time limit? The actor watches the run's timeout (300 seconds unless you change it in Run options). About 15 seconds before it, the actor stops starting new requests (one still running is cut 10 seconds before the limit), keeps every post already delivered and ends as Succeeded. The summary row then says ended_on_deadline: true, and last_after_cursor points just after the last post handled, so a second run with that value in after continues exactly where the first stopped. A post is never delivered without the comments you asked for. Comments cost one request per post, so includeComments with a large maxPosts needs more time: a local test fetched 66 posts with their comment trees in about 100 seconds.

Can I get the comments of a post without scraping the whole subreddit? Yes. Use post mode with the thread URLs. Comments are always fetched in that mode, up to maxCommentsPerPost and maxDepth.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/reddit-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: 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-scraper "https://mcp.apify.com/?tools=themineworks/reddit-scraper".

It is also one of the tools inside our Social Research MCP server, which bundles 8 social research tools.

Is it legal to scrape Reddit? The actor reads only public posts and comments, the content anyone can see without logging in, and nothing behind a login. Public posts can still contain personal data such as usernames. You are responsible for how you use the data, including Reddit's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

Integrations

Results land in a standard Apify dataset, so they connect without extra code:

  • Google Sheets: send each run's posts to a sheet with Apify's Google Sheets integration.
  • Make, Zapier and n8n: start a run and read its dataset with the official Apify apps and nodes.
  • Webhooks: get a call to your own URL when a run succeeds, then fetch the dataset.
  • API and SDKs: start runs and read results with the Apify API, or the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through https://mcp.apify.com/?tools=themineworks/reddit-scraper.

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

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.

Reddit Scraper pulls public Reddit posts and nested comment threads from subreddits, search, users or post links, with no login, from $1 per 1,000 posts.