# Reddit Search (`watcharin/reddit-search`) Actor

Search Reddit by keyword, or read subreddit, user and post pages directly. Get **posts, media, comments, communities and people** as clean, ready-to-use data, with filters that let you keep only the results that matter.

No Reddit account or API key is needed on your side.

- **URL**: https://apify.com/watcharin/reddit-search.md
- **Developed by:** [Watcharin Kan](https://apify.com/watcharin) (community)
- **Stats:** 2 total users, 1 monthly users, 52.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

Search Reddit by keyword, or read subreddit, user and post pages directly. Get **posts, media, comments, communities and people** as clean, ready-to-use data, with filters that let you keep only the results that matter.

No Reddit account or API key is needed on your side.

### What can it do?

- **Keep only the good posts.** Set a minimum number of comments, a minimum score and a minimum upvote ratio, pick a time range (last hour to all time) and a sort order (relevance, hot, top, new, most comments).
- **Search precisely.** Put a phrase in double quotes to match it exactly (`"portable grill"`), and narrow the search with filters for title text, post text, author, flair, linked domain, linked URL, text-only posts and NSFW (not safe for work) content.
- **Read feeds without searching.** Give Start URLs or subreddit names and choose hot, new, top, rising or controversial. A feed returns up to about 1,000 posts, and a post URL returns its comments.
- **Five kinds of results.** Posts, media (image, video, GIF, gallery), comments (with reply depth and score), communities (subscribers, description) and people (karma, account age; sortable by karma).
- **Keep every Reddit field.** Turn on *Include raw JSON* to add the original Reddit data of each item next to the clean columns.

### How to use it

1. Open the Actor and choose a **Content type** (posts is the default).
2. Fill in **Keywords** to search, **or** fill in **Start URLs / Subreddit feeds** to read pages directly.
3. Optionally add filters (minimum score, flair, author, domain...) and set **Max pages (total)** to limit how much is read.
4. Run it, then open the **Output** tab or download the dataset as JSON, CSV, Excel or HTML.

### Keywords: all words, or an exact phrase

Each keyword can be searched in two ways:

| You type | What is searched |
|---|---|
| `portable grill` | **All the words, in any order.** Posts that contain every word, usually anywhere in the title or text. |
| `"portable grill"` (type the double quotes as part of the keyword) | **The exact phrase.** Posts where the words appear together, in that order. |

Every item in the *Keywords* list is its own search and the results are added together. `["portable grill", "camping stove"]` finds posts about either one; it does not require both in the same post.

In feed mode the same two ways apply to the posts that were read (all words anywhere in the title or text, or the exact phrase).

### Input examples

#### Search posts by keyword

```json
{
  "contentType": "posts",
  "keywords": ["portable grill", "\"camp stove\""],
  "subreddits": ["camping", "overlanding"],
  "sort": "top",
  "timeRange": "year",
  "minScore": 10,
  "minUpvoteRatio": 0.8
}
```

The first keyword has no quotes, so posts need to contain both words in any order. The second keyword is in double quotes, so it is matched as an exact phrase.

#### Read the top posts of a subreddit (no search)

```json
{
  "contentType": "posts",
  "listingSubreddits": ["camping", "overlanding"],
  "listingSort": "top",
  "timeRange": "week",
  "minScore": 10
}
```

#### Read feeds and a user page from URLs

```json
{
  "contentType": "posts",
  "startUrls": [
    { "url": "https://www.reddit.com/r/camping/controversial/?t=month" },
    { "url": "https://www.reddit.com/r/overlanding/rising/" },
    { "url": "https://www.reddit.com/user/PlentyDirection5691/" }
  ],
  "keywords": ["stove"]
}
```

`startUrls` must be an array of objects with a `url` field, as above. A plain string or an array of strings is rejected.

In feed mode, keywords and the other filters keep only the posts that match. A sort or time written in a URL (for example `/top/?t=week`) wins over *Feed sort* and *Time range*.

#### Get the comments of one post

```json
{
  "contentType": "comments",
  "startUrls": [
    { "url": "https://www.reddit.com/r/camping/comments/abc123/post_title/" }
  ]
}
```

Replace the URL with a real post. More ready-to-use inputs are in the `examples` folder of the Actor.

### Input fields

| Field | What it does |
|---|---|
| Content type | posts, media, comments, communities or people. |
| Keywords | What to search for: words in any order, or an exact phrase in double quotes (see above). Required for communities and people. |
| Start URLs / Subreddit feeds / Feed sort | Feed mode: read subreddit, user and post pages directly (posts, media and comments). |
| Subreddits | Narrow a keyword search to some subreddits. |
| Time range, Sort by | Time range and order of a search (and time range for top / controversial feeds). |
| Minimum comments, Minimum score, Minimum upvote ratio | Keep only posts above these values (empty = no filter). Minimum comments uses the post's comment count: it keeps posts that people actually discussed, and with the Comments type it skips posts below the value, so fewer requests are made. |
| Authors, Title contains, Post text contains, Post flairs, Linked domains, Linked URL contains | Keep only posts that match. |
| Text (self) posts, Adult (NSFW) content | Keep or exclude text posts and NSFW content. |
| Max results per page, Max pages (total) | Page size (up to 100) and how many pages to read in total, over all keywords and feeds. |
| Include raw JSON | Add the original Reddit data of each item. |

### Output

Each result is one row in the dataset. The columns depend on the content type.

**Posts and media** (media rows add `mediaType`, `mediaUrl`, `thumbnail`, `domain`, `width`, `height`):

```json
{
  "searchDate": "2026-10-16T08:21:44.000Z",
  "query": "portable grill",
  "sort": "top",
  "timeRange": "year",
  "subreddit": "camping",
  "title": "Best portable grill for car camping?",
  "content": "I am looking for a small grill that fits in a trunk.",
  "score": 128,
  "upvoteRatio": 0.93,
  "totalVote": 140,
  "comments": 42,
  "posted": "2026-10-10T14:03:11.000Z",
  "author": "example_user",
  "link": "https://www.reddit.com/r/camping/comments/abc123/best_portable_grill/"
}
```

**Comments:** `subreddit`, `postId`, `postTitle`, `postLink`, `commentId`, `parentId`, `depth`, `author`, `body`, `score`, `isSubmitter`, `posted`, `link`.

**Communities:** `display_name`, `title`, `subscribers`, `created`, `public_description`, `description`, `subreddit_type`, `over18`, `lang`, `link`.

**People:** `name`, `link_karma`, `comment_karma`, `total_karma`, `created`, `is_gold`, `is_mod`, `has_verified_email`, `public_description`, `link`.

All dates are in UTC (ISO 8601), for example `2026-10-16T08:21:44.000Z`.

### Good to know

- **How much you can get is limited by Reddit, not by the Actor.** In our tests a keyword search returned around 250 results for a broad keyword. Subreddit feeds go deeper: about 1,000 posts for *new* and *hot*, about 450-500 for *top* and *controversial* of all time, and about 25 for *rising*.
- **Large comment threads.** A post returns up to about 500 comments in one request, with replies up to 10 levels deep. In very large threads (tens of thousands of comments) some replies that Reddit hides behind "load more" are not included.
- **Comments use more requests.** In comments mode, every matching post needs one extra request, so set **Max pages (total)** to keep runs short.
- **Where filters are applied.** Minimum comments, minimum score and minimum upvote ratio are applied after the posts are read. In a search the other filters (title, text, author, flair, domain, URL) are sent to Reddit; in feed mode they are applied after reading, so they do not reduce the number of pages read.
- **Rising** does not exist for user pages (the Actor uses *new* there). The *rising* and *controversial* orders are available in feed mode only.

### FAQ

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

**Can I search the whole of Reddit?** Yes. Leave *Subreddits* empty and use keywords.

**Why did I get fewer results than I expected?** Reddit limits how deep a search or a feed can go (see *Good to know*), and your minimum comments, score, upvote ratio and other filters remove posts after they are read.

**Can I get posts without a keyword?** Yes, use Start URLs or Subreddit feeds. You can also use the subreddit or one of the Advanced filters in a search without a keyword.

**Can I schedule it or call it from my own code?** Yes. Like any Apify Actor it can be scheduled, called through the API, and connected to integrations.

### Responsible use

The Actor reads publicly visible Reddit pages. Make sure your use of the data follows Reddit's terms and the laws that apply to you, especially when you collect information about people.

# Actor input Schema

## `contentType` (type: `string`):

What to search for. "posts" (default) = text, link, image and video posts. "media" = posts that contain an image, video, GIF or gallery. "comments" = all comments from the posts that match your search; this uses one extra request per post, so set "Max pages (total)" to limit the number of posts. "communities" = subreddits that match the keywords (name, members, description, rules for posting...). "people" = profiles/redditors that match the keywords (karma, account age...).  Only keywords, Sort by, NSFW (not safe for work), Max results per page and Max pages apply to Communities and People (for People, Sort by is applied by this Actor: hot = link karma, top = total karma, new = account creation date, comments = comment karma); all other filters apply to Posts, Media and Comments. Feed mode (Start URLs / Subreddit feeds) works with Posts, Media and Comments only.

## `includeRaw` (type: `boolean`):

When enabled, each row gets an extra "raw" field containing the original Reddit JSON of that one item (a post, community, person or comment), so you can pick any field that is not in the default output. For Comments, "raw" is the comment without its replies (each reply is its own row). Works for every content type. Makes the output much larger.

## `keywords` (type: `array`):

Required for Communities and People and for searching. Optional in feed mode (Start URLs / Subreddit feeds), where it only keeps the posts whose title or text contains the keyword (several words must all appear; use double quotes for an exact phrase). Words or phrases to search for. Posts, Media and Comments: the keyword is sent to Reddit as plain text (q=<keyword>). A keyword can be searched in two ways. (1) All words, any order: type the words without quotes, for example portable grill. Reddit returns posts that contain all the words, anywhere in the title or text and in any order (in a test of 100 posts, 91 contained both words and 34 had them side by side). (2) Exact phrase: put the phrase in double quotes and type the quotes as part of the keyword, for example "portable grill". Reddit then returns posts where the words appear together in that order (in the same test, 98 of 100). Each item in the list is a separate search and the results are added together, so \["portable grill", "camping stove"] finds posts about either one; it does not require both in the same post. Comments: the keyword finds the posts whose comments are collected. For Posts, Media and Comments, if you fill in "Title contains" or "Post text contains" under Advanced filters, those replace the keyword search: the keywords are not used in the query. Communities and People: the keyword is sent to Reddit as plain text. Communities: Reddit matches the keyword, ignoring upper/lower case, against the subreddit name, title, short description and sidebar description. Names that contain the keyword inside a longer word can match too (for example "camping" finds r/OhioCamping). Results arrive in Reddit's own order (not sorted by size), and the first page can also contain large, loosely related communities whose returned fields do not contain the keyword; this comes from Reddit's search, not from a filter of this Actor. Double quotes make the match much stricter (in a test with outdoor camping, the first page had 100 communities without quotes and 9 with quotes). People: the keyword is matched mainly against the public profile description (for example outdoor camping finds a profile that says "I film outdoor fishing and camping trips"). Double quotes make the match stricter and return fewer results (in the same test 19 people without quotes and 3 with quotes). A user name that contains the keyword inside one longer word (for example u/Outdoorcampingshop) is usually NOT found. The People results of this Actor come from Reddit's search API and can differ from the Profiles tab on reddit.com, which uses a different search; this is a limit of Reddit's API, not a filter of this Actor.

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

Subreddits to search in, written without the "r/" prefix (for example "camping"). All subreddits are searched together in a single query per keyword. Optional: leave empty to search all of Reddit (this can return a very large number of posts, so use specific keywords or filters). Applies to Posts, Media and Comments searches only; ignored for Communities and People and in feed mode (use "Subreddit feeds" there).

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

How the results are ordered before your filter settings are applied. Choose one sort. This is the sort of the search; it is ignored in feed mode (use "Feed sort"). Posts, Media and Comments (Reddit orders the posts found): "relevance" (default) = closest match to the keywords; "hot" = trending now; "top" = highest score (respects the time range); "new" = most recent first; "comments" = most discussed. People (redditors): Reddit ignores the sort for people, so this Actor sorts the rows itself: "relevance" (default) = Reddit's own order (best name match first); "hot" = link karma, highest first; "top" = total karma (link + comment), highest first; "new" = account creation date, newest account first; "comments" = comment karma, highest first. For People with hot, top, new or comments the Actor fetches every page allowed by "Max pages (total)" and sorts all the rows it collected. Accounts without a value (for example suspended or deleted accounts) are always listed last, and ties keep Reddit's relevance order. Only the accounts Reddit returns for your keyword are sorted, so the order is not a ranking of all of Reddit. Communities: Reddit may ignore the sort and mostly return relevance order.

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

Only include posts published within this period: "hour", "day", "week", "month", "year" (default) or "all". Applies to Posts, Media and Comments only; ignored for Communities and People. In feed mode it is used only when "Feed sort" is top or controversial (a time in a Start URL, for example ?t=week, wins).

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

Optional. Reddit pages to read directly instead of searching. Accepted: a subreddit (https://www.reddit.com/r/camping/), a subreddit with a sort and time (https://www.reddit.com/r/camping/top/?t=week), a user page (https://www.reddit.com/user/PlentyDirection5691/) and a single post (https://www.reddit.com/r/camping/comments/abc123/title/). A sort or time written in the URL wins over "Feed sort" and "Time range". For a post URL, Posts and Media return the post and Comments returns its comments (up to about 500 per post; the keyword and Advanced filters are not applied to a post URL you give explicitly). Applies to Posts, Media and Comments only. API / JSON input: an array of objects, e.g. \[{"url": "https://www.reddit.com/r/camping/"}]. A plain string or an array of strings is rejected.

## `listingSubreddits` (type: `array`):

Optional. Subreddits to read as a feed, written without the "r/" prefix (for example "camping"). Each subreddit is read in the order chosen in "Feed sort"; this does not search, so it is not limited to about 250 results like a search. Reddit gives about 1,000 posts per feed for hot and new, about 450-500 for top and controversial of all time, and about 25 for rising. Pages of 100 posts are read until Reddit has no more. Different from "Subreddits" above, which only narrows a keyword search. Applies to Posts, Media and Comments only.

## `listingSort` (type: `string`):

Order of the posts in a feed (Subreddit feeds, and Start URLs that do not state a sort): hot, new, top, rising or controversial. "top" and "controversial" use "Time range". "rising" returns only a few posts (about 25) and does not exist for user pages (new is used instead).

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

Optional. Keep only posts whose score (upvotes minus downvotes) is at least this value. Leave empty for no score filter. For Comments it filters the parent posts, not the individual comments. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `minUpvoteRatio` (type: `number`):

Optional. Keep only posts where the share of upvotes is at least this value, from 0 to 1 (for example 0.5 means at least 50% upvoted). Leave empty for no upvote-ratio filter. For Comments it filters the parent posts. Applies to Posts, Media and Comments only; ignored for Communities and People.

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

Optional. Keep only posts that have at least this many comments (Reddit's comment count of the post). Useful for finding posts people actually discussed and for dropping posts nobody answered, which saves time when you want real opinions. Leave empty for no comment filter. For Comments it filters the parent posts, so posts below the value are not opened. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `authors` (type: `array`):

Reddit usernames without the "u/" prefix. Only posts written by these users are kept. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `titles` (type: `array`):

Words or phrases that must appear in the post title (for example "camp stove"). Multi-word phrases are matched exactly. If set, it replaces the keyword search: the keywords are then not used at all in the search, neither in the title nor in the post text. In feed mode they do not replace the keywords: all filters are applied together. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `selftexts` (type: `array`):

Words or phrases that must appear in the post body text. Multi-word phrases are matched exactly. If set, it replaces the keyword search: the keywords are then not used at all in the search, neither in the title nor in the post text. In feed mode they do not replace the keywords: all filters are applied together. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `flairs` (type: `array`):

Post flair labels to match (for example "Gear Review"). Multi-word flairs are matched exactly. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `sites` (type: `array`):

Domain names that the post links to (for example "youtube.com"), written without "https://". Only link posts can match. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `urls` (type: `array`):

Text that must appear in the URL the post links to. Use values without spaces. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `self` (type: `string`):

Filter by post type. "any" applies no filter, "only" keeps text-only posts, "exclude" keeps only posts that link elsewhere. Applies to Posts, Media and Comments only; ignored for Communities and People.

## `nsfw` (type: `string`):

Filter by adult (18+) content. "any" applies no filter, "only" keeps NSFW (not safe for work) posts, "exclude" keeps only posts not marked NSFW. Applies to every content type (for Communities and People it uses the adult flag of the subreddit or profile). For Communities and People, "only" keeps only items flagged 18+, so an ordinary keyword such as "camping" can return no results at all; leave it on "any" unless you want only adult communities or profiles. Default: "any". For Communities and People, "any" returns both regular and adult (18+) results; "exclude" drops the adult ones.

## `maxResultsPerPage` (type: `integer`):

Number of items requested from Reddit per page (the "limit" parameter of the search URL). Reddit allows at most 100. A lower value means more pages and more API requests for the same number of results, so the default 100 is best for most runs. Optional: leave empty or enter 0 to use the default (100); the maximum is 100.

## `maxPages` (type: `integer`):

Optional. Maximum number of result pages to fetch in TOTAL for the whole run, counted over all keywords together (not per keyword). One page holds up to "Max results per page" items and costs one API request. Leave empty for no page limit (paging then stops when Reddit returns no more results). Otherwise pages are fetched one after another until this total is reached; keywords that come after the limit is used up are skipped, so the first keywords can use up all pages. Reddit cuts the results off by itself (in a test with the keyword "camping" it returned only about 230-250 items, 3 pages). Set to 1 (or 0, which is treated as 1) to fetch only the first page of the first keyword. For People with sort hot, top, new or comments, the Actor always fetches every page up to this limit (it cannot stop early) because the best accounts can be on any page; a higher value gives a more complete sorted list but uses more requests.

## Actor input object example

```json
{
  "contentType": "posts",
  "keywords": [
    "camping"
  ],
  "subreddits": [],
  "sort": "relevance",
  "timeRange": "year",
  "startUrls": [],
  "listingSubreddits": [],
  "listingSort": "new",
  "authors": [],
  "titles": [],
  "selftexts": [],
  "flairs": [],
  "sites": [],
  "urls": [],
  "self": "any",
  "nsfw": "any",
  "maxResultsPerPage": 100
}
```

# Actor output Schema

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

Dataset items of the run: posts, media posts, comments, communities or people found on Reddit. Pick the matching view in the Output tab.

# 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 = {
    "keywords": [
        "camping"
    ],
    "subreddits": [],
    "startUrls": [],
    "listingSubreddits": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("watcharin/reddit-search").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 = {
    "keywords": ["camping"],
    "subreddits": [],
    "startUrls": [],
    "listingSubreddits": [],
}

# Run the Actor and wait for it to finish
run = client.actor("watcharin/reddit-search").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 '{
  "keywords": [
    "camping"
  ],
  "subreddits": [],
  "startUrls": [],
  "listingSubreddits": []
}' |
apify call watcharin/reddit-search --silent --output-dataset

```

## MCP server setup

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

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/Vttxt4R3i9zsqEymS/builds/mlil7rdoHcJcIg8jM/openapi.json
