Skip to content

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 giveaway in q.
  • Search for intent as well as names. "alternative to acme" or "looking for" "crm" return fewer, better matches than acme alone.
  • 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 score and numComments before 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 everyChecks per keyword per monthCredits for 5 keywordsPlan that fits
15 minutes2,88057,600Growth ($49/mo, 70,000)
30 minutes1,44028,800Growth ($49/mo, 70,000)
1 hour72014,400Starter ($19/mo, 25,000)
4 hours1803,600Starter ($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.

FAQ

Does Reddit have keyword alerts?
Reddit Pro, Reddit's free tool for businesses, lets you track keywords and phrases such as your brand, products and competitors. For alerts delivered to Slack, email or your own code, use a tool like F5Bot or Syften, or poll a Reddit search API.
How fresh are new Reddit posts in search results?
ChatterAPI's Reddit post search returns the newest data within minutes when you sort by new. Repeat calls with the same input within 10 minutes are served from cache, so a 10 to 15 minute polling interval is as fresh as polling gets.
What are the best Reddit monitoring tools?
For free email alerts, F5Bot. For filters and Slack, Syften, which lists a target delay under a minute for Reddit. KWatch.io has a free plan with two Reddit alerts. Reddit Pro is free from Reddit. Developers can poll a Reddit search API and keep the data in their own systems.
How much does it cost to monitor Reddit with an API?
With ChatterAPI, each keyword costs 4 credits per check (2 for posts, 2 for comments). Five keywords checked hourly come to 14,400 credits a month, which fits the $19 Starter plan with 25,000 credits.

More from the blog

Make your first call on 100 free credits.

Sign up with Google, no card. One key for Reddit and X, over REST or MCP.