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

Scrape Reddit posts and comments from subreddits, keyword searches, user profiles and post URLs. No login, no API key. Titles, full text, scores, flair, images, video and full comment threads as JSON, CSV or Excel.

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

## Pricing

from $1.00 / 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.

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, comments, communities and user profiles** as structured data from four kinds of input: **subreddits**, **keyword searches**, **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 searches can return **posts, comments, communities and users**. Optional **keyword filters**, **comment date filters** and **AI tags for demand research** (pain points, tool requests, willingness to pay, feature requests, products named, sentiment) turn Reddit 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.

### Why use Reddit Scraper?

- **Brand monitoring and social listening:** search Reddit posts and comments for 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.
- **Community discovery:** search for subreddits and users about a topic, with weekly visitors, contributions and karma.
- **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, post URLs or Reddit search URLs under **Reddit URLs** (for example `r/python`, `https://www.reddit.com/r/technology/top/?t=week`, `u/spez`).
2. Or add words under **Search keywords** to search all of Reddit (or one subreddit). Tick **Search comments**, **Search communities** or **Search users** to get those too.
3. Pick the sort (Hot, New, Top, Rising, Controversial) and the time range.
4. Set **Max results per URL or keyword**, and **Max comments per post** if you want comment threads.
5. Optional: add **Must contain keywords**, a **Comments posted after** date, or turn on **AI tags**.
6. 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   |
| Keyword search   | `best crm for startups`                                | Matching posts from all of Reddit or from one subreddit |
| Comment search   | keyword + **Search comments**                          | Matching comments with full text and their post         |
| Community search | keyword + **Search communities**                       | Subreddits with description and weekly activity         |
| User search      | keyword + **Search users**                             | User profiles with karma and bio                        |
| Search URL       | `reddit.com/search/?q=notion&sort=new&type=comments`   | The same search, with its type, sort and time range     |
| 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, posts and search pages, full URLs or short forms                                                                      |
| Search keywords, Search inside one subreddit                    | Keyword searches across Reddit or inside one community                                                                                   |
| Search posts, Search comments, Search communities, Search users | What each keyword search returns (posts only by default; tick several to get each)                                                       |
| Subreddit and user sort, Search sort, Time range                | Hot, New, Top, Rising, Controversial; Relevance, Top, New, Most comments; 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)                                                                                |
| Full text for search results                                    | Search pages show an excerpt; this opens each result for the full post (+$1 per 1,000)                                                   |
| Posted after / before                                           | Posts only: `2026-10-01`, an ISO time, or `7 days`, `12 hours`                                                                           |
| Comments posted after / before                                  | Comments only (thread comments and comment search results), 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, the text for comments, and name + description for communities and users. For search results without **Full text**, posts are matched on the title and the search excerpt.

### 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"
}
```

A comment from a comment search (full text; `parentId` and `depth` are null because search results do not say where in the thread a comment sits):

```json
{
    "dataType": "comment",
    "id": "pdxvm6m",
    "url": "https://www.reddit.com/r/CRM/comments/1wwdkzw/best_crm_for_a_growing_escrow_company_with_field/pdxvm6m/",
    "postId": "1wwdkzw",
    "postTitle": "Best CRM for a growing escrow company with field sales reps + RBJ integration?",
    "parentId": null,
    "depth": null,
    "author": "RecordPotential4323",
    "body": "Run your business process through https://doineedacrm.com . It's not a CRM but kind of a recommendation system.",
    "score": 1,
    "createdAt": "2026-10-05T02:56:17.449Z",
    "subreddit": "CRM",
    "sourceType": "search"
}
```

A community and a user:

```json
{
    "dataType": "community",
    "id": "2vubg",
    "name": "CRMSoftware",
    "url": "https://www.reddit.com/r/CRMSoftware/",
    "description": "This reddit was created for both CRM professionals to discuss new technologies, best practices, and implementation processes...",
    "weeklyVisitors": 7390,
    "weeklyContributions": 1203,
    "iconUrl": null,
    "isNsfw": false,
    "isQuarantined": false
}
```

```json
{
    "dataType": "user",
    "id": "84rwqil0",
    "username": "crmjewelers",
    "url": "https://www.reddit.com/user/crmjewelers/",
    "description": "Family owned jewelry boutique in Downtown Miami...",
    "karma": 71038,
    "avatarUrl": null,
    "isNsfw": false
}
```

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`, `comment`, `community` or `user`                                        |
| id, fullname, url                                                              | Reddit ID (`1x4jwxm`), full name (`t3_1x4jwxm`) and link                        |
| title, body, bodyIsExcerpt                                                     | Post title and full text (an excerpt only for search results without 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                            |
| name, description, weeklyVisitors, weeklyContributions, iconUrl, isQuarantined | Communities only                                                                |
| username, description, karma, avatarUrl                                        | Users only                                                                      |
| 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**, **$1 per 1,000 communities or users**, and $0.003 per run. **Full text for search results** adds $1 per 1,000 opened results, because each one is a full Reddit page. **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, search with **Search sort: New**, tick **Search comments**, set **Posted after** and **Comments posted after** to `1 day`, and schedule the run daily.
- For SaaS demand research, search phrases like `looking for a tool`, `alternative to <product>` or `is there an app that`, tick **Search comments**, 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.

### 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 or search, 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 comments, communities and users?** Yes. Tick **Search comments**, **Search communities** or **Search users** next to your keywords, or paste a Reddit search URL with `type=comments`, `type=communities` or `type=people`. Comment search results have the full comment text and the post they belong to. Communities and people searches have no sort or time range on Reddit.

**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.

**Why does a search result have a short body?** Reddit's search page shows an excerpt of each post. Turn on **Full text for search results** to open each result for the full text and media (an extra $1 per 1,000 results). Comment search results always have the full comment.

**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.

### 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, single posts or search pages, one per line. Full URLs (reddit.com/r/python/top/?t=week, reddit.com/user/spez, reddit.com/r/x/comments/abc123/..., reddit.com/search/?q=...) and short forms (r/python, u/spez) both work.

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

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.

## `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`):

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/5v2DcwffpLp6aSSFl/openapi.json
