# Reddit Posts Scraper: Subreddits, Search & Full Text, No API (`scrapers_lat/reddit-posts-scraper`) Actor

Scrape Reddit posts from any subreddit, search query, user or post URL without an API key or login. Get title, author, subreddit, full self text, links, media, thumbnails and timestamps, plus optional AI sentiment, summary and topics. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers_lat/reddit-posts-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Social media, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.23 / 1,000 results

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

[![Reddit Posts Scraper](https://scrapers.lat/banners/reddit-posts-scraper.png)](https://console.apify.com/actors/fvfaOyCg3k25lYCvD/input)

## Reddit Posts Scraper: Subreddits, Search & Full Text, No API Key

Scrape Reddit posts from any subreddit, search query, user or post URL without a Reddit API key, OAuth app or login. This actor reads Reddit's public post feeds over HTTP and writes one clean, normalized record per post, with the full self text, links, media and timestamps, ready for social media monitoring, sentiment research and trend discovery. Optional AI add-ons enrich each post with sentiment, a summary and topic tags.

Here is one real result from a live run (a link post from r/technology), showing every field the actor returns:

```json
{
  "recordType": "post",
  "thumbnail": "https://external-preview.redd.it/0F8B6ElbJucEXl6mxvIeAcb49nGLV8GFNjSr-6wwsJA.jpeg?width=640&crop=smart&auto=webp&s=8337922a",
  "title": "Tetris issues legal warning after White House releases arcade full of parody games",
  "url": "https://www.dexerto.com/gaming/tetris-issues-legal-warning-after-white-house-releases-arcade-full-of-parody-games-3405931/",
  "id": "1w7dpo9",
  "fullname": "t3_1w7dpo9",
  "selftext": null,
  "contentHtml": "<table> <tr><td> <a href=\"https://www.reddit.com/r/technology/comments/1w7dpo9/...\"> ...",
  "subreddit": "technology",
  "subredditPrefixed": "r/technology",
  "author": "IndicaOatmeal",
  "authorUri": "https://www.reddit.com/user/IndicaOatmeal",
  "authorFullname": null,
  "authorFlairText": null,
  "score": null,
  "upvoteRatio": null,
  "numComments": null,
  "numCrossposts": null,
  "totalAwards": null,
  "linkFlairText": null,
  "permalink": "https://www.reddit.com/r/technology/comments/1w7dpo9/tetris_issues_legal_warning_after_white_house/",
  "domain": "dexerto.com",
  "isSelf": false,
  "isVideo": null,
  "mediaUrls": ["https://external-preview.redd.it/0F8B6ElbJucEXl6mxvIeAcb49nGLV8GFNjSr-6wwsJA.jpeg?width=640"],
  "galleryImageUrls": null,
  "isNsfw": null,
  "isSpoiler": null,
  "isOriginalContent": null,
  "isPinned": null,
  "isLocked": null,
  "isArchived": null,
  "edited": false,
  "editedAt": null,
  "createdAt": "2026-09-04T19:08:57+00:00",
  "updatedAt": "2026-09-04T19:08:57+00:00",
  "observedAt": "2026-09-05T00:30:15.920Z",
  "transport": "rss",
  "aiSentiment": null,
  "aiSentimentScore": null,
  "aiSummary": null,
  "aiTopics": null,
  "aiCategory": null,
  "topComments": null,
  "error": null
}
```

**📥 [Input](https://apify.com/scrapers_lat/reddit-posts-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/reddit-posts-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/reddit-posts-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/reddit-posts-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Reddit-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Honest note on engagement metrics

Reddit now hard-walls anonymous access to its rich data channels: the public JSON endpoints and the old.reddit HTML pages both return a login or network-security block for non-logged-in traffic. The one channel that remains openly readable over HTTP is Reddit's public post feed, and that is what this actor uses.

That feed reliably provides the post's identity, author, subreddit, title, full self text, content HTML, outbound link, media and timestamps. It does **not** expose live engagement counters, so `score`, `upvoteRatio`, `numComments`, `totalAwards`, `numCrossposts` and the moderation flags (`isNsfw`, `isSpoiler`, `isPinned`, `isLocked`, `isArchived`, `isOriginalContent`) are returned as explicit `null` rather than guessed or faked. If you need live vote and comment counts, a browser-based Reddit scraper that logs in is the right tool, and we say so plainly in the comparison below. We would rather ship honest nulls than invented numbers.

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [How this compares](#how-this-compares)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

Point the actor at one or more subreddits, a search query across Reddit, exact post URLs, or a mix of start URLs (subreddit, post, user or search URLs), choose a sort order, and it writes one normalized record per post to the run's dataset. Every record carries the post id and fullname, title, author and profile URL, subreddit, outbound URL and permalink, domain, the full self text (for text posts), the raw content HTML, thumbnail and any Reddit-hosted media or gallery image URLs, whether the post is a self post or a video, and creation and edit timestamps.

Optional paid AI add-ons enrich each post: sentiment with a confidence score, a one to two sentence summary, and topic tags with a broad category. A separate top-comments add-on pulls the leading comments (author and text) for each post. Each add-on is off by default, charged only when it returns usable output, and disabled for free Apify plans.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 hot posts from r/technology with full text.

```json
{
  "maxPosts": 10,
  "subreddits": ["technology"],
  "sort": "hot"
}
```

Add more subreddits, a `searchQuery`, exact `postUrls`, or `startUrls`. Use `sort` and `timeFilter` to control the feed, and turn on the AI add-ons (`withSentiment`, `withSummary`, `withTopics`, `withTopComments`) on a paid plan. All fields are optional.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `subreddits` | string\[] | no | `["technology"]` | Subreddit names to scrape, without the `r/` prefix, for example `technology`, `worldnews`. |
| `searchQuery` | string | no | (empty) | Search terms to query across Reddit. When a single subreddit is provided, the search is restricted to it. |
| `postUrls` | string\[] | no | `[]` | Exact Reddit post URLs to fetch directly. |
| `startUrls` | string\[] | no | `[]` | Any mix of subreddit, post, user or search URLs. Each is auto-detected and scraped for posts. |
| `maxPosts` | integer | no | `10` | Maximum number of posts to collect across all sources. `maxItems` is accepted as an alias. |
| `withDetails` | boolean | no | `true` | Include the full self text, content HTML and media/gallery URLs on every record. These come with the base result at no extra charge. |
| `sort` | enum | no | `hot` | Sort order for feeds and search: `hot`, `new`, `top`, `rising`, `controversial`. |
| `timeFilter` | enum | no | `day` | Time window for `top`, `controversial` and search: `hour`, `day`, `week`, `month`, `year`, `all`. |
| `withSentiment` | boolean | no | `false` | Paid add-on. Classify each post's sentiment (positive / negative / neutral) with a confidence score. Paid plans only. |
| `withSummary` | boolean | no | `false` | Paid add-on. Generate a 1 to 2 sentence summary of each post. Paid plans only. |
| `withTopics` | boolean | no | `false` | Paid add-on. Extract topic tags and a broad category for each post. Paid plans only. |
| `withTopComments` | boolean | no | `false` | Paid add-on. Capture the top few comments (author and text) for each post. Paid plans only. |

You can combine `subreddits`, `searchQuery`, `postUrls` and `startUrls` in a single run.

### Output reference

One dataset item per post. Types: `string`, `boolean`, `string[]`, `object[]`, or `null` when the source value is absent or the field is not exposed by Reddit's public feed.

| Field | Type | Description |
|---|---|---|
| `recordType` | string | Always `post`. |
| `thumbnail` | string | Post thumbnail image URL, or `null`. |
| `title` | string | Post title. |
| `url` | string | The outbound link for link posts, or the permalink for self posts. |
| `id` | string | Reddit post id (unique per post). |
| `fullname` | string | Reddit fullname, for example `t3_1w7dpo9`. |
| `selftext` | string | Full self/text body for text posts, or `null` for link posts. |
| `contentHtml` | string | Raw post content HTML as served by Reddit's feed. |
| `subreddit` | string | Subreddit name. |
| `subredditPrefixed` | string | Subreddit with the `r/` prefix. |
| `author` | string | Author username, or `null` if deleted. |
| `authorUri` | string | Author profile URL. |
| `permalink` | string | Permalink to the post. |
| `domain` | string | Domain the post links to (`self.<subreddit>` for text posts). |
| `isSelf` | boolean | `true` for text/self posts. |
| `isVideo` | boolean | `true` for Reddit-hosted or known video posts, else `null`. |
| `mediaUrls` | string\[] | Reddit-hosted media (image/video) URLs found in the post, or `null`. |
| `galleryImageUrls` | string\[] | Gallery image URLs when the post is a gallery, or `null`. |
| `edited` | boolean | `true` when the post was edited after posting. |
| `editedAt` | string | Edit timestamp (ISO 8601), or `null`. |
| `createdAt` | string | Post creation timestamp (ISO 8601). |
| `updatedAt` | string | Feed last-updated timestamp (ISO 8601). |
| `observedAt` | string | When the record was collected (ISO 8601). |
| `transport` | string | The data channel used (`rss`). |
| `score`, `upvoteRatio`, `numComments`, `numCrossposts`, `totalAwards` | null | Engagement counters. Not exposed by Reddit's public feed, returned as `null` (see the honest note above). |
| `authorFullname`, `authorFlairText`, `linkFlairText` | null | Not exposed by Reddit's public feed, returned as `null`. |
| `isNsfw`, `isSpoiler`, `isOriginalContent`, `isPinned`, `isLocked`, `isArchived` | null | Moderation flags. Not exposed by Reddit's public feed, returned as `null`. |
| `aiSentiment` | string | Add-on: `positive`, `negative`, or `neutral`. Present only with `withSentiment`. |
| `aiSentimentScore` | number | Add-on: sentiment confidence score (-1 to 1). Present only with `withSentiment`. |
| `aiSummary` | string | Add-on: 1 to 2 sentence summary. Present only with `withSummary`. |
| `aiTopics` | string\[] | Add-on: topic/keyword tags. Present only with `withTopics`. |
| `aiCategory` | string | Add-on: broad category. Present only with `withTopics`. |
| `topComments` | object\[] | Add-on: top comments (author, text). Present only with `withTopComments`. |
| `error` | string | `null` on success. On a failed source, a single item with a populated `error` field is written instead. |

### How this compares

| | scrapers.lat Reddit Posts Scraper | Browser-based Reddit scrapers (for example trudax/reddit-scraper) |
|---|---|---|
| Reddit API key or login | Not required | Often required or uses a headless login |
| Subreddit feeds | Yes | Yes |
| Search across Reddit | Yes (`type=link` posts) | Yes |
| Post URLs and start URLs | Yes (subreddit, post, user, search) | Yes |
| User posts | Yes (via user URL) | Yes |
| Full self text and content HTML | Yes | Yes |
| Media and gallery URLs | Yes | Yes |
| Live score, upvote ratio, comment count, awards | No, returned as `null` | Yes |
| NSFW, spoiler, pinned, locked flags | No, returned as `null` | Yes |
| AI sentiment, summary, topics | Yes, opt-in | Usually no |
| Top comments | Yes, opt-in | Yes |
| Output formats | JSON, CSV, Excel | JSON, CSV, Excel |

Honest concession: because this actor is HTTP-only and never logs in, it cannot read Reddit's live vote and comment counters or moderation flags, so those fields are `null`. Browser-based scrapers that log in do return them, at the cost of a heavier, slower and login-dependent run. If your work is content, text, links, timestamps and AI enrichment, this actor is faster, lighter and needs no API key. If you must have live vote and comment counts, use a login-based scraper.

### Run via API and CLI

Start a run and read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-posts-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"subreddits":["technology"],"maxPosts":25,"sort":"hot"}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-posts-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"artificial intelligence","sort":"top","timeFilter":"week","withSummary":true,"maxPosts":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/reddit-posts-scraper \
  --input '{"subreddits":["worldnews"],"withSentiment":true,"withTopics":true,"maxPosts":50}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=500&limit=500"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets.

### Billing and limits

- **Pay per result.** You are charged per post record returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/reddit-posts-scraper/pricing) for the current per-result price.
- **AI and comment add-ons are extra and opt-in.** `withSentiment`, `withSummary`, `withTopics` and `withTopComments` are billed per enriched post, charged only when they return usable output, and available on paid Apify plans only.
- **No charge on failure.** If a source errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 posts per run and cannot use the AI add-ons. Upgrade for a higher `maxPosts` and enrichments.

### FAQ and troubleshooting

**Why are `score`, `numComments` and the flags `null`?**
Reddit no longer exposes live vote and comment counters or moderation flags through the public channel this actor reads, so we return `null` rather than fake them. For live counts, use a browser-based, login-dependent Reddit scraper.

**A run returned 0 records. Why?**
The subreddit name or search query may have matched nothing, or the time window was too narrow. Check the names, widen `timeFilter`, or change `sort`. Zero-result runs are not charged.

**How do I get the full post text?**
It is included by default. For text posts, `selftext` holds the full body and `contentHtml` holds the raw HTML. Link posts have no self text (`selftext` is `null`) and instead carry the outbound `url` and `domain`.

**How do I search across Reddit instead of a subreddit?**
Set `searchQuery`. Provide a single subreddit alongside it to restrict the search to that community, or leave `subreddits` empty to search all of Reddit.

**Can I scrape a specific user's posts or a single post?**
Yes. Put the post URL in `postUrls`, or paste a user URL (`/user/<name>`) or any subreddit, post or search URL into `startUrls`.

**What do the AI add-ons add?**
`withSentiment` adds `aiSentiment` and `aiSentimentScore`; `withSummary` adds `aiSummary`; `withTopics` adds `aiTopics` and `aiCategory`; `withTopComments` adds `topComments`. Each is billed per enriched post, charged only when it returns output, and paid plans only.

**Is this an official Reddit tool?**
No. This actor is independent and has no affiliation with Reddit. It reads only data that is publicly available on reddit.com.

### Related scrapers

- [Reddit Comments Scraper](https://apify.com/scrapers_lat/reddit-comments-scraper): Comment trees from any post.
- [Reddit Media Scraper](https://apify.com/scrapers_lat/reddit-media-scraper): Images, videos and galleries from Reddit.
- [Reddit User Scraper](https://apify.com/scrapers_lat/reddit-user-scraper): A user's posts and comments.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Reddit. Accesses only publicly available post data.

# Actor input Schema

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

Maximum number of posts to collect across all sources. Optional.

## `withDetails` (type: `boolean`):

Include the full self text, content HTML and media/gallery image URLs on every post record. Kept on by default. These fields are delivered with the base result at no extra charge.

## `withSentiment` (type: `boolean`):

Add-on. Classify each post's sentiment (positive / negative / neutral) with a confidence score using AI. Billed per enriched post. Paid Apify plans only.

## `withSummary` (type: `boolean`):

Add-on. Generate a 1-2 sentence AI summary of each post's title and body. Billed per enriched post. Paid Apify plans only.

## `withTopics` (type: `boolean`):

Add-on. Extract topic/keyword tags and a broad category for each post using AI. Billed per enriched post. Paid Apify plans only.

## `withTopComments` (type: `boolean`):

Add-on. Capture the top few comments (author, score, text) for each post. Requires 'Fetch Full Post Text'. Billed per post with comments. Paid Apify plans only.

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

Subreddit names to scrape. Enter names without the r/ prefix, for example: technology, worldnews.

## `searchQuery` (type: `string`):

Optional. Search terms to query instead of (or in addition to) the subreddit feeds. For example: artificial intelligence. When a single subreddit is provided, the search is restricted to it.

## `postUrls` (type: `array`):

Optional. Exact Reddit post URLs to fetch directly (https://www.reddit.com/r/.../comments/...).

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

Optional. Paste any mix of Reddit URLs: subreddit URLs (/r/name), post URLs (/comments/...), user URLs (/user/name), or search URLs (/search?q=...). Each is auto-detected and scraped for posts.

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

Sort order for subreddit feeds and search.

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

Time window for the 'top' and 'controversial' sorts (and search). Ignored for hot, new and rising.

## Actor input object example

```json
{
  "maxPosts": 10,
  "withDetails": true,
  "withSentiment": false,
  "withSummary": false,
  "withTopics": false,
  "withTopComments": false,
  "subreddits": [
    "technology"
  ],
  "postUrls": [],
  "startUrls": [],
  "sort": "hot",
  "timeFilter": "day"
}
```

# 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 = {
    "maxPosts": 10,
    "subreddits": [
        "technology"
    ],
    "postUrls": [],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/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 = {
    "maxPosts": 10,
    "subreddits": ["technology"],
    "postUrls": [],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/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 '{
  "maxPosts": 10,
  "subreddits": [
    "technology"
  ],
  "postUrls": [],
  "startUrls": []
}' |
apify call scrapers_lat/reddit-posts-scraper --silent --output-dataset

```

## MCP server setup

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