Reddit Keyword Search with Advanced Filters
Search Reddit by keyword and filter the matches by subreddit, score, date range, NSFW status, and author before they reach your dataset.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
keywords | array | required | List of keywords to search. Each runs as a separate Reddit search. |
resultLimit | integer | optional | Max posts per keyword (1-1000). |
sort | string | optional | How to sort the search results. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
keywords | array | required | List of keywords to search. Each runs as a separate Reddit search. |
resultLimit | integer | optional | Max posts per keyword (1-1000). |
sort | string | optional | How to sort the search results. |
subredditFilter | array | optional | Only emit posts from these subreddits (without `r/` prefix). Empty = all. |
subredditBlocklist | array | optional | Drop posts from these subreddits. |
minScore | integer | optional | Drop posts with score below this number. |
maxAgeDays | integer | optional | Drop posts older than N days. |
excludeNsfw | boolean | optional | Drop NSFW posts. |
authorBlocklist | array | optional | Drop posts by these usernames (case-insensitive). |
keywordRequireAll | boolean | optional | When multiple keywords given, also dedupe & only emit posts whose title/content contains ALL of them. Default: each keyword runs independently (OR). |
dateFrom | string | optional | Drop posts with `created_at` before this date (inclusive). Format: YYYY-MM-DD. |
dateTo | string | optional | Drop posts with `created_at` after this date (inclusive end-of-day). Format: YYYY-MM-DD. |
Download the published input schema
View complete JSON
{
"description": "Search Reddit by keywords with advanced filters. Pro adds: subreddit filter/blocklist, dateFrom/dateTo, minScore, maxAgeDays, excludeNsfw, authorBlocklist, keywordRequireAll.",
"properties": {
"authorBlocklist": {
"default": [],
"description": "Drop posts by these usernames (case-insensitive).",
"editor": "stringList",
"title": "Author blocklist",
"type": "array"
},
"dateFrom": {
"description": "Drop posts with `created_at` before this date (inclusive). Format: YYYY-MM-DD.",
"editor": "textfield",
"title": "Date from (YYYY-MM-DD)",
"type": "string"
},
"dateTo": {
"description": "Drop posts with `created_at` after this date (inclusive end-of-day). Format: YYYY-MM-DD.",
"editor": "textfield",
"title": "Date to (YYYY-MM-DD)",
"type": "string"
},
"excludeNsfw": {
"default": false,
"description": "Drop NSFW posts.",
"title": "Exclude NSFW",
"type": "boolean"
},
"keywordRequireAll": {
"default": false,
"description": "When multiple keywords given, also dedupe & only emit posts whose title/content contains ALL of them. Default: each keyword runs independently (OR).",
"title": "Require all keywords (AND)",
"type": "boolean"
},
"keywords": {
"description": "List of keywords to search. Each runs as a separate Reddit search.",
"editor": "stringList",
"minItems": 1,
"prefill": [
"python programming"
],
"title": "Keywords",
"type": "array"
},
"maxAgeDays": {
"description": "Drop posts older than N days.",
"maximum": 36500,
"minimum": 1,
"title": "Max post age in days (filter)",
"type": "integer"
},
"minScore": {
"description": "Drop posts with score below this number.",
"maximum": 10000000,
"minimum": -10000,
"title": "Min score (filter)",
"type": "integer"
},
"resultLimit": {
"default": 500,
"description": "Max posts per keyword (1-1000).",
"maximum": 1000,
"minimum": 1,
"title": "Result limit per keyword",
"type": "integer"
},
"sort": {
"default": "relevance",
"description": "How to sort the search results.",
"enum": [
"relevance",
"hot",
"top",
"new",
"comments"
],
"enumTitles": [
"Relevance",
"Hot",
"Top",
"New",
"Comments"
],
"title": "Sort by",
"type": "string"
},
"subredditBlocklist": {
"default": [],
"description": "Drop posts from these subreddits.",
"editor": "stringList",
"title": "Subreddit blocklist",
"type": "array"
},
"subredditFilter": {
"default": [],
"description": "Only emit posts from these subreddits (without `r/` prefix). Empty = all.",
"editor": "stringList",
"title": "Subreddit filter (allowlist)",
"type": "array"
}
},
"required": [
"keywords"
],
"schemaVersion": 1,
"title": "Reddit Keywords Pro Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
posts | string | optional | Dataset containing all scraped Reddit posts. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Reddit posts matching your keywords, with score, subreddit, author, and timestamps, after subreddit/score/date/NSFW/author filtering.",
"properties": {
"posts": {
"description": "Dataset containing all scraped Reddit posts.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Reddit posts",
"type": "string"
}
},
"title": "Reddit Keyword Search with Advanced Filters Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Keyword Search Results",
"transformation": {
"fields": [
"keyword",
"title",
"author",
"subreddit_prefixed",
"score",
"num_comments",
"url",
"created_at",
"link_flair"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Reddit Keyword Search with Advanced Filters
Search Reddit for one or more keywords and get back matching posts, narrowed down with subreddit allow/block lists, a minimum score, a date range, an NSFW toggle, and an author blocklist — so the dataset you export only contains the posts that actually matter to you.
What this actor does
- Runs a separate Reddit search for each keyword you provide and tags every post with the keyword that found it
- Keeps or drops posts by subreddit (allowlist or blocklist), minimum score, maximum age in days, or an explicit date range
- Can require that a post's title/content contain every keyword at once instead of matching any single one
- Drops NSFW posts and posts from specific authors on request
- Omits any field Reddit's listing didn't provide for a post rather than returning it empty
Output per post
keyword— the keyword that matched this postpost_id,post_name— Reddit's post ID and fullname (t3_...)title,content— post title and self-text snippet, when the post has oneauthor,author_fullnamesubreddit,subreddit_prefixed— e.g.r/geopoliticsscore,num_comments,num_crossposts,gilded_counturl,permalink,external_url— external link target, only present when it differs from the Reddit permalinkthumbnail_url,link_flaircreated_utc,created_atis_self,is_stickied,is_nsfw,is_spoiler,is_promoted,is_original_contentpost_hint— rough content type (self,image,gallery,link,hosted:video,rich:video)title_word_count,post_age_secondscrosspost_parent— the original post's ID, title, author, subreddit, score, and comment count, present only when this post is a crosspost
Output when nothing is returned
If keywords is empty, or every post the search found was rejected by your filters (or no posts were found at all), the actor emits a single recordType: "error" record instead of post records, with reason (no_keywords or all_filters_dropped_results), a human-readable message, and — for the filters case — the keywords searched and an appliedFilters summary of every filter value you set, so you can see why nothing came through.
Input
| Field | Type | Default | Description |
|---|---|---|---|
keywords |
array | – | Keywords to search; each one runs as its own search (required) |
resultLimit |
integer | 500 |
Max posts to return per keyword (1-1000) |
sort |
string (select) | relevance |
relevance, hot, top, new, or comments |
subredditFilter |
array | [] |
Only keep posts from these subreddits (no r/ prefix); empty keeps all |
subredditBlocklist |
array | [] |
Drop posts from these subreddits |
minScore |
integer | – | Drop posts with a score below this number |
maxAgeDays |
integer | – | Drop posts older than this many days |
excludeNsfw |
boolean | false |
Drop posts marked NSFW |
authorBlocklist |
array | [] |
Drop posts from these usernames (case-insensitive) |
keywordRequireAll |
boolean | false |
With multiple keywords, keep only posts whose title/content contains all of them, instead of any one |
dateFrom |
string | – | Drop posts created before this date (YYYY-MM-DD, inclusive) |
dateTo |
string | – | Drop posts created after this date (YYYY-MM-DD, inclusive of the full day) |
Example: single keyword, top posts of all time
{
"keywords": ["machine learning"],
"resultLimit": 100,
"sort": "top"
}
Example: brand mentions, excluding NSFW and low-score noise
{
"keywords": ["mybrand", "mybrand review"],
"minScore": 5,
"excludeNsfw": true,
"subredditBlocklist": ["spam"],
"resultLimit": 200
}
Example: posts from the last 30 days that mention two terms together
{
"keywords": ["layoffs", "tech"],
"keywordRequireAll": true,
"maxAgeDays": 30,
"sort": "new"
}
Use cases
- Brand and product monitoring — track mentions while filtering out low-score or NSFW noise
- Lead and sentiment research — pull threads matching two or more terms at once with
keywordRequireAll - Subreddit-scoped research — restrict a broad keyword search to a hand-picked set of communities
- Trend tracking — compare
newvstopresults for the same keyword over a rolling date window - Moderation or spam review — drop known problem authors or subreddits before they reach your dataset
FAQ
How is this different from a plain keyword search? Every filter here (subreddit allow/block, score floor, date range, NSFW exclusion, author blocklist, multi-keyword AND matching) is applied after the search, so the dataset you get already reflects your criteria instead of needing to be cleaned up afterward.
What happens when I give several keywords?
By default each keyword runs as an independent search and results are combined (OR). Set keywordRequireAll to true to instead keep only posts whose title or content contains every keyword you listed.
Why do some posts have no content?
Link posts and posts without a text body don't have self-text; content is only present for text (self) posts that have one.
What does external_url mean, and why is it sometimes missing?
It's the destination of a link post when that destination differs from the Reddit permalink. Self-posts, and link posts that just point back at Reddit, don't get this field.
Can I combine dateFrom/dateTo with maxAgeDays?
Yes — both filters are applied together, so the post must satisfy whichever ones you set.
Does subredditFilter and subredditBlocklist work together?
Yes. A post must pass both: it's dropped if it's in the blocklist, and dropped if an allowlist is set and the post's subreddit isn't in it.
Do I need a Reddit account or API credentials? No — this actor reads Reddit's public search results directly, without a login.
Is this affiliated with Reddit? No. This is an independent actor that reads Reddit's publicly available search pages.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build h7QrhQVhzxY2jSbRi. Documentation is regenerated from the default published build; private drafts are not included.