# Reddit Posts Scraper - Public Subreddit Feeds (`angaba92/reddit-posts-scraper`) Actor

Export public Reddit posts from multiple subreddits: titles, authors, text, dates and links. No cookies or login. New, hot and top feeds with pagination and deduplication. RSS scope: no comments or votes. $0.50 per 1,000 posts.

- **URL**: https://apify.com/angaba92/reddit-posts-scraper.md
- **Developed by:** [Andres Garcia-Baquero Leon](https://apify.com/angaba92) (community)
- **Categories:** Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 reddit 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Reddit Posts Scraper - Public Subreddit Feeds

Export public Reddit posts from multiple communities into **JSON, CSV, Excel or API**. Collect titles, authors, publication dates, self-post text and external links without cookies, login or a Reddit API key.

**Price: $0.50 per 1,000 delivered posts**, plus the standard $0.00005 start event at the default memory allocation. A post is a dataset row, not a request. Failed HTTP requests and duplicate posts are not sold as results.

### Is this the right Reddit scraper?

This Actor is for **lightweight collection of public subreddit feeds**. It is not a full Reddit API replacement.

| Included | Not included |
|---|---|
| New, hot and top public feeds | Keyword search |
| Multiple communities in one run | Comments or reply trees |
| Cursor pagination and deduplication | Votes, scores or comment counts |
| Self-post text, author and source links | Private, quarantined or restricted communities |
| Per-community coverage report | Guaranteed complete history or all posts ever published |

RSS can shorten titles or omit content. The Actor preserves what the feed exposes rather than inventing missing data. For exhaustive historical research, engagement ranking or comment analysis, choose another product.

### Quick start

1. Click **Try for free** and enter community names such as `Python` or `programming`.
2. Choose `new`, `hot` or `top` and your maximum posts per community.
3. Set a maximum run budget in Apify Console and start the Actor.
4. Export the **Posts** dataset. Inspect **Coverage and errors** before treating the run as complete.

Empty input `{}` uses the public Python community and requests 25 posts. Invalid explicit names fail; they are never replaced with demo data.

```json
{
  "subreddits": ["Python", "programming"],
  "maxResultsPerSubreddit": 50,
  "sort": "new"
}
```

#### Top posts in the last week

```json
{
  "subreddits": ["technology"],
  "sort": "top",
  "timeRange": "week",
  "maxResultsPerSubreddit": 100
}
```

### Input reference

| Field | Default | Behavior |
|---|---|---|
| `subreddits` | `["Python"]` | 1-20 names, optionally prefixed with `r/`; no arbitrary URLs |
| `maxResultsPerSubreddit` | `25` | Upper limit 1-1000; public history may be shorter |
| `sort` | `new` | `new`, `hot` or `top` |
| `timeRange` | `week` | `hour`, `day`, `week`, `month`, `year`, `all`; top only |
| `proxyConfiguration` | Apify Proxy enabled | Requests try direct first; retries can use Apify Proxy |

### Output example

Selected fields from a real public feed response collected on September 11, 2026 (Europe/Madrid). This example demonstrates shape, not guaranteed future availability:

```json
{
  "id": "t3_1wcjor7",
  "postId": "1wcjor7",
  "title": "I scored 720 YouTube videos against their own channel's median to find which topics actually have de",
  "subreddit": "Python",
  "author": "Top-Ease-9371",
  "publishedAt": "2026-09-10T13:46:12+00:00",
  "url": "https://www.reddit.com/r/Python/comments/1wcjor7/i_scored_720_youtube_videos_against_their_own/",
  "source": "reddit_rss"
}
```

The title above is shortened by the source feed. We do not claim it is the complete webpage title.

| Field | Type | Meaning |
|---|---|---|
| `id`, `postId` | string | Reddit fullname and short ID; useful for deduplication |
| `title`, `url` | string | Feed title and Reddit permalink |
| `subreddit`, `requestedSubreddit` | string | Source community and requested community |
| `author`, `authorUrl` | string/null | Public author; absence is preserved |
| `publishedAt`, `updatedAt` | string/null | Source timestamps |
| `text` | string | Self-post body without feed submission boilerplate; empty for link-only posts |
| `contentHtml` | string | Original HTML embedded in the RSS entry; sanitize before rendering |
| `externalUrls` | array | Non-Reddit HTTP/HTTPS links in the feed entry |
| `source`, `sourceUrl` | string | Source type and exact feed URL |
| `scrapedAt` | string | Extraction time in UTC |

### Coverage and partial runs

The `OUTPUT` record contains delivered counts, requests, and one status per community. `complete` means the requested limit was met or the available feed ended normally. **It does not mean all historical Reddit data was collected.**

Possible stop reasons: `requested_limit`, `feed_exhausted`, `empty_feed`, `budget`, `source_error`, `repeated_page`, `repeated_cursor`, `page_cap`.

If one community fails after another delivered posts, the run may succeed with `complete: false`. Delivered posts remain available and are charged normally. If all sources fail before any delivery, the run fails instead of presenting a blocked scrape as a successful empty export. Budget exhaustion stops later communities too.

### Performance and pricing

Reddit enforces rate limits. Requests are spaced **at least 10 seconds apart**, including retries, with at most three attempts per page. Each page requests up to 25 posts. Bulk runs intentionally take minutes rather than hammer the source.

| Delivered posts | Post charges |
|---:|---:|
| 25 | $0.0125 |
| 100 | $0.05 |
| 1,000 | $0.50 |

The standard start event adds $0.00005 at 256-512 MB. The live Pricing tab is authoritative. No residential proxy group is selected automatically. Selecting a custom proxy provider may introduce provider charges outside this Actor's event price.

### Workflow integrations

Use Apify schedules and dataset exports with n8n, Make, Zapier, Google Sheets, Slack, or your own API client. These are output integration options, not preconfigured integrations bundled with this Actor.

For recurring collection, deduplicate against `id` in your destination: deduplication inside this Actor applies only within each run. Repeated runs can return and charge the same posts again.

### FAQ

**Do I need login or cookies?** No. Only public Atom/RSS feeds are used.

**Can I search for a keyword?** Not in this version. Supply community names and filter returned text downstream.

**Can I get comments or upvotes?** No. The feed does not expose those fields reliably; they are not invented or charged as extra data.

**Why fewer posts than requested?** Public feed history may end, the source may repeat a page, a community may restrict access, or your spending limit may stop the run. Inspect `OUTPUT`.

**Why is it slower than a browser feed?** Pacing reduces HTTP 429 rate-limit failures. Running many copies simultaneously can still trigger source-wide limits.

**Is it suitable for commercial research?** It exports public posts for your own analysis. Public availability is not a license to ignore Reddit terms, privacy obligations or content rights. Avoid using public author data for unsolicited targeting.

**Does scheduling prevent duplicates?** No. Keep IDs in your downstream database for cross-run deduplication.

### Troubleshooting

| Symptom | Check |
|---|---|
| HTTP 403 / 429 | Reduce simultaneous runs, allow proxy fallback, and retry later; access is not guaranteed |
| Empty or restricted community | Check the public subreddit in a browser; private/quarantined communities are unsupported |
| Partial results | Read `OUTPUT.complete` and each community's `stopReason` |
| Repeated page | The source ignored the cursor or reached its accessible history; no duplicates are charged |
| Empty text | Link-only posts may have no self-post body; use `externalUrls` and the permalink |

If this Actor fits your workflow, an honest Store review helps other users decide. Bug reports and missing-field feedback are welcome; there is no incentive tied to review score.

# Actor input Schema

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

1-20 public community names, e.g. Python or r/programming. Private, quarantined and restricted communities are not supported. No arbitrary URLs.

## `maxResultsPerSubreddit` (type: `integer`):

Upper bound, 1-1000; available public feed history may be shorter. Requests are paced at least 10 seconds apart.

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

new, hot or top public feed. This is not keyword search.

## `timeRange` (type: `string`):

Time range for top only. Ignored for new/hot.

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

Try a paced direct request first; use Apify Proxy for retries if enabled. No residential proxy is selected automatically.

## Actor input object example

```json
{
  "subreddits": [
    "Python"
  ],
  "maxResultsPerSubreddit": 25,
  "sort": "new",
  "timeRange": "week",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `posts` (type: `string`):

No description

## `coverage` (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 = {
    "subreddits": [
        "Python"
    ],
    "maxResultsPerSubreddit": 25,
    "sort": "new",
    "timeRange": "week",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("angaba92/reddit-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 = {
    "subreddits": ["Python"],
    "maxResultsPerSubreddit": 25,
    "sort": "new",
    "timeRange": "week",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("angaba92/reddit-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 '{
  "subreddits": [
    "Python"
  ],
  "maxResultsPerSubreddit": 25,
  "sort": "new",
  "timeRange": "week",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call angaba92/reddit-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,angaba92/reddit-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/xOhapQceSM7Agj3jr/builds/DuYh9Yr6t1vdjgOcu/openapi.json
