Reddit monitoring: how to track keywords with an API
Reddit monitoring with an API: poll post and comment search for your keywords, dedupe by id, send matches to Slack, and cost the schedule with real prices.
Piyushh · October 14, 2026 · 6 min read
Reddit monitoring means checking Reddit on a schedule for new posts and comments that mention your keywords, then sending the matches somewhere you'll see them. Without code, you can use Reddit Pro, F5Bot, Syften or KWatch.io. With code, it's a polling loop: search posts and comments sorted by new, skip ids you've already seen, and post the rest to Slack. This guide builds that loop on ChatterAPI and works out what it costs to run.
Reddit's search RSS feeds stop on November 13, 2026, so if you relied on them, you'll need a replacement. Our post on Reddit RSS feeds ending covers subreddit feeds. This one covers keywords across all of Reddit.
Reddit monitoring options before you write code
Reddit has its own free option. Reddit Pro describes itself as "all for free" and lets businesses track "keywords and phrases like your business, products, competitors, and more" (checked Oct 14, 2026). In an r/AskMarketing thread on tracking Reddit keywords, one user said "Reddit Pro has been the least noisy for me." It runs inside Reddit's own business dashboard, though, so the matches stay there rather than in your own code.
The common third-party Reddit monitoring tools, as listed on Oct 14, 2026:
- F5Bot is free and emails you matches from Reddit, Hacker News and Lobsters. Gold ($49.99/mo) adds Slack and Discord webhooks.
- Syften lists a target delay under a minute for Reddit. Slack comes with its $49.95 Standard plan, and webhooks with PRO.
- KWatch.io has a free plan with two Reddit keyword alerts.
Our best social listening tools list compares more of them, including ones that also cover X. The rest of this post covers getting the raw matches into your own code, so you can score them with an LLM, store them, or feed them to an agent.
Why comments matter as much as posts
Most mentions of a product on Reddit aren't in post titles. They're in replies like "we switched to X last year" or "has anyone tried Y", and a monitor that only searches posts never sees them. A commenter in r/SaaS said the same about a cheap RSS setup: it works, "but you'll miss comments" (comment).
The script below runs two searches per keyword, one for posts and one for comments, and dedupes both on the same field.
Reddit keyword alerts with an API
Search posts
GET /v1/reddit/search searches posts across all of Reddit or inside one subreddit. Reddit operators work inside q: "exact phrase", OR, NOT and author:name. For monitoring, use sort=new with a short time window. A page holds up to 25 posts and costs 2 credits.
curl -s "https://api.chatterapi.com/v1/reddit/search?q=%22best+crm%22&sort=new&time=day" \
-H "Authorization: Bearer $CHATTERAPI_KEY"
Below is a real response, trimmed to one post. It's a sample. We ran it with a test key, which returns one recorded real response per endpoint no matter the input, so charged is 0. A live key charges 2 credits.
{
"data": [
{
"id": "1wdihhj",
"fullname": "t3_1wdihhj",
"title": "What CRM should a small business use?",
"body": "We’re a small B2B business with 6 people and sales is still pretty founder led…",
"author": "NotedWhisky",
"subreddit": "CRM",
"url": "https://www.reddit.com/r/CRM/comments/1wdihhj/what_crm_should_a_small_business_use/",
"score": 51,
"numComments": 186,
"createdAt": "2026-09-11T14:52:16.000Z",
"nsfw": false
}
],
"page": { "nextCursor": "AX-vad045wfn…", "hasMore": true },
"credits": { "charged": 0, "remaining": 719 },
"requestId": "req_01M4X1HCTD5QTBVTF690",
"cached": true
}
Dedupe on fullname (t3_ for posts, t1_ for comments); the docs call it out for this purpose. They also say the endpoint returns the "newest data within minutes." Repeat calls with the same input within 10 minutes come from cache but cost the same as fresh ones, so polling a keyword more often than every 10 minutes gains you nothing.
Search comments
GET /v1/reddit/comments/search does the same for comments, also at 2 credits a page. It has no time filter, so use sort=new and stop paging when you hit comments you've already seen. Each result carries the parent post's title, so you can judge context without opening the thread.
{
"id": "nouhnb2",
"fullname": "t1_nouhnb2",
"postTitle": "Please make a free version of gummysearch and instead make money through ads.",
"author": "Strong_Teaching8548",
"body": "I made this one and you can try it our free :) It's an AI agent connected to reddit, quora, bhw and more forums & social media soon!!",
"score": 1,
"subreddit": "SomebodyMakeThis",
"url": "https://www.reddit.com/r/SomebodyMakeThis/comments/1dm74nv/please_make_a_free_version_of_gummysearch_and/nouhnb2/",
"createdAt": "2025-11-14T18:05:19.000Z"
}
That item comes from the comment search test response, which is an older recording. Live results with sort=new come back newest first.
The polling script
For each keyword the script runs both searches, stores the fullnames it has seen in a JSON file, and posts new matches to a Slack incoming webhook. When every item on a page is new, it follows page.nextCursor for up to three pages, so a burst of posts between runs doesn't get lost.
import json, os, pathlib, requests
API = "https://api.chatterapi.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CHATTERAPI_KEY']}"}
KEYWORDS = ['"yourbrand"', '"alternative to competitor"', '"looking for" "crm"']
WEBHOOK = os.environ.get("SLACK_WEBHOOK_URL")
STATE = pathlib.Path("reddit_seen.json")
MAX_PAGES = 3 # 2 credits per page
seen = dict.fromkeys(json.loads(STATE.read_text())) if STATE.exists() else {} # keeps insertion order
first_run = not seen
def fetch_new(path, params):
"""Newest-first pages until one contains something we've already seen."""
fresh, cursor = [], None
for _ in range(MAX_PAGES):
r = requests.get(f"{API}/{path}", params={**params, **({"cursor": cursor} if cursor else {})},
headers=HEADERS, timeout=30)
if r.status_code != 200:
print(f"{path} {params['q']}: HTTP {r.status_code}") # failed calls cost 0 credits
break
body = r.json()
page_new = [i for i in body["data"] if i["fullname"] not in seen]
fresh += page_new
if len(page_new) < len(body["data"]) or not body["page"]["hasMore"] or first_run:
break
cursor = body["page"]["nextCursor"]
return fresh
hits = []
for kw in KEYWORDS:
posts = fetch_new("reddit/search", {"q": kw, "sort": "new", "time": "day"})
comments = fetch_new("reddit/comments/search", {"q": kw, "sort": "new"})
for item in posts + comments:
seen[item["fullname"]] = None
text = item.get("title") or item.get("body", "")
hits.append(f"{kw} in r/{item.get('subreddit')}: {text[:200]}\n{item['url']}")
if hits and not first_run: # the first run only records what's already there
message = "\n\n".join(hits)
if WEBHOOK:
requests.post(WEBHOOK, json={"text": message}, timeout=10)
else:
print(message)
STATE.write_text(json.dumps(list(seen)[-20000:]))
print(f"{len(hits)} new matches")
We ran it against the API before publishing. The first run records what's already there and sends nothing, which keeps Slack from filling up with a day of old posts. After that, each run sends only fullnames it hasn't seen. Schedule it with cron:
*/30 * * * * cd /opt/reddit-watch && CHATTERAPI_KEY=... SLACK_WEBHOOK_URL=... python3 reddit_watch.py >> watch.log 2>&1
To see what a keyword returns before you write any code, try the free Reddit monitoring page. It runs a one-time check of the last day across Reddit posts, comments and X.
Cutting noise out of Reddit monitoring
The main objection to doing this yourself is that keyword matching on Reddit is noisy, and a script makes it easy to drown in matches. In the r/AskMarketing thread, the founder of Octolens, who scores matches with an LLM, wrote that "about 70% of the Reddit posts matching our customer keyword in our system still get scored irrelevant after considering filters." That's one team's experience rather than a measured rate, but it matches what most people find in their first week.
The fixes people in that thread describe are simple, and they fit in the script:
- Whitelist subreddits. One commenter whitelists "specific subs first, then use boolean queries with negative keywords." Pass
subreddit=on the post search for the communities that matter. - Exclude words with
"acme" NOT hiring NOT giveawayinq. - Search for intent as well as names.
"alternative to acme"or"looking for" "crm"return fewer, better matches thanacmealone. - Set thresholds. The same commenter suggests that "If you're using scripts or API, add thresholds like minimum upvotes or comment count so you're not alerted on dead threads." Filter on
scoreandnumCommentsbefore sending. - Score each match with a model. Send it to an LLM with a one-line description of what counts, and forward only the yes answers.
If you're monitoring to find people to talk to, read each subreddit's rules first and reply by hand. If you'd rather hand that part off, some teams do done-for-you Reddit marketing.
What Reddit monitoring costs per month
Each keyword costs 4 credits per check: 2 for the posts page and 2 for the comments page. Extra pages cost more only when a lot of new results arrive between checks. For five keywords over a 30-day month:
| Check every | Checks per keyword per month | Credits for 5 keywords | Plan that fits |
|---|---|---|---|
| 15 minutes | 2,880 | 57,600 | Growth ($49/mo, 70,000) |
| 30 minutes | 1,440 | 28,800 | Growth ($49/mo, 70,000) |
| 1 hour | 720 | 14,400 | Starter ($19/mo, 25,000) |
| 4 hours | 180 | 3,600 | Starter ($19/mo, 25,000) |
Thirty-minute checks on five keywords land just above Starter. With four keywords the total is 23,040, which fits. Most teams don't need every keyword checked at the same speed. Check the brand name every 15 minutes and broad category phrases every few hours. Failed calls cost 0 credits. Plan details are on the pricing page.
If you want to watch X the same way, our guide to Twitter keyword alerts adapts the script to tweet search. To track a brand name across Reddit posts, comments and X in a single call, see the brand mention monitor guide.
Start monitoring Reddit
ChatterAPI gives your code and your agents Reddit and X data through one key, over REST or MCP, and you don't apply for a developer account. Sign up with Google for 100 free credits with no card. That covers 25 keyword checks, which is enough to tune your queries before you put them on a schedule. Plans start at $19/month for 25,000 credits. ChatterAPI is independent of Reddit, and its Reddit endpoints are read-only.