# Reddit Scraper: Posts, Comments, Subreddits & Users (`scrape-lads/reddit-scraper`) Actor

Scrape Reddit posts and comments from subreddits, user profiles and post URLs, with date and score filters. No login, no API key. Titles, full text, scores, flair, images, video and full comment threads as JSON, CSV or Excel. Keyword search is paused while Reddit blocks it.

- **URL**: https://apify.com/scrape-lads/reddit-scraper.md
- **Developed by:** [Scrape Lads](https://apify.com/scrape-lads) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions
- **Stats:** 10 total users, 5 monthly users, 95.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Reddit Scraper do?

**Reddit Scraper** downloads public **Reddit posts and comments** as structured data from three kinds of input: **subreddits**, **user profiles** and **single post URLs**. It reads [Reddit](https://www.reddit.com) the way a logged-out visitor does: no login, no Reddit API key, no OAuth app, no rate-limited developer account. Each post row has the title, full text, author, subreddit, score, upvote ratio, comment count, flair, post type, link, images, video and date. Each comment row has its text, author, score, date, reply depth and parent, so you can rebuild the whole thread.

**Keyword search is currently unavailable.** Since November 2026 Reddit has refused keyword searches from logged-out visitors, for posts, comments, communities and users alike. Those runs end as FAILED and cost only the $0.003 run start. Subreddits, user profiles and post URLs still work. To follow a topic, add the subreddits that discuss it and use **Must contain keywords**.

Optional **keyword filters**, **date filters** and **AI tags for demand research** (pain points, tool requests, willingness to pay, feature requests, products named, sentiment) turn the subreddits you pick into a list of people asking for what you build.

Run it from the Apify Console or call it as a **Reddit API alternative**, schedule it, and send results to Google Sheets, Zapier, Make, webhooks or your own database.

### What data can you extract from Reddit?

| 📰 Post title | 📝 Post body | 💬 Comments and replies |
|---|---|---|
| 👤 Author | 🏘️ Subreddit | ⬆️ Score |
| 🔢 Comment count | 📅 Created at | 🏷️ Flair |
| 🖼️ Images | 🎬 Video URL and duration | 🔗 Outbound link and domain |
| 🧵 Reply depth | 🌐 Language | 🔞 NSFW and spoiler flags |

### Why use Reddit Scraper?

- **Brand monitoring and social listening:** watch the subreddits in your market for posts that name your brand, product or competitor.
- **SaaS idea and demand research:** find people who ask for a tool, complain about one, or say what they would pay. Turn on **AI tags** to get the pain point and the products named in every post and comment.
- **Market and product research:** see what people ask, recommend and complain about in any subreddit.
- **Sentiment analysis and AI datasets:** clean post and comment text with scores, dates and thread structure.
- **No Reddit API needed:** Reddit closed self-service API keys in 2025. This scraper needs none.
- **Cheap and predictable:** $1 per 1,000 posts and $0.50 per 1,000 comments. No subscription.

### How to scrape Reddit

1. Add subreddits, users or post URLs under **Reddit URLs** (for example `r/python`, `https://www.reddit.com/r/technology/top/?t=week`, `u/spez`).
2. Pick the sort (Hot, New, Top, Rising, Controversial) and the time range.
3. Set **Max results per URL or keyword**, and **Max comments per post** if you want comment threads.
4. Optional: add **Must contain keywords**, a **Posted after** date, or turn on **AI tags**.
5. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### What can it scrape?

| Input            | Example                                                | What you get                                            |
| ---------------- | ------------------------------------------------------ | ------------------------------------------------------- |
| Subreddit        | `r/startups`, `reddit.com/r/startups/top/?t=month`     | Posts in Hot, New, Top, Rising or Controversial order   |
| User profile     | `u/spez`, `reddit.com/user/spez/`                      | The user's posts, newest first or top                   |
| Post URL         | `reddit.com/r/x/comments/abc123/...`, `redd.it/abc123` | One post with its full comment thread                   |

Every post can also bring its comments: set **Max comments per post** above 0. Replies are included with their depth and parent ID; turn off **Include replies** to keep only top-level comments.

### Input

| Field                                                           | What it does                                                                                                                             |
| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Reddit URLs                                                     | Subreddits, users and posts, full URLs or short forms                                                                      |
| Subreddit and user sort, Time range                | Hot, New, Top, Rising, Controversial; hour to all time                                               |
| Max results per URL or keyword, Max posts per run               | Caps; a run also stops at your maximum cost limit                                                                                        |
| Max comments per post, Comment sort, Include replies            | Comment threads (Best, Top, New, Controversial, Old, Q\&A)                                                                                |
| Posted after / before                                           | Posts only: `2026-10-01`, an ISO time, or `7 days`, `12 hours`                                                                           |
| Comments posted after / before                                  | Comments only, same formats                                                                 |
| Must contain keywords, Exclude keywords, Keyword match          | Keep rows that contain any (or all) keywords and none of the excluded ones. Whole words, case-insensitive; `automat*` matches any ending |
| Filter post comments by keywords too                            | Off: every comment of a kept post is saved. On: thread comments must match too                                                           |
| Minimum score, Skip pinned posts, Skip NSFW posts               | Quality filters                                                                                                                          |
| AI tags for demand research                                     | Adds `aiTags` to every post and comment (+$1 per 1,000 tagged rows)                                                                      |

Rows removed by a filter, and duplicates across your inputs, are never charged. Keywords are matched on title + text for posts and on the text for comments.

### Output

A post:

```json
{
    "dataType": "post",
    "id": "1x4jwxm",
    "url": "https://www.reddit.com/r/tifu/comments/1x4jwxm/tifu_by_asking_my_coworker_about_her_kindle_that/",
    "title": "TIFU by asking my coworker about her Kindle that died",
    "body": "she meant Kendell. Her daughter. ...",
    "author": "v-fee",
    "subreddit": "tifu",
    "createdAt": "2026-10-13T01:35:57.185Z",
    "score": 7296,
    "upvoteRatio": 0.98,
    "numComments": 273,
    "postType": "text",
    "flair": "S",
    "images": [],
    "videoUrl": null,
    "source": "r/tifu"
}
```

A comment:

```json
{
    "dataType": "comment",
    "id": "o2k5d7e",
    "url": "https://www.reddit.com/r/programming/comments/1qqxvlw/comment/o2k5d7e/",
    "postId": "1qqxvlw",
    "postTitle": "Anthropic: AI assisted coding doesn't show efficiency gains...",
    "parentId": "t3_1qqxvlw",
    "depth": 0,
    "author": "arlaneenalra",
    "body": "It's called a \"perishable skill\" you have to use it or you lose it.",
    "score": 1479,
    "createdAt": "2026-01-30T06:36:11.512Z"
}
```

With **AI tags** on, every post and comment also gets:

```json
{
    "aiTags": {
        "painPoint": "Auto reconciliation with QuickBooks was horrendous, manual fixes",
        "asksForRecommendation": false,
        "willingToPay": false,
        "featureRequest": "AI agent resolving transaction issues",
        "productsMentioned": ["Alternative Payments", "QuickBooks Premier", "FlexPoint"],
        "sentiment": "mixed"
    }
}
```

`aiTags` is `null` when tagging is off or the AI could not tag that row (such rows are not charged for tagging).

| Field                                                                          | Meaning                                                                         |
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
| dataType                                                                       | `post` or `comment`                                        |
| id, fullname, url                                                              | Reddit ID (`1x4jwxm`), full name (`t3_1x4jwxm`) and link                        |
| title, body                                                     | Post title and full text |
| author, authorId, authorUrl                                                    | The author (`[deleted]` when removed)                                           |
| subreddit, subredditId, subredditUrl                                           | The community                                                                   |
| createdAt                                                                      | UTC publish time                                                                |
| score, upvoteRatio, numComments, awardCount                                    | Engagement                                                                      |
| postType, domain, link, flair, language                                        | text, link, image, gallery or video, and the external link                      |
| images, thumbnailUrl, videoUrl, videoHlsUrl, videoDurationSec                  | Media (original i.redd.it images, MP4 and HLS video)                            |
| isNsfw, isSpoiler, isStickied                                                  | Flags                                                                           |
| postId, postUrl, postTitle, parentId, depth                                    | Comments only: the thread and the comment it answers                            |
| aiTags                                                                         | AI tags (posts and comments, when turned on)                                    |
| source, sourceType, scrapedAt                                                  | Which input found the row, and when                                             |

### How much does it cost to scrape Reddit?

Pay per event: **$1 per 1,000 posts**, **$0.50 per 1,000 comments**, and $0.003 per run. The per-run fee is charged when a run starts, even if the run later fails. **AI tags** add $1 per 1,000 tagged posts or comments. 1,000 posts cost about $1. 100 posts with 50 comments each (5,000 comments) cost about $2.60, or about $7.70 with AI tags. Runs on the Apify free plan work within the monthly credit.

### Tips

- For brand monitoring, add the subreddits in your market with the New sort, put your brand names in **Must contain keywords**, set **Posted after** to `1 day`, and schedule the run daily.
- For SaaS demand research, add the subreddits your buyers use, set **Must contain keywords** to phrases like `looking for a tool`, `alternative to` or `is there an app`, and turn on **AI tags**. Then filter the dataset on `aiTags.asksForRecommendation` or `aiTags.willingToPay`.
- Use **Must contain keywords** to keep only rows that name your market (`crm*`, `invoic*`). Filtered rows cost nothing.
- For a subreddit's best content, use `reddit.com/r/<name>/top/?t=year` or pick Top and a time range.
- Use **Comment sort: Top** with a small **Max comments per post** to get the most upvoted opinions fast.
- Memory is capped at 512 MB.

### Run it on a schedule

Save your input as a task, then open **Schedules** in Apify Console and pick how often it runs. Daily is the usual choice for brand monitoring. Weekly works for market research. Each run creates a new dataset, so you can compare runs over time.

To send results somewhere automatically, use the **Integrations** tab: Google Sheets, Slack, Make, Zapier, n8n and webhooks are built in. AI agents such as Claude or ChatGPT can run it as a tool through the [Apify MCP server](https://mcp.apify.com?tools=scrape-lads/reddit-scraper).

### Use it with Claude, ChatGPT or Cursor (MCP)

Add this Actor as a tool in Claude, ChatGPT, Cursor, VS Code or any other MCP client. Use this server URL:

```
https://mcp.apify.com?tools=scrape-lads/reddit-scraper
```

Sign in with your Apify account when asked. Then ask your agent in plain words, for example:

> Get the top 50 posts from r/homelab this month and their comments.

The agent runs this Actor and reads the results for you. Runs are billed to your Apify account at this Actor's prices.

In Claude Code, add it with one command:

```bash
claude mcp add --transport http reddit-scraper "https://mcp.apify.com?tools=scrape-lads/reddit-scraper"
```

### Related actors

| Actor | What it does |
| --- | --- |
| [TikTok Scraper Pro](https://apify.com/scrape-lads/tiktok-scraper-pro) | TikTok hashtags, profiles, keyword search, comments and followers. |
| [Video Transcript Scraper](https://apify.com/scrape-lads/video-transcript-scraper) | Transcripts from TikTok, Instagram, YouTube and X videos. |
| [Tweet Scraper V2](https://apify.com/apidojo/tweet-scraper) | Tweets from X by search, profile or list. |
| [Google Search Results Scraper](https://apify.com/apify/google-search-scraper) | Google search results for any keyword. |

### FAQ, limits and support

**Is it legal to scrape Reddit?** It collects only public posts and comments that any logged-out visitor can see. You are responsible for using the data in line with Reddit's terms and privacy laws such as GDPR.

**How many posts can I get?** Reddit lists up to about 1,000 posts per feed, and its New feed often ends sooner for logged-out visitors. To go further, combine sorts and time ranges (Top of the year, Top of the month, New), or schedule runs to collect new posts over time. Duplicates across inputs are removed.

**Can I search Reddit by keyword?** Not at the moment. Reddit refuses keyword searches from logged-out visitors, so posts, comments, communities and users searches all fail, and the run ends as FAILED instead of returning an empty result. The search fields stay in the input so existing setups keep their settings. Use subreddits with **Must contain keywords** instead. It covers only the subreddits you list, so add every community that discusses your topic.

**How do the keyword filters work?** A row is kept when it contains at least one **Must contain** keyword (or all of them with **Keyword match: All**) and none of the **Exclude** keywords. Matching ignores case and works on whole words, so `crm` does not match `crmjewelers`; end a word with `*` to match any ending. Filtered rows are never charged.

**What do the AI tags cost and how good are they?** $1 per 1,000 tagged posts or comments, on top of the row itself. A fast language model reads each post or comment (the first 1,500 characters) and returns short tags. They are meant for sorting and filtering large lists, not as a final judgment: spot-check the rows you act on. If the AI service has a problem, rows are still saved with `aiTags: null` and are not charged for tagging.

**Does it scrape NSFW or private communities?** Private, banned and quarantined communities are not visible to logged-out visitors. Found a problem or want a field added? Open an Issue on the Actor's Issues tab.

**Does Reddit have an official API? Why use this instead?** Reddit's Data API needs an approved app, has strict rate limits, and charges for commercial use. This Actor reads the public pages any logged-out visitor sees, so there is no app approval or API key, and you pay only for the posts and comments you collect.

**What are the alternatives to this Actor?** You can read threads by hand, use a social listening tool, or work with the Data API. Listening tools charge monthly and often cover Reddit poorly. This Actor gives you the raw posts and comments with filters and optional AI tags.

### Privacy

To see which searches are useful, this Actor sends anonymous run inputs (such as keywords, hashtags and usernames) and a hashed account ID to the developer. Tokens, cookies and proxy settings are never sent. Nothing from your results is collected.

# Actor input Schema

## `startUrls` (type: `array`):

Subreddits, user profiles or single posts, one per line. Full URLs (reddit.com/r/python/top/?t=week, reddit.com/user/spez, reddit.com/r/x/comments/abc123/...) and short forms (r/python, u/spez) both work.

## `searchTerms` (type: `array`):

Currently unavailable: Reddit refuses these searches. Search all of Reddit for these words or phrases, one per line. Each keyword is its own search.

## `searchSubreddit` (type: `string`):

Limit the keyword searches to one subreddit, for example "startups". Leave empty to search all of Reddit.

## `searchPosts` (type: `boolean`):

Keyword searches return matching posts.

## `searchComments` (type: `boolean`):

Keyword searches also return matching comments, with their full text and the post they are on. Charged as comments.

## `searchCommunities` (type: `boolean`):

Keyword searches also return matching subreddits with their description and weekly activity.

## `searchUsers` (type: `boolean`):

Keyword searches also return matching user profiles with their karma and bio.

## `sort` (type: `string`):

Order of subreddit and user posts. A sort in the URL itself (reddit.com/r/x/new/) wins over this setting. User profiles read New unless you pick Top.

## `searchSort` (type: `string`):

Order of keyword search results. Keyword search is currently unavailable.

## `time` (type: `string`):

Time window for Top and Controversial sorts and for searches.

## `maxPostsPerSource` (type: `integer`):

Stop each subreddit, user or search once this many results pass your filters (posts, or comments, communities or users for those searches). Reddit lists at most about 1,000 posts per feed.

## `maxPosts` (type: `integer`):

Total cap on posts across all URLs and keywords. The run stops reading posts when it is reached. Comment, community and user searches are capped per keyword only.

## `maxCommentsPerPost` (type: `integer`):

Also save up to this many comments for every post. 0 saves posts only. Comments are charged separately (see Pricing).

## `commentSort` (type: `string`):

Which comments come first when a post has more than you ask for.

## `includeReplies` (type: `boolean`):

Save replies to comments too (each row has its depth and parent). Turn off to keep only top-level comments.

## `searchFullPosts` (type: `boolean`):

Keyword search is currently unavailable. Reddit's search page shows only an excerpt of each post. Turn this on to open every result for its full text, media, flair and upvote ratio. Slower, and each opened result costs an extra $0.001.

## `postedAfter` (type: `string`):

Keep only posts published on or after this date. YYYY-MM-DD (UTC), an ISO timestamp, or a relative value such as "7 days" or "12 hours". Posts outside the range are not charged.

## `postedBefore` (type: `string`):

Keep only posts published on or before this date (a bare date includes that whole day). Same formats as Posted after.

## `commentsPostedAfter` (type: `string`):

Keep only comments published on or after this date. Same formats as Posted after. Applies to post comments and comment search results. Comments outside the range are not charged.

## `commentsPostedBefore` (type: `string`):

Keep only comments published on or before this date (a bare date includes that whole day).

## `includeKeywords` (type: `array`):

Keep only rows whose text contains these words or phrases (case-insensitive, whole words; end a word with \* to match any ending, e.g. automat\*). Posts are matched on title + text, comments on their text, communities and users on name + description. Filtered rows are not charged.

## `excludeKeywords` (type: `array`):

Drop rows that contain any of these words or phrases. Same matching as above.

## `keywordMatch` (type: `string`):

Keep a row when it contains any of the "must contain" keywords, or only when it contains all of them.

## `keywordFilterComments` (type: `boolean`):

Off: every comment of a kept post is saved. On: comments under posts must match the keywords too. Comment search results are always filtered.

## `minScore` (type: `integer`):

Skip posts with fewer upvotes (net score) than this.

## `skipStickied` (type: `boolean`):

Skip posts pinned to the top of a subreddit or profile.

## `skipNsfw` (type: `boolean`):

Skip posts marked NSFW (18+).

## `aiTagging` (type: `boolean`):

Add an aiTags field to every post and comment: the pain point, whether the writer asks for a tool or recommendation, is willing to pay or mentions a price, a feature request, the products named, and the sentiment. Each tagged row costs extra (see Pricing).

## `maxConcurrency` (type: `integer`):

How many pages load at the same time.

## `proxyConfiguration` (type: `object`):

The Actor brings its own residential proxy pool. This setting is only a fallback.

## Actor input object example

```json
{
  "startUrls": [
    "r/python",
    "https://www.reddit.com/r/technology/top/?t=week",
    "u/spez"
  ],
  "searchTerms": [
    "web scraping",
    "best crm for startups"
  ],
  "searchPosts": true,
  "searchComments": false,
  "searchCommunities": false,
  "searchUsers": false,
  "sort": "hot",
  "searchSort": "relevance",
  "time": "week",
  "maxPostsPerSource": 50,
  "maxPosts": 1000,
  "maxCommentsPerPost": 0,
  "commentSort": "best",
  "includeReplies": true,
  "searchFullPosts": false,
  "includeKeywords": [
    "looking for",
    "recommend*",
    "alternative to"
  ],
  "excludeKeywords": [
    "giveaway",
    "hiring"
  ],
  "keywordMatch": "any",
  "keywordFilterComments": false,
  "skipStickied": false,
  "skipNsfw": false,
  "aiTagging": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `allFields` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "r/webscraping"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape-lads/reddit-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": ["r/webscraping"] }

# Run the Actor and wait for it to finish
run = client.actor("scrape-lads/reddit-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "r/webscraping"
  ]
}' |
apify call scrape-lads/reddit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape-lads/reddit-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OgOdTEh4z2EIDPiRg/builds/XsQ0MViuqCNcu0bi2/openapi.json
