Reddit Keyword Monitor avatar

Reddit Keyword Monitor

Pricing

from $1.00 / 1,000 keyword matches

Go to Apify Store
Reddit Keyword Monitor

Reddit Keyword Monitor

Monitor Reddit for keywords, phrases and topics across all Reddit or selected subreddits. Track posts and comments, deduplicate matches, filter noise, and return only new results on scheduled runs. Export clean JSON, CSV or Excel. No Reddit login or API key.

Pricing

from $1.00 / 1,000 keyword matches

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Reddit Keyword Monitor

Monitor Reddit for keywords, phrases and topics across all of Reddit or the subreddits you choose. Track posts and comments, get one row per match with every keyword it matched, filter out noise and bots, and — on a schedule — receive only the new matches on every run. No Reddit login, API key or AI. Export clean JSON, CSV or Excel.

Configure keywords → schedule the Actor → receive only new matches.

What it does

  • Searches all of Reddit or selected subreddits for your keywords and exact phrases, within a time window (past hour to all time) or since a date.
  • Checks posts and comments, including comments that mention your keyword under any post. A row is delivered only when your keyword actually appears in that post or comment — Reddit's search finds candidates, the Actor confirms the match.
  • Returns one row per post or comment, with matchedKeywords listing every keyword it matched. Found by three keywords or three searches? Still one row, one charge.
  • Noise filters: require words (any or all), exclude words, excluded authors, bot filtering.
  • Subreddit-only monitoring: no keywords, just the newest posts (and comments) of a community.
  • Only-new monitoring with a monitor key, and a baseline-only first run for professional setups: the first run records what exists today, later runs deliver only what is new.
  • Run summary: posts and comments scanned, unique matches, new matches delivered, already-seen suppressed, duplicates merged, authors filtered.

Quick start

Monitor two keywords across Reddit:

{
"keywords": ["openai", "chatgpt"],
"sourceTypes": "BOTH",
"sort": "NEW",
"timeRange": "WEEK",
"maxResults": 100
}

Restrict to subreddits:

{
"keywords": ["web scraping"],
"subreddits": ["webscraping", "dataengineering"],
"sourceTypes": "BOTH",
"sort": "NEW",
"timeRange": "MONTH"
}

Filter the noise out of an ambiguous keyword:

{
"keywords": ["apple"],
"subreddits": ["technology"],
"requireWords": ["iphone", "mac", "ios"],
"requireMode": "ANY",
"excludeWords": ["fruit", "recipe"]
}

Scheduled monitoring — run it daily and get only what is new:

{
"keywords": ["Claude Code", "Cursor"],
"subreddits": ["programming", "LocalLLaMA"],
"sourceTypes": "BOTH",
"sort": "NEW",
"maxAgeHours": 24,
"onlyNew": true,
"monitorKey": "coding-ai-tools"
}

Start a monitor from a clean baseline (the first run returns nothing and is not charged):

{
"keywords": ["example topic"],
"onlyNew": true,
"monitorKey": "example-topic-monitor",
"baselineMode": "BASELINE_ONLY"
}

FAQ

What can I monitor?

Any keyword, phrase or topic: product and company names, technologies, regulations, launches, feature requests, error messages, events. Up to 100 keywords per run, across all of Reddit or a list of subreddits.

Do I need a Reddit login or API key?

No. The Actor reads public Reddit content only. No login, no API key, no cookies.

Can I search all of Reddit?

Yes — leave subreddits empty. Each keyword is one search across Reddit.

Can I restrict to subreddits?

Yes. webscraping, r/webscraping and https://www.reddit.com/r/webscraping/ all work. Each keyword is then searched in each listed subreddit.

Are comments supported?

Yes. With sourceTypes COMMENTS or BOTH, every keyword is also searched among Reddit's comments (across all of Reddit or in your subreddits), so a comment that mentions your keyword is found under any post, not only under posts that mention it. Each comment is matched on its own full text and carries its parent post's title and URL in parentPost.

In subreddit-only monitoring (no keywords) there is nothing to search comments for, so the top comments of each new post's thread are read instead (up to maxCommentsPerPost, replies included).

Can I monitor subreddit feeds without keywords?

Yes. Leave keywords empty and list subreddits: every new post in the time window (and, with BOTH or COMMENTS, its comments) is delivered. Your require/exclude words and author filters still apply.

How do exact phrases work?

Put a phrase in quotes: "customer service" matches those words in that order. Without quotes, pricing issue matches when both words appear, in any order — the way Reddit's own search reads it. A single word matches as a whole word with an optional plural (CRM matches "CRMs", not "CRMify"). The keyword is reported in matchedKeywords exactly as you typed it, quotes included.

How does only-new monitoring work?

Turn on onlyNew and give a monitorKey (for example coding-ai-tools). The Actor remembers every post and comment it delivers under that key — its first-seen time, last-seen time and matched keywords — and skips them on later runs. Runs with the same key share the memory; different keys are independent. If you leave monitorKey empty, one is derived from your keywords and subreddits. A match that was cut by maxResults or your spending limit is not remembered, so the next run can still deliver it. An item already delivered is not delivered again even if it later matches another keyword.

Once a run of a monitor has read all its searches and delivered everything it found, the next run with the same settings stops each newest-first search at the first page of matches it already delivered, so scheduled runs only read what is new. Change the keywords, subreddits, filters or time window, or let a run be cut by maxResults or your spending limit, and the next run reads its whole window again.

What is baseline-only mode?

With onlyNew on and baselineMode BASELINE_ONLY, the first run of a monitor records every current match and delivers none (and is not charged). From the second run on you receive only what appeared after you started monitoring:

Run 1: discover 800 matches, store them, deliver 0
Run 2: discover 815 matches, deliver only the 15 new ones

How are duplicate keyword matches handled?

One post or comment is one row, whatever found it. If a post matches openai, chatgpt and ai tools, you get one row with "matchedKeywords": ["openai", "chatgpt", "ai tools"] and one charge. The same goes for a post found by a global search, a subreddit search and a feed.

Can I require or exclude words?

Yes. requireWords keeps an item only if it also contains one of them (requireMode ANY) or all of them (ALL). excludeWords drops any item containing one of them.

Can I exclude bots or specific authors?

Yes. skipBots (on by default) drops AutoModerator and other well-known bot accounts, and text that says it was posted automatically. It is deliberately conservative: a username is not treated as a bot just because it contains "bot". excludeAuthors drops any usernames you list.

Why may scores, comment counts or text be null?

Different public Reddit sources expose different fields. When a value is not available it is null — never a made-up zero. A hidden score is null. When a post's body cannot be read, text is null, textAvailable is false, and the match was confirmed by Reddit's search rather than in the body (matchBasis: "reddit-search"); require/exclude words are then checked against the title.

Are search results exhaustive?

No. Reddit's search returns at most roughly 250 results per keyword, sort and time window, and only public, non-deleted content. This Actor is built for repeated scheduled monitoring, not for exhaustive historical coverage. To go deeper, narrow the time window or add subreddits.

How often should I schedule it?

Use an Apify schedule:

CadenceGood forSuggested settings
HourlyFast-moving alertsmaxAgeHours: 2, onlyNew: true
DailyNormal monitoringmaxAgeHours: 24 or timeRange: DAY, onlyNew: true
WeeklyResearchtimeRange: WEEK, onlyNew: true

A small overlap between the window and the schedule is fine — only-new monitoring removes repeats.

How does pricing work?

Pay per result: you are charged once per unique post or comment delivered. Search requests, retries, non-matches, duplicates, filtered items, items already delivered to your monitor, a baseline-only first run, results beyond maxResults and failed searches are never charged. Results are delivered newest first, so a spending limit keeps the freshest matches. See the Pricing tab for the current rate — this README deliberately does not quote figures.

Can I use the API / MCP?

Yes. Run it like any Apify Actor through the API, the JavaScript/Python clients, integrations (Make, Zapier, n8n, webhooks for alerts) or Apify's MCP server, and read the dataset views below.

Input reference

FieldDefaultDescription
keywords["web scraping"]Up to 100. "quoted" = exact phrase. Empty + subreddits = subreddit-only monitoring
subreddits[]Names, r/name or URLs. Empty = all of Reddit
sourceTypesBOTHPOSTS, COMMENTS, BOTH
sortNEWNEW, RELEVANCE, TOP, COMMENTS, HOT
timeRangeWEEKHOUR, DAY, WEEK, MONTH, YEAR, ALL
postedAfter—ISO date or date-time, e.g. 2026-10-14T00:00:00Z. Wins over maxAgeHours and timeRange
maxAgeHours—e.g. 6, 24, 72. Wins over timeRange
maxResults1001–10,000 delivered unique results per run, newest first
maxCommentsPerPost501–100 comments read per thread in subreddit-only monitoring
onlyNewfalseSkip what earlier runs of the same monitor delivered
monitorKey—Name of the monitor's memory. Alone (without onlyNew) it marks rows isNew without skipping
baselineModeRETURN_CURRENTBASELINE_ONLY: first run records, delivers nothing
requireWords / requireMode[] / ANYAlso require these words (ANY / ALL)
excludeWords[]Drop items containing these
excludeAuthors[]Usernames to ignore
skipBotstrueDrop well-known bots
maxConcurrency31–5 searches/threads at once
proxyConfigurationApify DatacenterSee the proxy policy below

An empty run (no keywords and no subreddits), an unparseable postedAfter, a non-positive limit or an unknown option value stops the run with a clear message. One invalid keyword or subreddit does not: it is skipped and reported in SOURCE_SUMMARY.

Output

Every tab below shows every row: Apify dataset views choose columns, not rows, so the Post columns tab also lists comments (with an empty title) and the Comment columns tab also lists posts. Filter on sourceType (POST / COMMENT) in your export or integration to split them.

Reddit Keyword Monitor — Post columns view, table (one row per match with subreddit, body, author, score, matched keywords, match basis, found by and first seen)

All matches tab

Posts and comments together, newest first. A post from a one-off run (no monitor, so isNew and firstSeenAt are null):

{
"sourceType": "POST",
"subreddit": "mcp",
"title": "I built an MCP server for stealthy browser automation. This week it ranked #1 in Glama...",
"text": "The MCP server I created: https://glama.ai/mcp/servers/seleniumbase/SeleniumBase is #1 this week for browser automation (https://glama.ai/mcp/best/browser-automation). It lets you automate browsers and do web-scraping while bypassing bot-detection. It includes a tool for handling CAPTCHAs.\n\nThe SeleniumBase MCP server files are located at https://github.com/seleniumbase/SeleniumBase/tree/master/mcp\\_servers, with the main GitHub page at https://github.com/seleniumbase/SeleniumBase.\n\nI also created a YouTube video about it: https://www.youtube.com/watch?v=wQI3hUO9qmA",
"author.username": "example_user",
"publishedAt": "2026-10-16T00:02:07.959Z",
"score": 13,
"commentsCount": 4,
"matchedKeywords": [
"web scraping"
],
"isNew": null,
"url": "https://www.reddit.com/r/mcp/comments/1x71lfp/i_built_an_mcp_server_for_stealthy_browser/",
"parentPost.title": null,
"firstSeenAt": null
}

Post columns tab

The same post with the post columns — its body was read and the keyword confirmed in it (matchBasis: "text"):

{
"id": "t3_1x71lfp",
"subreddit": "mcp",
"title": "I built an MCP server for stealthy browser automation. This week it ranked #1 in Glama...",
"text": "The MCP server I created: https://glama.ai/mcp/servers/seleniumbase/SeleniumBase is #1 this week for browser automation (https://glama.ai/mcp/best/browser-automation). It lets you automate browsers and do web-scraping while bypassing bot-detection. It includes a tool for handling CAPTCHAs.\n\nThe SeleniumBase MCP server files are located at https://github.com/seleniumbase/SeleniumBase/tree/master/mcp\\_servers, with the main GitHub page at https://github.com/seleniumbase/SeleniumBase.\n\nI also created a YouTube video about it: https://www.youtube.com/watch?v=wQI3hUO9qmA",
"textAvailable": true,
"author.username": "example_user",
"publishedAt": "2026-10-16T00:02:07.959Z",
"score": 13,
"commentsCount": 4,
"flair": null,
"matchedKeywords": [
"web scraping"
],
"matchBasis": "text",
"foundBy": [
"web scraping"
],
"isNew": null,
"firstSeenAt": null,
"url": "https://www.reddit.com/r/mcp/comments/1x71lfp/i_built_an_mcp_server_for_stealthy_browser/"
}

Comment columns tab

A comment from a scheduled monitor run, found by comment search under a post that does not name the keyword. Comment search does not say whether a top-level comment's parent is the post, so parentId is null here:

{
"id": "t1_pgxb0ju",
"subreddit": "LocalLLaMA",
"text": "as a researcher who runs dozens of experiments a week: naming files, folders, functions, etc. I'm fairly confident Claude code does a better job organizing my files than i ever did",
"author.username": "another_user",
"isSubmitter": null,
"publishedAt": "2026-10-15T16:06:00.012Z",
"score": 5,
"matchedKeywords": [
"Claude Code"
],
"parentPost.title": "What’s the dumbest thing you trust your LLM with, but not yourself?",
"parentPost.url": "https://www.reddit.com/r/LocalLLaMA/comments/1x6o34h/whats_the_dumbest_thing_you_trust_your_llm_with/",
"parentId": null,
"isNew": true,
"firstSeenAt": "2026-10-16T19:21:02.503Z",
"url": "https://www.reddit.com/r/LocalLLaMA/comments/1x6o34h/whats_the_dumbest_thing_you_trust_your_llm_with/pgxb0ju/"
}

All fields

Every field of a row — here a reply (parentId is the comment it answers):

{
"rowType": "reddit_match",
"sourceType": "COMMENT",
"id": "t1_pgqn6fg",
"postId": "1x5uwnd",
"commentId": "pgqn6fg",
"parentId": "t1_pgqmvdo",
"subreddit": "LocalLLaMA",
"title": null,
"text": "ohh... my pc has 32gbram and 8gb vram and i want to use for agentic coding OR using as sub-agent for Claude code, i hope i can find a good model fitting my pc.",
"textAvailable": true,
"author": {
"username": "third_user",
"profileUrl": "https://www.reddit.com/user/third_user/"
},
"url": "https://www.reddit.com/r/LocalLLaMA/comments/1x5uwnd/a_35b_multimodal_model_running_on_a_phone_with/pgqn6fg/",
"parentPost": {
"id": "t3_1x5uwnd",
"title": "A 35B multimodal model running on a phone with ~3GB memory? MiniCPM-V 4.7 demo is pretty wild",
"url": "https://www.reddit.com/r/LocalLLaMA/comments/1x5uwnd/a_35b_multimodal_model_running_on_a_phone_with/",
"author": null
},
"publishedAt": "2026-10-14T18:19:46.904Z",
"editedAt": null,
"score": 2,
"commentsCount": null,
"flair": null,
"isNsfw": false,
"isSubmitter": null,
"matchedKeywords": [
"Claude Code"
],
"matchBasis": "text",
"foundBy": [
"comments: Claude Code in r/LocalLLaMA"
],
"isNew": true,
"firstSeenAt": "2026-10-16T19:21:02.503Z",
"scrapedAt": "2026-10-16T19:21:02.505Z",
"capturedSequence": 11
}

Usernames in these samples are anonymised.

FieldMeaning
sourceTypePOST or COMMENT
idReddit fullname (t3_… post, t1_… comment) — the dedupe key together with sourceType
parentIdFor a comment: the comment it replies to (t1_…) or the post (t3_…); null when Reddit's comment search does not say
text, textAvailableBody text; textAvailable: false when the post body could not be read
matchedKeywordsEvery keyword the item matched, as you typed it
matchBasistext (found in the item's text), reddit-search (title-only post, matched by Reddit's search), subreddit-feed (no keywords)
foundByWhich searches found it (comments: … = comment search)
isNew, firstSeenAtMonitoring state; null when no monitor is used
parentPostFor a comment: the post's ID, title, URL and author (author is null when the comment came from comment search alone)

Dataset views and run records

View / recordWhat it shows
All matchesEvery match, newest first, with the columns common to posts and comments
Post columnsEvery match, with the post columns (body, flair, comment count, match basis, found by)
Comment columnsEvery match, with the comment columns (parent post, parent ID, poster flag)
RUN_SUMMARYKeywords, subreddits, search operations, posts and comments scanned, unique matches, new matches delivered, already-seen suppressed, duplicates merged, authors and bots filtered, drops by reason
SOURCE_SUMMARYEach search's status: SUCCESS, NO_RESULTS, INVALID_KEYWORD, INVALID_SUBREDDIT, SUBREDDIT_NOT_FOUND, RATE_LIMITED, BLOCKED, PARTIAL_RESULT, TEMPORARY_REDDIT_ERROR, PROVIDER_ERROR

One failed keyword or subreddit search never fails the run; it is reported there.

Limitations

  • Search depth is bounded. Reddit's search returns roughly 250 results per query, sort and time window. Repeated scheduling is the intended monitoring model.
  • Comment search depth is bounded too, like post search, and only comments Reddit's search indexes are found. In subreddit-only monitoring, thread reading is capped per thread (the comments Reddit ranks first are read). Scheduling with only-new monitoring is how a monitor stays complete over time.
  • Comment search does not say whether a top-level comment's parent is the post, or whether its author wrote the post: parentId and isSubmitter are then null, and parentPost.author is null unless the post was also found (a reply's parent comment is given). Comments read from a thread in subreddit-only monitoring carry all three.
  • Matching is literal, not topical: a post that mentions your keyword in passing matches; a post about your topic that never uses the keyword does not. Use several keywords and require/exclude words to tune it.
  • Deleted, removed and private content is unavailable, and public content may later be edited or deleted.
  • Long runs stop early to deliver. Shortly before the run's timeout, collecting stops and the matches found so far are delivered (the status message says so). Results are delivered at the end of a run, so aborting a run part-way can leave it with none.

🚦 Proxy policy

Use Apify Datacenter proxy (the default) or no proxy — both work for Reddit search and comment pages at this Actor's conservative request rate.

Apify Residential proxy is not supported. The Actor fails at startup if apifyProxyGroups includes RESIDENTIAL. Reason: on pay-per-result Actors residential bandwidth is billed to the developer, not the run, and Reddit comment pages are large, while Reddit serves the same pages to datacenter addresses.

If you genuinely need residential routing, supply your own provider through the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

Responsible use

This is an unofficial tool and is not affiliated with Reddit. It processes public posts and comments only.

  • Search coverage is bounded by Reddit's own search behaviour.
  • Follow each subreddit's rules and Reddit's terms. Public content may later be deleted or edited.
  • You are responsible for lawful downstream processing of the data.

The Actor never reads private messages, never asks for account credentials, never votes, replies or sends messages, and never infers sensitive attributes about people.

Changelog

  • 1.0 — first release: keywords and exact phrases across Reddit or subreddits, subreddit-only monitoring, posts and comments, local keyword validation with matched-keyword attribution, require/exclude words, excluded authors, bot filtering, postedAfter / maxAgeHours, only-new monitoring with a monitor key, baseline-only first run.