# Reddit Search Scraper - Posts by Keyword ($1.19/1K) (`studioxl/reddit-post-search-scraper`) Actor

Search Reddit by keyword and export matching public posts with title, text, author, subreddit, score, upvote ratio, comment count, flair and media. Filter by subreddit, sort, time range or dates. Pay only for unique posts, from $1.19 per 1,000. No Reddit login needed.

- **URL**: https://apify.com/studioxl/reddit-post-search-scraper.md
- **Developed by:** [Kamil Ertekin](https://apify.com/studioxl) (community)
- **Stats:** 1 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.89 / 1,000 post delivereds

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 Search Scraper - Posts by Keyword

Type a phrase like "notion alternative" and get every public Reddit post that matches, one row per post: title, full text, author, subreddit, score, upvote ratio, comment count, flair, media links and dates. Use it for brand monitoring, finding leads in "looking for a tool" threads, market research and building clean datasets. No Reddit account or login needed.

### What you get

| Field | Example | Notes |
|---|---|---|
| `title` | How's the cybersecurity market? | |
| `body` | I've been in cybersecurity for a while now... | Markdown. Empty for link and image posts |
| `permalink` | https://www.reddit.com/r/cybersecurity/comments/1x4wfkk/... | Link to the post |
| `url`, `domain` | https://example.com/article, example.com | Where a link post points |
| `subreddit`, `subredditSubscribers` | cybersecurity, 1541089 | Community and its size |
| `author`, `authorFlair` | Crunux, null | Flair is empty when the author has none |
| `createdAt`, `editedAt` | 2026-10-13T13:19:32.485Z | UTC, ISO 8601 |
| `score`, `upvoteRatio`, `commentCount` | 60, 0.86, 66 | As shown on Reddit when collected |
| `flair`, `languageCode` | Career Questions & Discussion, en | |
| `mediaType` | video | `image`, `video`, `gallery`, `link` or `text` |
| `imageUrl`, `thumbnailUrl` | https://i.redd.it/abc.png | Full image (or a video's preview) and the small thumbnail |
| `videoUrl` | https://.../m2-res_720p.mp4 | MP4 when available, otherwise the video link. Video links expire after a while |
| `galleryImageUrls` | \["https://i.redd.it/p6uk.jpg", ...] | Every image of a gallery post, in order |
| `mediaWidth`, `mediaHeight` | 1152, 720 | Size of the image or video in pixels |
| `isNsfw`, `isSpoiler`, `isLocked`, `isArchived`, `isStickied`, `isSelfPost` | false | Post flags |
| `distinguished`, `crosspostCount`, `isQuarantined` | moderator, 1, false | |
| `query`, `capturedAt` | notion alternative | The phrase that found the post, and when it was collected |

42 fields per post, all flat, so CSV and Excel exports have one clean column per field. `id` (for example `t3_1x4wfkk`) is stable, so you can merge runs on it.

### How to use it

1. Add one or more search phrases (up to 10).
2. Optional: pick subreddits, a sort order, a time range or exact dates.
3. Click **Start**, then download the results as CSV, Excel or JSON from the **Output** tab.

```json
{
  "queries": ["notion alternative", "best crm for startups"],
  "maxPosts": 100
}
```

A 50-post run usually finishes in about 15 seconds. 1,000 posts take about a minute; 10,000 posts on a popular topic take roughly 15 to 30 minutes.

### Input

| Field | What it does |
|---|---|
| Search phrases | What to search for. One phrase per line, up to 10. |
| Only these subreddits | Keep only posts from these communities, for example `startups`, `r/SaaS`. Up to 10. |
| Sort by | Relevance, Hot, Top, Newest or Most comments. |
| Time range | Past hour, 24 hours, week, month, year or all time. |
| Max posts | 1 to 10,000 posts per run. With several phrases the limit is shared fairly: each phrase gets an equal part, and what one phrase can't use goes to the others. |
| Max posts per phrase | Optional hard limit for each phrase, for example 200. 0 = no per-phrase limit. |
| Posted after / Posted before | Exact dates (`2026-01-01`) or a relative age (`7 days`). |
| Only posts containing every word | Drops loose matches where a word of your phrase is missing. |
| Include NSFW posts | Off by default. |

Calling it from code or an AI agent? Common field names work too: `searchQueries`, `keywords`, `q` or `query` for the phrases, `maxItems`, `limit` or `maxResults` for the post limit, and `subreddit` for one community. Fields the scraper doesn't know are ignored and listed in the run message.

Each phrase is searched in each chosen subreddit, with 20 searches per run at most.

### Output example

```json
{
  "id": "t3_1x4wfkk",
  "title": "How's the cybersecurity market?",
  "body": "I've been in cybersecurity for a while now...",
  "permalink": "https://www.reddit.com/r/cybersecurity/comments/1x4wfkk/hows_the_cybersecurity_market/",
  "subreddit": "cybersecurity",
  "subredditSubscribers": 1541089,
  "author": "Crunux",
  "authorFlair": null,
  "flair": "Career Questions & Discussion",
  "score": 60,
  "upvoteRatio": 0.86,
  "commentCount": 66,
  "createdAt": "2026-10-13T13:19:32.485Z",
  "languageCode": "en",
  "mediaType": "text",
  "imageUrl": null,
  "videoUrl": null,
  "galleryImageUrls": [],
  "isNsfw": false,
  "query": "cybersecurity",
  "capturedAt": "2026-10-20T13:08:37.641Z"
}
```

Each run also saves a summary (Output tab, "Run summary") with the number of posts per phrase, how many were skipped by your filters and why the run stopped.

### Pricing

You pay per post saved: **$1.19 per 1,000 posts** on the Apify Free plan, going down to $0.89 per 1,000 on the Business plan and higher. There's no extra start fee.

- 100 posts cost about $0.12. 1,000 posts cost $1.19 or less, 10,000 posts $11.90 or less.
- Duplicates and posts removed by your filters are free.
- Set "Maximum cost per run" in Run options for a hard cap. If that cap is too low to save any post, the run tells you so instead of returning an empty result.

### FAQ

**Do I need a Reddit account?** No.

**Will I get every post that matches?** Reddit search stops after about 250 results per search. When a phrase hits that wall before your limit, the scraper automatically searches again with other sort orders and narrower time ranges inside your chosen range, and keeps only new posts. Very popular words (for example "chatgpt") can still have more posts than Reddit will show; the run message says so. For full coverage, add more specific phrases or pick subreddits.

**Are duplicates possible?** Not within a run: a post found by two phrases is saved once. Across scheduled runs, merge on `id`.

**Can I get the comments too?** Each post has `commentCount`. For the comments themselves, paste the `permalink` values into our [Reddit Comments Scraper](https://apify.com/studioxl/reddit-comments-replies-scraper).

**Can I monitor a keyword every day?** Yes. Save the input as a task, set Sort by to Newest and Time range to Past 24 hours, and add a schedule. Results go to Google Sheets, Slack, Make, Zapier or n8n through Apify integrations.

**Why are some fields empty?** Not every post has every field. Link posts have no body, many authors have no flair, and older posts may have no language set.

### Limits

- Up to 10 phrases, 10 subreddits and 10,000 posts per run. A phrase can run out before your limit when Reddit has no more matching posts; the run message says so.
- Public posts only. Private communities and deleted text aren't available.
- Scores and comment counts are a snapshot from the moment of collection.
- Media links can expire after a while.

Questions or a missing field? Open an issue in the **Issues** tab with your run ID.

# Actor input Schema

## `queries` (type: `array`):

What to search Reddit for, one phrase per line (up to 10). A post that matches several phrases is saved and charged once. Example: "notion alternative".

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

Leave empty to search all of Reddit. Add names like "startups" or "r/SaaS" to keep only posts from those communities. Each phrase is searched in each subreddit (20 searches at most).

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

Order of the search results. Pick Newest for monitoring, Top for the best-known threads.

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

Only keep posts created within this period.

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

Most posts to save in this run, across all phrases (1 to 10,000). The limit is shared fairly between phrases. You pay only for saved posts.

## `maxPostsPerQuery` (type: `integer`):

Optional. Stop each phrase after this many posts, for example 200. 0 means no per-phrase limit (the total is still shared fairly).

## `dateFrom` (type: `string`):

Optional. Keep posts created on or after this date, for example 2026-01-01 or "7 days".

## `dateTo` (type: `string`):

Optional. Keep posts created on or before this date, for example 2026-03-31.

## `strictTokenFilter` (type: `boolean`):

Keep a post only if every word of the phrase appears in its title, text or link. Good for cutting loose matches; it can also drop relevant posts.

## `includeNsfw` (type: `boolean`):

Off by default. Turn on to keep posts marked NSFW (18+).

## Actor input object example

```json
{
  "queries": [
    "notion alternative",
    "best crm for startups"
  ],
  "sort": "relevance",
  "timeFilter": "all",
  "maxPosts": 50,
  "maxPostsPerQuery": 0,
  "strictTokenFilter": false,
  "includeNsfw": false
}
```

# Actor output Schema

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

Saved posts. Switch views for text and media, authors and communities, or dates and status.

## `completeJson` (type: `string`):

All fields for every saved row, without a view-specific field selection.

## `summary` (type: `string`):

Saved-post counts per search phrase, filters applied and why the run stopped.

# 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 = {
    "queries": [
        "notion alternative",
        "best crm for startups"
    ],
    "maxPosts": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("studioxl/reddit-post-search-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 = {
    "queries": [
        "notion alternative",
        "best crm for startups",
    ],
    "maxPosts": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("studioxl/reddit-post-search-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 '{
  "queries": [
    "notion alternative",
    "best crm for startups"
  ],
  "maxPosts": 50
}' |
apify call studioxl/reddit-post-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studioxl/reddit-post-search-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/IVCwizcRAPbJhuxFq/builds/61iqTZSyrBem8NVQm/openapi.json
