# Reddit Search Engine: Posts, Comments, Profiles (`starvoid/reddit-search-engine`) Actor

Search Reddit and export posts, comments, and full user profiles as clean JSON. No account, no API key, no login. Deep history, real scores, AI-ready output.

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

## Pricing

from $2.00 / 1,000 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Reddit Search Engine

> **Posts, comments, and full profiles on Reddit, as clean structured JSON.** No account, no API key, no login. Reaches deep historical content and profiles Reddit's own search will not show you.

[![What you get](https://img.shields.io/badge/What_you_get-E11D48?style=for-the-badge)](#what-you-can-extract)
[![Modes](https://img.shields.io/badge/Modes-EA580C?style=for-the-badge)](#modes)
[![Compare](https://img.shields.io/badge/Compare-CA8A04?style=for-the-badge)](#how-it-compares)
[![Pricing](https://img.shields.io/badge/Pricing-16A34A?style=for-the-badge)](#pricing)
[![Quick start](https://img.shields.io/badge/Quick_start-0891B2?style=for-the-badge)](#quick-start)
[![API](https://img.shields.io/badge/API-2563EB?style=for-the-badge)](#run-it-from-code)
[![FAQ](https://img.shields.io/badge/FAQ-7C3AED?style=for-the-badge)](#faq)

### Who uses it

| Who | What they use it for |
|---|---|
| Market researchers | what a niche is discussing this week, and what it discussed years ago |
| Brand and product teams | mentions, feature requests, and complaints across subreddits |
| Data and AI teams | clean post and comment datasets for sentiment, RAG, and training |
| Lead generation | people asking for what your product solves |
| Analysts and researchers | one account's full posting history, across subreddits and years |

### What you can extract

**Posts** (the full thread body, comments optional)

- `url`, `title`, `subreddit`, `author`, `body`, `score`, `createdAt`, `postId`
- set `maxComments` above 0 to add a `comments` array (most-upvoted first), each with `author`, `body`, `score`, `createdAt`

**Profile** (a user's full posts and comments)

- `subreddit`, `url`, `isOp`
- `post`: `title`, `author`, `score`, `createdAt`, `isNSFW`, `body`
- `userComments`: each with `body`, `score`, and `repliedTo` (the author and text they replied to, so you get the conversation, not an orphaned quote)

### Modes

| Mode | Returns | Use it for |
|---|---|---|
| Post | the post only (title, body, score, fields) | cheap bulk post text |
| Search | the post plus its comments (set `maxComments`) | threads, sentiment, market research, AI and RAG data |
| Comment | comments only, each with its post link (needs a subreddit) | comment mining, opinion tracking |
| Profile | a user's posts and comments, with the context they replied into | account research, community analysis, hidden profiles included |

**Global search** (`global: true`) is a toggle for Post and Search mode. Off, you name the subreddits to search (any number). On, it searches across **all of Reddit** by keyword, past Reddit's own ~250-result search limit and back years, so you find threads without knowing which subreddits they live in. It adds a $2 one-time fee per run. Comment mode always runs within named subreddits.

### Why choose this actor

- **Reaches past Reddit's limit.** Reddit's search runs out after a few hundred results and a shallow time window. This actor pulls deep historical threads that Reddit's own search will not show you, back years, across every subreddit.
- **Regex filtering.** Keep or drop results with a real regular expression on the text, not just a keyword box. Nobody else offers this.
- **No run fee.** You pay only for results. There is no actor-start charge on every run, and a run that errors costs you nothing. Many actors bill a fee just to start a run; this one does not.
- **Honest output.** Deleted authors show as `[deleted]`, not blank. Unknown values come back as `null`, never a fake zero.
- **No login, no API key, no CAPTCHA.** Nothing to configure. Leave the proxy on its default.

### How it compares

Compared with four Reddit actors you will see often in the Store, on the numbers and the features that decide a run.

| | This actor | trudax/reddit-scraper-lite | fatihtahta/reddit-scraper-search-fast | harshmaur/reddit-scraper | automation-lab/reddit-scraper |
|---|---|---|---|---|---|
| Price / 1,000 | $2 posts, $0.60 comments | $4.00 | $1.49 | $2.00 | $1.15 |
| Real scores (not best-effort 0s) | yes | yes | yes | yes | partial |
| History past Reddit's ~1,000-item cap | yes | no | partial | no | no |
| Works on hidden profiles | yes | no | no | no | no |
| Regex include and exclude | yes | no | no | no | no |
| AI output formats (fine-tune JSONL, RAG markdown) | yes | no | no | no | no |

Prices are each actor's Store rate on 2026-09-16 and may change. Most competitors bill one flat rate per 1,000 results, whether a row is a post or a comment; this actor bills comments at **$0.60/1,000**, so a comment-heavy pull (a thread has dozens) comes out far cheaper. It is also a flat rate with no plan-tier discount games. Where it pulls ahead on features: real scores from the archive (automation-lab's own listing warns its scores can be `0`), years past Reddit's ~1,000-item cap, hidden profiles, real regex, and fine-tune/RAG output none of these four offer.

### Refine your search

- **Sort**: `top` (default) returns the highest-scored posts and comments, a representative sample; `new` returns the most recent, for monitoring
- **Keywords**: a result must contain all your search terms (whole words, any order); turn on `matchAny` to keep results with any one of them, or `exactPhrase` to require each term as an exact phrase
- **Exclude terms**: drop any result containing one of these words
- Date range reaching back years, or a quick time preset (hour, day, week, month, year)
- **Regex**: keep only results matching a pattern, or drop results matching one. Any of several words: `docker|podman`; all of them: `(?=.*docker)(?=.*compose)`
- **NSFW**: included by default (Reddit tags a lot of ordinary content and whole subreddits 18+); turn `includeNSFW` off for a work-safe set
- **Removed and deleted**: included by default, each carrying a `removed` flag; turn `includeRemoved` off to drop content a moderator removed or the author deleted

### Pricing

Pay per event. You are charged only for what a run returns, and a run that errors costs nothing.

Prices below are the standard rate. Higher Apify subscription tiers can pay a little less through Store discounts, so heavy users get a better rate.

| Event | Price |
|---|---|
| Post | $2.00 / 1,000 |
| Comment | $0.60 / 1,000 |
| Global search (all of Reddit) | $2.00 per run |
| Profile lookup (base) | $1.00 each |
| Profile with activity | +$2.50 |
| Hidden profile | +$4.00 |
| Extra posts, per 100 (`fullHistory`) | +$0.30 |
| Extra comments, per 100 (`fullHistory`) | +$0.15 |

Profile totals: **$1** for an account with no posts and no comments, **$3.50** for a profile with any posts or comments, and **$7.50** when the account's profile is hidden. That flat fee covers up to 100 of the user's posts and 100 of their comments. A username that does not exist is **free**: it returns a row with `found: false`. To pull a heavy account's **full history**, set `fullHistory: true`: it adds one small block charge per additional 100 posts and per additional 100 comments (so 101 and 200 cost the same). Only runs that ask for it are ever charged the overage.

Real-world examples:

- 100 posts, no comments → **$0.20**
- 100 posts, top comment on each (`search`, `maxComments: 1`) → **$0.26**
- 100 posts with ~20 comments each → **$1.40**
- A Global search run across all of Reddit → **+$2.00** on top of the posts and comments it returns
- One standard profile (up to 100 posts + 100 comments) → **$3.50**
- One hidden profile (same limit, up to 100 posts + 100 comments) → **$7.50**

New Apify accounts start with **$5 in free credit**, enough for well over 1,000 results, so you can try this actor at no cost before paying anything.

### Quick start

Paste a Reddit URL (post, subreddit, or user), no keywords needed:

```json
{ "mode": "post", "startUrls": ["https://www.reddit.com/r/webdev/comments/abc123/"] }
```

Find threads about a keyword in one subreddit, past week:

```json
{ "mode": "post", "subreddits": ["webdev"], "searchTerms": ["how do i deploy"], "time": "week", "maxResults": 25 }
```

Posts with their comments (`maxComments` = comments per post):

```json
{ "mode": "search", "subreddits": ["productivity"], "searchTerms": ["notion vs obsidian"], "maxComments": 30, "maxResults": 25 }
```

Comments only from a subreddit (`maxResults` = number of comments):

```json
{ "mode": "comment", "subreddits": ["docker"], "searchTerms": ["compose"], "maxResults": 200 }
```

Search across all of Reddit with Global search (past Reddit's own limit), keeping only matches (regex):

```json
{ "mode": "post", "searchTerms": ["kubernetes"], "global": true, "includeRegex": "(migrat|upgrade).*(1\\.2[0-9])", "maxResults": 50 }
```

Reconstruct a user (up to 100 posts + 100 comments, flat fee per username; list several to look up each):

```json
{ "mode": "profile", "usernames": ["someuser"] }
```

Pull a heavy user's full history (billed per extra 100):

```json
{ "mode": "profile", "usernames": ["someuser"], "fullHistory": true, "maxResults": 500 }
```

### Run it from code

Every run is available over Apify's API. Put your Apify API token in a `.env` file (`APIFY_TOKEN=...`); the calls below read it from the environment. If you renamed the actor, change the slug.

Python:

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])  # reads your .env
run = client.actor("starvoid/reddit-search-engine").call(run_input={
    "mode": "post", "subreddits": ["webdev"], "searchTerms": ["deploy"], "maxResults": 50
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["url"])
```

cURL:

```bash
curl "https://api.apify.com/v2/acts/starvoid~reddit-search-engine/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "mode": "post", "subreddits": ["webdev"], "searchTerms": ["deploy"], "maxResults": 50 }'
```

It also works with AI agents through the Model Context Protocol via Apify, so an assistant can run it in plain language.

### Troubleshooting

- **Fewer results than expected?** Broaden your filters. A tight regex, exclude list, or short time window can cut the set down fast.
- **Run stopped early with a "maximum cost" note in the log?** The run reached the maximum cost per run set in its options. You are billed only for what was delivered; raise the limit to get the rest. A Global search needs room for its $2 fee, and a profile for its full fee, or it is skipped unbilled.
- **A profile returned only mentions?** That user's own posts were not in the top results for their handle. Profile mode keeps only pages the user actually took part in, so mention-only pages are dropped rather than billed.
- **A profile shows $1 and no posts or comments?** The account exists but has no activity to return, so only the base is billed.
- **A row with `found: false`?** No Reddit account has that username (check the spelling). It is not billed.
- **A row with `found: null`?** The profile could not be loaded right now. It is not billed; run it again.

### FAQ

**Do I need a Reddit account or API key?** No. Nothing to set up.

**How far back does it reach?** Years. With Global search on it reaches across all of Reddit, not just the shallow recent window Reddit's own search returns, so it pulls deep threads in every subreddit.

**What does a post include?** The full post: title, body, author, subreddit, real score, and timestamp. Comments are separate: set `maxComments` above 0 to add the top comments to each post (each billed as a comment). Set it to 0 for post-only, the cheapest option.

**Are scores included?** Yes. Posts carry their real score, and comments carry theirs when you pull them. Profile mode includes both too.

**What happens on an empty search?** Posts return nothing and cost nothing. A Global search still bills its $2, because the all-of-Reddit search ran; it is not billed if the search could not run on our side. A profile lookup bills the $1 base for an existing account with no activity; a username that does not exist is free.

**Is this affiliated with Reddit?** No. It returns content from Reddit. Do not use profile data for employment, tenancy, or credit decisions, or to identify a specific individual.

# Actor input Schema

## `mode` (type: `string`):

What to return. post = the post only. search = the post plus its comments (set Comments per post). comment = comments only, each with its post link (needs a subreddit). profile = a user's full activity.

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

Paste Reddit URLs directly: a post, a subreddit (r/...), or a user (u/...). Post URLs are fetched straight away. Optional if you use keywords below.

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

Keywords to find on Reddit. By default a result must contain all of them (whole words, any order, case-insensitive). Turn on 'Match any term' to keep results with any one of them.

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

Limit to these subreddits (name only, no r/). Combined with every keyword.

## `global` (type: `boolean`):

Search all of Reddit by keyword instead of naming subreddits, reaching past Reddit's own ~250-result limit into years of history. A $2 one-time fee per run. Leave off and list subreddit names to search those communities free of the fee.

## `usernames` (type: `array`):

Profile mode only. Reddit username(s), without the u/ prefix.

## `time` (type: `string`):

Quick time filter. For a precise window use the dates below.

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

Top returns the highest-scored posts and comments, a representative sample rather than whatever was posted in the last hour. New returns the most recent, best for monitoring. Applies to subreddit searches; global search is ordered by relevance.

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

Only results on or after this date (YYYY-MM-DD). Reaches back years, far beyond Reddit's API window.

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

Only results on or before this date (YYYY-MM-DD).

## `exactPhrase` (type: `boolean`):

Match each search term as an exact phrase (words together, in order) instead of its words anywhere.

## `matchAny` (type: `boolean`):

Keep results that contain ANY of the search terms, instead of requiring all of them.

## `negativeTerms` (type: `array`):

Drop any result that contains one of these words or phrases.

## `includeRegex` (type: `string`):

Keep only results whose text matches this pattern (case-insensitive). Advanced: OR with a|b, AND with (?=.\*a)(?=.\*b).

## `excludeRegex` (type: `string`):

Drop results whose text matches this pattern (case-insensitive).

## `maxResults` (type: `integer`):

Maximum results to return. In profile mode with fullHistory on it sets how deep to pull the user's history (ceiling 2000).

## `fullHistory` (type: `boolean`):

Profile mode only. Off (default) returns up to 100 posts and 100 comments in the flat fee. On pulls the user's full history up to maxResults (ceiling 2000) and bills a small charge per additional 100 posts and per additional 100 comments, so heavy accounts deliver in full and only runs that ask for more pay more.

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

Full post mode: how many comments to pull for each post. Each comment returned is billed as a comment event. (In Comment mode, use Max results to set how many comments you want.)

## `includeNSFW` (type: `boolean`):

Include content flagged 18+ (over\_18). On by default, since Reddit tags a lot of ordinary content and whole subreddits as NSFW. Turn off for a clean, work-safe dataset.

## `includeRemoved` (type: `boolean`):

Include posts and comments that a moderator removed or the author deleted. On by default; each affected row carries a removed flag. Turn off to drop them and keep only content that is still live.

## `outputFormat` (type: `string`):

Posts mode: reshape each post into an AI-ready record. Fine-tuning gives OpenAI chat-format training examples; RAG markdown gives embed-ready documents. Both fold comments in and bill per post only.

## `maxCommentDepth` (type: `integer`):

Posts mode: how deep into reply threads to go. 0 = top level only.

## `sliceMonths` (type: `integer`):

Split the date range into windows of this many months to pull more results. Smaller means deeper.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Higher is faster.

## `session` (type: `string`):

Optional. Advanced users only. Leave this empty.

## Actor input object example

```json
{
  "mode": "post",
  "startUrls": [],
  "searchTerms": [],
  "subreddits": [
    "technology"
  ],
  "global": false,
  "usernames": [],
  "time": "all",
  "sort": "top",
  "dateFrom": "",
  "dateTo": "",
  "exactPhrase": false,
  "matchAny": false,
  "negativeTerms": [],
  "includeRegex": "",
  "excludeRegex": "",
  "maxResults": 10,
  "fullHistory": false,
  "maxComments": 0,
  "includeNSFW": true,
  "includeRemoved": true,
  "outputFormat": "default",
  "maxCommentDepth": 3,
  "sliceMonths": 3,
  "concurrency": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Every post, comment, and profile from this run as structured JSON items.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [],
    "searchTerms": [],
    "subreddits": [
        "technology"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("starvoid/reddit-search-engine").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [],
    "searchTerms": [],
    "subreddits": ["technology"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("starvoid/reddit-search-engine").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [],
  "searchTerms": [],
  "subreddits": [
    "technology"
  ],
  "maxResults": 10
}' |
apify call starvoid/reddit-search-engine --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,starvoid/reddit-search-engine"
        }
    }
}
```

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/8MBuDc7u2q6wtMiWe/builds/vkQy98RjHqbKNjhVF/openapi.json
