# Reddit Subreddit Posts Scraper | Fast Bulk Feed Export (`clearpath/reddit-subreddit-posts-scraper`) Actor

Scrape Reddit subreddit feeds in seconds: up to ~1,000 posts per subreddit on hot and new, ~500 on top and controversial. Time filters, optional comments (up to 1,000 per post), bulk input via names, URLs, or CSV.

- **URL**: https://apify.com/clearpath/reddit-subreddit-posts-scraper.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (community)
- **Categories:** Lead generation, Social media, Automation
- **Features:** Limited permissions
- **Stats:** 1,400 total users, 452 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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

## Reddit Subreddit Posts Scraper | Export Feed Data in Bulk (2026)

[![4,575 POSTS. UNDER 100 SECONDS. MULTIPLE SUBREDDITS. IN PARALLEL. 108 FIELDS PER POST.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/reddit-subreddit-posts-scraper-readme-hero-v1.png)](https://console.apify.com/actors/9SchRh78ZcQprr5V8/input)

**2026-10-06**: A link to a post or a name that is not a valid subreddit now gets a status row (`post_url`, `invalid_name`) instead of being dropped or read as a whole feed, and an input with no subreddit says so. Field names from other Reddit actors (`maxItems`, `time`, `searches`, `subredditNames`, ...) are now read when this actor's own field is absent.

**2026-10-05**: New `maxAgeHours` keeps only posts from the last N hours on any sort, and you pay only for those. A subreddit that is checked and returns no posts now gets a status row saying why (`empty`, `banned`, `not_found`, ...).

Built by <strong>Clearpath</strong>, with <strong>150,000+ combined lifetime runs</strong> across <a href="https://apify.com/clearpath/reddit-search-scraper">Reddit Search</a>, <a href="https://apify.com/clearpath/reddit-post-comments-bulk-scraper">Post & Comments</a> and <a href="https://apify.com/clearpath/reddit-subreddit-posts-scraper">Subreddit Posts</a>. A specialist suite for Reddit research.

#### Copy to your AI assistant

```text
Help me use clearpath/reddit-subreddit-posts-scraper on Apify. Read https://apify.com/clearpath/reddit-subreddit-posts-scraper.md for documentation, input schema, pricing and limits. Posts and optional comments are separate rows and billed separately. Choose settings for my requested outcome. If you cannot retrieve the page, ask me to paste the relevant sections. To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### Why choose this actor?

<strong>Collect multiple subreddits in parallel.</strong> 4,575 posts in under 100 seconds, with comments switched off. Paste community names, add URLs or upload a list to collect multiple feeds together.

<strong>Get 108 fields per post.</strong> Export full text, media URLs, scores, upvote ratios, flair and crosspost information, with subreddit context alongside each record. Keep the detail you need for content research and community monitoring.

<strong>Choose the feed. Add the discussion.</strong> Collect hot, new, top, rising or controversial posts. Use time filters for top and controversial feeds, and optionally add comments with reply structure and author details.

<a href="https://console.apify.com/actors/9SchRh78ZcQprr5V8/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/reddit-subreddit-posts-scraper-readme-cta-v1.svg" width="240" height="48" alt="Choose your subreddits"/></a>

### Quick start

Try the top posts of the week from three communities, up to 20 posts each.

```json
{
  "subreddits": [
    "technology",
    "science",
    "productivity"
  ],
  "sort": "top",
  "timeFilter": "week",
  "maxPostsPerSubreddit": 20,
  "includeComments": false
}
```

<a href="https://console.apify.com/actors/9SchRh78ZcQprr5V8/input">Open actor input</a> to replace the communities, change the sort or upload a list. Export JSON, CSV or Excel; JSON preserves nested media and crosspost data.

Reddit's hot and new feeds reach about 1,000 posts per subreddit, top and controversial about 500, and rising about 25. Comments are optional, take additional time and are billed separately. Available fields vary by post type.

<table>
<tr>
<td style="background:#FF4500;color:#171717;padding:10px 14px;font-size:13px;font-weight:700;border-radius:4px 4px 0 0">Clearpath · Reddit Suite</td>
</tr>
<tr>
<td style="padding:6px;border:1px solid #F3D6BF;border-top:none;border-radius:0 0 4px 4px;background:#FFF2E8">
<span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFE3CF"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-9SchRh78ZcQprr5V8-D4wuc5kLga-reddit-user-posts-comments-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-subreddit-posts-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Subreddits</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">You are here</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-5LOwKe4dIDEJ64I58-RDxgtg9AKM-reddit-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-search-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Search</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Keyword research</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-AcNroNEs63pztgCy6-BEG4cWB3Re-reddit-user-posts-comments-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-post-comments-bulk-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Comments</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Full discussions</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-REPQBdd4quAa6q7RN-exwLn5TkWz-reddit-user-posts-comments-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-user-content-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">User Content</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Posts & comments</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-LA9VzVDphD8rUCFnW-fLjTXd3OC3-reddit-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-profile-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Profiles</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Karma & accounts</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-IRgwoYrBv3LN1x7eD-OXABeayAUo-medium-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/medium-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Medium</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Articles & full text</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-xLv7VvQUFabP4Eku9-rn8bCwuw6A-icon-512.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/substack-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Substack</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Newsletters & full text</span></span><span style="display:inline-block;vertical-align:top;margin:3px;padding:8px 8px;border:1px solid #F3D6BF;border-radius:4px;background:#FFF2E8"><span style="white-space:nowrap"><img src="https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/rumble-scraper-readme-logo-v1-77dba1b676c0.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/rumble-scraper" style="color:#202124;text-decoration:none;font-weight:700;font-size:13px">Rumble</a></span><br><span style="color:#454b55;font-size:12px;white-space:nowrap">Videos &amp; transcripts</span></span>
</td>
</tr>
</table>

### Key Features

- **108 fields per post** — score, upvote ratio, flair, awards, media URLs, crosspost data, subreddit subscriber count, and 90+ more fields from the full Reddit feed response
- **5 sort orders** — hot, new, top, rising, controversial. Add time filters (hour, day, week, month, year, all) for top and controversial sorts
- **Recent posts only**: set `maxAgeHours` to keep posts from the last N hours on any sort. Older posts are skipped and not charged
- **Optional comments** — toggle on to fetch up to 1,000 top comments per post, with author, score, depth, and reply structure
- **Bulk subreddit input** — paste names, add URLs, or upload a CSV/TXT file. Mix formats freely: `AskReddit`, `r/AskReddit`, `reddit.com/r/AskReddit`
- **Fast** — posts-only collection returned 4,575 posts in under 100 seconds. Multiple subreddits run in parallel

### How to Scrape Reddit Subreddit Posts

#### Single subreddit, default settings

Paste a subreddit name. The actor fetches up to 100 hot posts with all 108 fields.

```json
{
    "subreddit": "AskReddit"
}
```

All of these formats work interchangeably:

```json
{
    "subreddit": "r/AskReddit"
}
```

```json
{
    "subreddit": "https://www.reddit.com/r/AskReddit"
}
```

#### Top posts of the past week

Set `sort` to `top` and `timeFilter` to `week` to get the highest-scoring posts from the last 7 days.

```json
{
    "subreddit": "technology",
    "sort": "top",
    "timeFilter": "week",
    "maxPostsPerSubreddit": 200
}
```

#### New posts from the last 24 hours

Set `sort` to `new` and `maxAgeHours` to `24`. The run stops reading each subreddit as soon as it reaches a post older than 24 hours, so you get every post from the window and pay only for those. Raise `maxPostsPerSubreddit` if a busy subreddit posts more than that in a day.

```json
{
    "subreddits": ["biotech", "clinicalresearch", "medicaldevices"],
    "sort": "new",
    "maxAgeHours": 24,
    "maxPostsPerSubreddit": 500
}
```

A subreddit with nothing new in the window returns one row with `"_status": "empty"`, so you can tell a quiet subreddit from one that was not checked.

#### Rising posts (catch trends early)

Rising surfaces posts that are gaining traction right now. Useful for monitoring subreddits for breaking content.

```json
{
    "subreddit": "wallstreetbets",
    "sort": "rising"
}
```

#### Posts with comments

Enable `includeComments` to fetch top comments for each post. Each post gets up to `maxCommentsPerPost` comments (default 1,000).

```json
{
    "subreddit": "AskReddit",
    "sort": "top",
    "timeFilter": "day",
    "maxPostsPerSubreddit": 50,
    "includeComments": true,
    "maxCommentsPerPost": 200
}
```

Comments are charged at $1.00 per 1,000.

#### Multiple subreddits in one run

Use the `subreddits` array for small batches. Mix any input format.

```json
{
    "subreddits": [
        "AskReddit",
        "r/technology",
        "https://www.reddit.com/r/science"
    ],
    "sort": "hot",
    "maxPostsPerSubreddit": 100
}
```

Subreddits run in parallel across multiple sessions, so adding more subreddits doesn't proportionally increase run time.

#### Bulk from file

Upload a `.txt` or `.csv` file through the Apify Console, or point to a hosted file URL. TXT files expect one subreddit per line. CSV files auto-detect a `subreddit`, `sub`, or `name` column.

```json
{
    "subredditsFile": "https://example.com/my-subreddits.csv",
    "sort": "new",
    "maxPostsPerSubreddit": 500
}
```

Drag and drop a file directly into the "Subreddits file" field in the Apify Console for the fastest setup.

#### Controversial posts, all time

Find the most divisive posts ever submitted to a subreddit.

```json
{
    "subreddit": "unpopularopinion",
    "sort": "controversial",
    "timeFilter": "all",
    "maxPostsPerSubreddit": 100
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `subreddit` | string | — | A single subreddit name or URL |
| `subreddits` | string\[] | `[]` | Multiple subreddit names or URLs. Use "Bulk edit" to paste a list |
| `subredditsFile` | string | — | Upload a `.txt`/`.csv` file, or paste a URL to a hosted file |
| `sort` | enum | `hot` | Sort order: `hot`, `new`, `top`, `rising`, `controversial` |
| `timeFilter` | enum | `all` | Time range: `hour`, `day`, `week`, `month`, `year`, `all`. Only applies to `top` and `controversial` sorts. With `maxAgeHours`, pick the narrowest range that covers the window |
| `maxAgeHours` | number | none | Keep only posts created within this many hours before the run starts. Works with every sort; older posts are skipped and not charged. On `top`/`controversial` the chosen `timeFilter` bounds it too. Empty keeps posts of any age |
| `minScore` | integer | none | Keep only posts with at least this score. Skipped posts are not charged and do not count toward `maxPostsPerSubreddit` |
| `minComments` | integer | none | Keep only posts with at least this many comments |
| `maxComments` | integer | none | Keep only posts with at most this many comments, for example 30 for threads that are still small |
| `maxPostsPerSubreddit` | integer | `100` | Max posts to scrape per subreddit (1-1,000). Reddit's feeds stop near 1,000 posts for hot and new, about 500 for top and controversial, about 25 for rising |
| `includeComments` | boolean | `false` | Fetch top comments for each post |
| `maxCommentsPerPost` | integer | `1000` | Max comments per post when comments are enabled (1-1,000) |
| `commentSort` | enum | `best` | Comment order when comments are enabled: `best`, `top`, `new`, `old`, `controversial`, `qa` |

Field names from other Reddit actors are read when the matching field above is absent: `subredditNames`, `subredditUrls`, `searches`, `communities`, `subredditName` (subreddits); `time` (timeFilter); `maxItems`, `maxPosts`, `limit` (posts for the whole run: one subreddit gets them all, several share them evenly). A field of this actor always wins.

At least one of `subreddit`, `subreddits`, or `subredditsFile` is required.

#### Sort order reference

| Value | Behavior |
|-------|----------|
| `hot` | Reddit's default. Balances recency and engagement to surface currently active posts |
| `new` | Most recent posts first, regardless of score |
| `top` | Highest score (upvotes minus downvotes). Combine with `timeFilter` to control the time window |
| `rising` | Posts gaining momentum right now. The feed is smaller but catches trends before they hit the front page |
| `controversial` | Posts with roughly equal upvotes and downvotes. Combine with `timeFilter` for different windows |

#### Time filter reference

| Value | Window |
|-------|--------|
| `hour` | Past 60 minutes |
| `day` | Past 24 hours |
| `week` | Past 7 days |
| `month` | Past 30 days |
| `year` | Past 365 days |
| `all` | All time (default) |

Time filters only apply to `top` and `controversial` sort orders. They are ignored for `hot`, `new`, and `rising`. To keep only recent posts on any sort, use `maxAgeHours` instead.

With `top` or `controversial`, pick the **narrowest** time filter that covers the window, for example `day` for `maxAgeHours: 6` and `week` for `maxAgeHours: 168`. Both ends matter:

- A post older than the time filter is never returned, however large `maxAgeHours` is. `day` with `maxAgeHours: 26` is a 24-hour run.
- Reddit ranks each time filter separately by score and each one stops near 500 posts, so a filter much wider than the window returns fewer posts of it, not more. Measured on r/IndieDev over the same 7 days: `week` returned the full 50 posts asked for, `year` returned 6 of 300.

There is no quarter filter, so a 90-day window uses `year` plus `maxAgeHours: 2160` and returns the posts of the last 90 days that are in that subreddit's top year. For a fuller picture of a long window, run the narrower filters as well (`month`, `week`) and merge the results by post `id`. When a run returns fewer posts than asked because a time filter ran out inside the window, its status message says so.

### What Data Can You Extract from Subreddit Posts?

![Output Example](https://iili.io/BxQUuZF.gif)

The output contains two row types: **post** rows and **comment** rows (when comments are enabled). A regular comment row has 31 fields; a deleted comment has 20. Each post row contains 108 fields from the full Reddit feed response. The `_subreddit` field on every row lets you group results when scraping multiple subreddits, and `_post_id` (the post's `name`, `t3_...`) joins each post to its comment rows. Both row types carry `createdAt` as an ISO 8601 UTC string, alongside the raw `created_utc` timestamp on post rows.

#### Post row (108 fields, key fields shown)

```json
{
    "_type": "post",
    "_subreddit": "AskReddit",
    "_post_id": "t3_1sbwqg1",
    "_status": "found",
    "title": "What horrifying statistic genuinely jarred you when you first heard it?",
    "author": "ordrius098",
    "score": 2175,
    "upvote_ratio": 0.96,
    "num_comments": 1932,
    "createdAt": "2026-04-04T02:04:08.000000+0000",
    "editedAt": null,
    "created_utc": 1775268248.0,
    "permalink": "/r/AskReddit/comments/1sbwqg1/...",
    "url": "https://www.reddit.com/r/AskReddit/comments/1sbwqg1/...",
    "selftext": "",
    "domain": "self.AskReddit",
    "is_self": true,
    "over_18": false,
    "spoiler": false,
    "stickied": false,
    "locked": false,
    "num_crossposts": 0,
    "subreddit_subscribers": 58102423
}
```

Every post includes the complete Reddit feed response. Beyond the key fields above, you also get:

**Content and media:**
`selftext_html`, `thumbnail`, `thumbnail_height`, `thumbnail_width`, `preview` (image resolutions), `media` (video/embed metadata), `media_embed`, `secure_media`, `secure_media_embed`, `gallery_data`, `media_metadata`, `is_gallery`, `is_video`, `is_reddit_media_domain`, `post_hint`

**Scores and engagement:**
`score`, `ups`, `downs`, `upvote_ratio`, `num_comments`, `num_crossposts`, `total_awards_received`, `gilded`, `all_awardings`, `top_awarded_type`, `awarders`

**Author and flair:**
`author`, `author_fullname`, `author_flair_text`, `author_flair_css_class`, `author_flair_type`, `author_flair_template_id`, `author_flair_richtext`, `author_flair_background_color`, `author_flair_text_color`, `author_premium`, `author_patreon_flair`

**Post flair and categorization:**
`link_flair_text`, `link_flair_css_class`, `link_flair_type`, `link_flair_template_id`, `link_flair_richtext`, `link_flair_background_color`, `link_flair_text_color`, `category`

**Subreddit metadata:**
`subreddit`, `subreddit_id`, `subreddit_subscribers`, `subreddit_name_prefixed`, `subreddit_type`

**Moderation and status:**
`stickied`, `locked`, `removed_by_category`, `banned_by`, `approved_by`, `mod_reason_by`, `mod_reason_title`, `can_mod_post`, `distinguished`

**URLs and identifiers:**
`id`, `name`, `permalink`, `url`, `url_overridden_by_dest`, `domain`

**Flags:**
`over_18`, `spoiler`, `is_self`, `is_video`, `is_original_content`, `is_meta`, `is_crosspostable`, `is_robot_indexable`, `hide_score`, `archived`, `contest_mode`, `pinned`, `no_follow`, `send_replies`

#### Comment row (when includeComments is enabled)

```json
{
    "_type": "comment",
    "_post_id": "t3_1sbwqg1",
    "_subreddit": "AskReddit",
    "_status": "found",
    "id": "t1_mnx5qs6",
    "author": "leninzen",
    "score": 1202,
    "depth": 0,
    "parentId": null,
    "body": "You do see it slowly build tbh...",
    "createdAt": "2026-04-04T13:03:54.482000+0000",
    "editedAt": null,
    "permalink": "/r/AskReddit/comments/1sbwqg1/.../mnx5qs6/",
    "isStickied": false,
    "isLocked": false,
    "isScoreHidden": false,
    "distinguishedAs": null,
    "authorFlair": null,
    "isDeleted": false,
    "childCount": 11,
    "authorId": "t2_8xk2p",
    "authorAccountType": "USER",
    "authorIsCakeDay": false,
    "authorIcon": "https://styles.redditmedia.com/.../avatar.png",
    "languageCode": "en",
    "isArchived": false,
    "isRemoved": false,
    "removedByCategory": null,
    "isCommercialCommunication": false,
    "isInitiallyCollapsed": false,
    "contentTypeHint": "RTJSON"
}
```

**Comment fields:**

| Field | Type | Description |
|-------|------|-------------|
| `_type` | string | Always `"comment"` |
| `_post_id` | string | Parent post ID (`t3_` prefixed), links this comment to its post |
| `_subreddit` | string | Subreddit name |
| `_status` | string | `found` |
| `id` | string | Comment ID (`t1_` prefixed) |
| `author` | string | Username, or `null` for deleted comments |
| `score` | integer | Upvotes minus downvotes |
| `createdAt` | string | ISO 8601 creation timestamp |
| `editedAt` | string/null | ISO 8601 edit timestamp, or `null` if never edited |
| `depth` | integer | Nesting level. `0` = top-level reply, `1` = reply to a top-level, etc. |
| `parentId` | string/null | Parent comment ID, or `null` for top-level comments |
| `permalink` | string | Relative URL path to the comment |
| `body` | string | Comment text in markdown |
| `isStickied` | boolean | Pinned by a moderator |
| `isLocked` | boolean | Replies disabled |
| `isScoreHidden` | boolean | Score hidden by subreddit rules |
| `distinguishedAs` | string/null | `"moderator"`, `"admin"`, or `null` |
| `authorFlair` | string/null | User's flair text in the subreddit |
| `isDeleted` | boolean | Deleted by author or removed by moderators |
| `childCount` | integer | Number of direct replies |
| `authorId` | string/null | Author account ID (`t2_` prefixed) |
| `authorAccountType` | string/null | Account type (e.g. `USER`) |
| `authorIsCakeDay` | boolean | `true` on the author's account anniversary |
| `authorIcon` | string/null | Author avatar URL |
| `languageCode` | string/null | Detected language of the comment |
| `isArchived` | boolean | `true` if the comment is archived |
| `isRemoved` | boolean | `true` if removed by a moderator |
| `removedByCategory` | string/null | Removal reason category, or `null` |
| `isCommercialCommunication` | boolean | `true` if flagged as paid/commercial |
| `isInitiallyCollapsed` | boolean | `true` if collapsed by default (e.g. low score) |
| `contentTypeHint` | string/null | Body content format hint (e.g. `RTJSON`) |

#### Subreddit status rows

A subreddit that returns no posts gets one row of its own that says why:

```json
{
    "_type": "subreddit",
    "_subreddit": "FDA",
    "_status": "empty"
}
```

| `_status` | Meaning |
|---|---|
| `empty` | The subreddit exists but has no posts, or none inside `maxAgeHours` |
| `no_match` | The subreddit has posts, but none passed `minScore`, `minComments` or `maxComments` |
| `not_found` | No subreddit has this name. Check the spelling |
| `banned` | The subreddit was banned by Reddit |
| `private` | The subreddit is private |
| `quarantined`, `gold_only`, `gated` | Reddit restricts access to the subreddit |
| `unreachable` | The subreddit could not be loaded this time, or Reddit did not confirm whether it exists. Run it again |
| `invalid_name` | The input entry is not a valid subreddit name (names are 2-21 letters, digits or underscores) |
| `post_url` | The input entry is a link to a post, not a subreddit; `url` holds it. Use [Reddit Post & Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper) for single posts |

Status rows are never charged as posts. Post rows carry `"_status": "found"`.

### Comments Add-on

Comments are optional and off by default. When you enable `includeComments`, the actor fetches the top comments for each post in a separate pass after collecting all posts.

#### How the pricing works

| Component | Cost |
|-----------|------|
| Posts | $1.99 per 1,000 posts |
| Comments | $0.99 per 1,000 comments |

Posts and comments are billed separately, and you pay only for the rows you receive. Comments are optional and off by default, so a posts-only run never incurs comment charges.

#### Cost examples

| Scenario | Posts | Comments | Estimated cost |
|----------|-------|----------|----------------|
| 100 posts, no comments | 100 | 0 | ~$0.20 |
| 100 posts, 100 comments each | 100 | 10,000 | ~$0.20 + $9.90 = ~$10.10 |
| 50 posts, 500 comments each | 50 | 25,000 | ~$0.10 + $24.75 = ~$24.85 |
| 1,000 posts, no comments | 1,000 | 0 | ~$1.99 |

For large comment volumes, consider [Reddit Post & Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper) instead. It is built specifically for deep comment extraction with full tree expansion, six sort orders, and Q\&A filtering.

### When a Run Returns No Posts

An empty result is not always the same thing, so every run that returns nothing says why in its status message:

| Status message | What it means |
|---|---|
| No posts found. The subreddit may be empty, private, or may not exist. | Reddit answered, and there is genuinely nothing to return for this input. A trustworthy zero. |
| No posts found from the last N hours. Each subreddit's status row says why. | `maxAgeHours` was set and no subreddit had a post inside the window. The status rows show which subreddits were empty, missing or restricted. |
| Couldn't reach Reddit. Please try again in a few minutes. | One or more subreddits could not be loaded at all. Retry. |
| Found N posts, but part of the run could not be completed. | Some subreddits delivered, others were cut short. Raise the run timeout to get the rest. |
| The run ended before all of the input was processed. | The run hit its timeout before every subreddit was checked. Raise the run timeout and try again. |
| Stopped after N posts: the run reached its spending limit. | Your spending limit for the run was reached. You keep everything delivered up to that point; raise the limit to get more. |
| No posts delivered: the run reached its spending limit before the first one. | The limit was too low to pay for a single post. Raise it, or add credit to your account. |

A successful run that returned everything sets no status message.

### Pricing — Pay Per Event (PPE)

<table>
<tr>
<td style="padding:12px 16px;background:#FFF7ED;border:2px solid #E29578;border-radius:6px">
<span style="font-size:18px;font-weight:700;color:#E29578">$1.99 per 1,000 posts&nbsp;&nbsp;&bull;&nbsp;&nbsp;$0.99 per 1,000 comments</span>
</td>
</tr>
</table>

You pay only for what you scrape. Posts and comments are charged separately.

**Budget controls:** Set a spending limit on any run from the Apify Console. The actor stops automatically when the budget is reached, and you keep all data scraped up to that point. The run's status message then says it stopped at your limit and how much it delivered, so a capped run never looks complete. When the limit cannot cover every subreddit you asked for, a run without comments gives each subreddit an equal share of it first, and what is left goes to subreddits that have more posts.

### Use Cases

**Subreddit monitoring.** Track a subreddit's front page over time. Schedule daily runs with `sort: "hot"` to capture what's trending. Compare scores, comment counts, and upvote ratios across snapshots to detect shifts in community interest. Export to Google Sheets via Apify integrations for automatic dashboards.

**Trend detection.** Use `sort: "rising"` to catch posts gaining traction before they hit the front page. Rising surfaces content early in its lifecycle, giving you a head start on breaking topics, viral content, and emerging discussions. Ideal for brand monitoring, news tracking, and competitive research.

**Content research.** Pull top posts from niche subreddits to understand what resonates with specific audiences. The `upvote_ratio` field tells you how divisive a topic is: 0.95+ means near-universal agreement, while 0.50-0.60 indicates a split community. Flair data reveals the content categories a community values most. Combine with time filters to study seasonal patterns.

**Dataset building.** Export structured subreddit data for analysis, machine learning, or data journalism. The 108 fields per post give you more metadata than most Reddit datasets, including media URLs, crosspost chains, award breakdowns, and author flair. Download as JSON, CSV, or Excel from the Apify Console, or pipe directly into your data pipeline via the Apify API.

**Competitor analysis.** Scrape brand-related subreddits to see what customers discuss, complain about, and recommend. Compare engagement metrics across multiple subreddits in a single run. The `num_comments` and `upvote_ratio` fields are strong signals for how much discussion a topic generates and whether the sentiment skews positive or negative.

**Academic research.** Study posting patterns, community dynamics, and content virality. The `created_utc` timestamp combined with score data lets you analyze how posts perform over different time windows. Crosspost fields reveal how content spreads between communities. Schedule recurring runs to build longitudinal datasets.

**Lead generation.** Monitor subreddits where your target audience asks for recommendations. Posts in subreddits like r/SaaS, r/Entrepreneur, or r/freelance often contain explicit purchase intent. Export the data and filter by flair or keywords to find high-intent threads.

**SEO and content strategy.** Analyze which topics generate the most engagement in your industry's subreddits. Use `sort: "top"` with `timeFilter: "month"` to find the highest-performing content themes. The `title` and `selftext` fields combined with engagement metrics reveal what your audience cares about most.

**Bluesky feeds.** To export a Bluesky custom feed, list or profile's posts, use [Bluesky Scraper](https://apify.com/clearpath/bluesky-scraper).

**Stocktwits streams.** For a ticker's or trader's message stream on Stocktwits, or today's trending stocks with sentiment scores, use [Stocktwits Scraper](https://apify.com/clearpath/stocktwits-scraper).

### FAQ

**How many fields do I get per post?**
108 fields per post. This includes everything Reddit returns in its feed response: scores, ratios, flair, awards, media metadata, crosspost data, moderation flags, and subreddit information. You get the complete raw data, not a subset.

**What's the maximum number of posts I can scrape?**
About 1,000 posts per subreddit with `hot` or `new`, about 500 with `top` or `controversial`, and about 25 with `rising`. These are Reddit's feed limits, not the actor's. For most subreddits, the `new` sort provides the best coverage since it returns posts chronologically. Schedule recurring runs if you need ongoing coverage beyond that.

**How fast is it?**
A posts-only run on one subreddit typically finishes in a few seconds. Adding comments increases run time proportionally. Multiple subreddits run in parallel across sessions, so scraping 10 subreddits takes about the same time as scraping 2.

**What happens if a subreddit doesn't exist?**
It is included in the output as one row with `"_status": "not_found"`. An entry that is not a valid name gets `invalid_name`, and a link to a single post gets `post_url` instead of being read as its whole subreddit. Banned, private and restricted subreddits get their own status (`banned`, `private`, `quarantined`, ...), and a subreddit with no posts gets `empty`. Status rows are never charged as posts. See [Subreddit status rows](#subreddit-status-rows).

**What subreddit formats are accepted?**
Plain name (`AskReddit`), prefixed (`r/AskReddit`), full URL (`https://reddit.com/r/AskReddit`), old/new/mobile URLs, and any combination of these in the same run. The actor normalizes all inputs before processing.

**When should I use time filters?**
Time filters apply only to `top` and `controversial` sort orders. For example, `sort: "top"` with `timeFilter: "week"` returns the highest-scoring posts from the past 7 days. The filters are ignored for `hot`, `new`, and `rising`.

**How do I get only the posts from the last 24 hours?**
Set `maxAgeHours` to `24`. It works with every sort and skips older posts without charging for them. With `sort: "new"` the run also stops reading each subreddit at the first older post, which is the fastest way to collect a complete window. `maxPostsPerSubreddit` still caps each subreddit, so raise it for busy communities.

**How do comments work?**
When `includeComments` is enabled, the actor fetches the top comments for each scraped post. Comments are sorted by confidence (Reddit's "best" algorithm). You can set `maxCommentsPerPost` from 1 to 1,000. Comments appear as separate rows in the output, linked to their parent post by `_post_id`.

**How much do comments cost?**
Comments are billed at $0.99 per 1,000 ($0.00099 each), separate from posts. They are optional and off by default, so a posts-only run incurs no comment charges.

**What's the difference between this and the Post & Comments Scraper?**
This actor starts from a subreddit feed and gives you posts with optional comments. The [Post & Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper) starts from specific post URLs and specializes in deep comment extraction: full tree expansion, six sort orders, Q\&A filtering, unlimited comments. Use this actor when you want to scrape a subreddit's feed. Use the other when you already have post URLs and need complete comment trees.

**Can I schedule recurring runs?**
Yes. Set up a schedule in the Apify Console to run the actor daily, hourly, or at any interval. Combine `sort: "new"` with a `maxAgeHours` slightly longer than the schedule interval, for example `25` on a daily run, so no post falls between two runs, then remove repeats by `id`.

**Can I use this with the Apify API or integrations?**
Yes. Call the actor via the [Apify API](https://docs.apify.com/api/v2), schedule recurring runs, or connect to integrations like webhooks, Zapier, Make, or Google Sheets. The output is standard JSON that works with any downstream pipeline.

**What output formats are available?**
The Apify Console lets you download results as JSON, CSV, Excel, XML, or RSS. You can also access the dataset directly via the Apify API in any of these formats. CSV and Excel flatten nested fields automatically, so media metadata and award arrays become readable columns.

**How do I scrape NSFW subreddits?**
NSFW subreddits work the same as any other subreddit. Posts from NSFW communities include `"over_18": true` in the output, so you can filter them in your downstream pipeline if needed.

**Does it work with private or quarantined subreddits?**
No. Their content is not publicly accessible, so each returns one status row instead of posts: `"_status": "private"` or `"_status": "quarantined"`. Status rows are never charged as posts.

### More Clearpath scrapers for Reddit

- [Reddit Search Scraper](https://apify.com/clearpath/reddit-search-scraper)
- [Reddit Post Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper)
- [Reddit Profile Scraper](https://apify.com/clearpath/reddit-profile-scraper)
- [Reddit User Posts & Comments Scraper](https://apify.com/clearpath/reddit-user-content-scraper)
- [Reddit MCP Server](https://apify.com/clearpath/reddit-mcp)

Also from the same studio (name, then `account/slug` for the URL `https://apify.com/account/slug`):

- Reddit Answers API (`clearpath/reddit-answers-api`)
- Reddit to LLM (`clearpath/reddit-to-llm-api`)
- Bluesky Scraper (`clearpath/bluesky-scraper`)
- Stocktwits Scraper (`clearpath/stocktwits-scraper`)

Full directory: [Clearpath on Apify](https://apify.com/clearpath)

### Support

- **Bugs**: Issues tab
- **Features**: Email or issues
- **Email**: max@mapa.slmail.me

### Legal Compliance

Extracts publicly available data. Users must comply with Reddit terms and data protection regulations (GDPR, CCPA).

***

*Bulk subreddit feed scraping. 108 fields per post, 5 sort orders, optional comments, from one subreddit or hundreds.*

# Actor input Schema

## `subreddit` (type: `string`):

A single subreddit name or URL.

## `maxPostsPerSubreddit` (type: `integer`):

Maximum number of posts to scrape per subreddit. Reddit's feeds stop near 1,000 posts for hot and new, about 500 for top and controversial.

## `subreddits` (type: `array`):

Add multiple subreddit names or URLs. Use 'Bulk edit' to paste a list, or upload a .txt/.csv file. Any format accepted.

## `subredditsFile` (type: `string`):

Upload a .txt or .csv file, or paste a URL. TXT: one subreddit per line. CSV: auto-detects 'subreddit' column.

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

How to sort posts in the feed. Note: 'rising' is a small live listing (~25 posts) that ignores Max posts per subreddit, and 'top' and 'controversial' stop near 500 posts. Use 'hot' or 'new' for bulk.

## `timeFilter` (type: `string`):

Time range for 'top' and 'controversial' sort orders. Ignored for other sorts. To keep only recent posts on any sort, use Max post age (hours). Reddit ranks each range separately and each one stops near 500 posts, so with Max post age set, pick the NARROWEST range that covers your window: a wider range holds fewer posts of it (measured on r/IndieDev, last 7 days: 'week' 50 of 50 asked for, 'year' 6 of 300).

## `maxAgeHours` (type: `number`):

Keep only posts created within this many hours before the run starts, for example 24 for the last day or 0.5 for the last 30 minutes. Older posts are skipped and not charged. Works with every sort. With 'new', the run stops reading a subreddit as soon as it reaches older posts. With 'top' or 'controversial', pick the narrowest Time filter that covers the window: a post older than the filter is never returned, and a filter much wider than the window returns fewer posts of it. 90 days needs 'year', Reddit's widest ranked range below all time. Max posts per subreddit still applies, so raise it to get every post from a busy subreddit. Leave empty to keep posts of any age.

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

Keep only posts with at least this score (upvotes minus downvotes). Other posts are skipped, not charged, and do not count toward Max posts per subreddit. Leave empty to keep posts of any score.

## `minComments` (type: `integer`):

Keep only posts with at least this many comments. Other posts are skipped, not charged, and do not count toward Max posts per subreddit. Leave empty for no minimum.

## `maxComments` (type: `integer`):

Keep only posts with at most this many comments, for example 30 to find threads that are still small. Other posts are skipped, not charged, and do not count toward Max posts per subreddit. Leave empty for no maximum.

## `includeComments` (type: `boolean`):

Fetch top comments for each post. Charged at $0.99 per 1,000 comments.

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

Maximum comments to fetch per post when comments are enabled (1-1,000).

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

How to order each post's comments when comments are included. Leave empty for Best, Reddit's default ranking. Choose Top for the highest-scored comments first.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "subreddit": "AskReddit",
  "maxPostsPerSubreddit": 100,
  "subreddits": [],
  "sort": "hot",
  "timeFilter": "all",
  "includeComments": false,
  "maxCommentsPerPost": 50
}
```

# Actor output Schema

## `results` (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 = {
    "subreddit": "AskReddit",
    "maxPostsPerSubreddit": 100,
    "sort": "hot",
    "timeFilter": "all",
    "maxCommentsPerPost": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/reddit-subreddit-posts-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 = {
    "subreddit": "AskReddit",
    "maxPostsPerSubreddit": 100,
    "sort": "hot",
    "timeFilter": "all",
    "maxCommentsPerPost": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/reddit-subreddit-posts-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 '{
  "subreddit": "AskReddit",
  "maxPostsPerSubreddit": 100,
  "sort": "hot",
  "timeFilter": "all",
  "maxCommentsPerPost": 50
}' |
apify call clearpath/reddit-subreddit-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpath/reddit-subreddit-posts-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/9SchRh78ZcQprr5V8/builds/8BPN1gKpn4xeBKjg8/openapi.json
